it-swarm.com.de

Also verbergen Sie CPT-Dateien programmgesteuert aus der Medienbibliothek

Wir haben ein CPT erstellt, mit dem unser Kunde Dateien von der Admin-Seite in einen Ordner außerhalb des Ordners wp-content/uploads hochladen kann. Dateien werden mit wp_handle_upload und wp_insert_attachment hochgeladen und bearbeitet.

Wie verhindern wir, dass diese Dateien in der Medienbibliothek angezeigt werden? Können wir nach Beitragstyp filtern?

Vielen Dank im Voraus für jede Hilfe!

UPDATE: Hier ist der Code, den wir bisher implementiert haben. Neue Uploads werden immer noch nicht in der Medienbibliothek angezeigt.

/*FORCE LIST VIEW IN MEDIA LIBRARY*/
add_action('admin_init', function() {
    $_GET['mode'] = 'list';
}, 100);

/*HIDE GRID BUTTON IN MEDIA LIBRARY*/
add_action('admin_head', function() {
    $css = '<style type="text/css">
        .view-switch .view-grid {
            display: none;
        }
    <style>';
    echo $css;
});

/*REGISTER CUSTOM TAXONOMY*/
function create_hidden_taxonomy() {
    register_taxonomy(
        'hidden_taxonomy',
        'attachment',
        array(
            'label' => __( 'Hidden Taxonomy' ),
            'public' => false,
            'rewrite' => false,
            'hierarchical' => false,
        )
    );
}
add_action( 'init', 'create_hidden_taxonomy' );

/*CHECK IF PARENT POST TYPE IS ASSET. IF NOT ADD 'show_in_media_library' TERM*/
function assets_add_term( $post_id, \WP_Post $p, $update ) {

    if ( 'attachment' !== $p->post_type ) {
        error_log("fail1");            
        return;
    }
    if ( wp_is_post_revision( $post_id ) ) {
        error_log("fail2");            
        return;
    }
    if ( $post->post_parent ) {
        $excluded_types = array( 'assets' );
        if ( in_array( get_post_type( $p->post_parent ), $excluded_types ) ) {
        error_log("fail3");                
        return;
        }
    }
    $result = wp_set_object_terms( $post_id, 'show_in_media_library', 'hidden_taxonomy', false );
    if ( !is_array( $result ) || is_wp_error( $result ) ) {
        error_log("fail4");
    }else{
        error_log("it worked!");
    }
}
add_action( 'save_post', 'assets_add_term', 10, 2 );

/*HIDE MEDIA WITH CPT ASSETS FROM MEDIA LIBRARY*/
function assets_load_media() {
   add_action('pre_get_posts','assets_hide_media',10,1);
}
add_action( 'load-upload.php' , 'assets_load_media' );

function assets_hide_media($query){
    global $pagenow;

// there is no need to check for update.php as we are already hooking to it, but anyway
    if( 'upload.php' != $pagenow  || !is_admin())
        return;

    if(is_main_query()){
        $excluded_cpt_ids = get_posts('post_type=assets&posts_per_page=-1&fields=ids');
        $query->set('post_parent__not_in', $excluded_cpt_ids);
        //$query->set('hidden_taxonomy', 'show_in_media_library' );
    }

    return $query;
}

/*HIDE MEDIA WITH CPT ASSETS FROM MEDIA LIBRARY MODAL*/
function assets_hide_media_modal( $query = array() ){
    $query['post_parent__not_in'] = $excluded_cpt_ids;
    return $query;
}
add_action('ajax_query_attachments_args','assets_hide_media_modal',10,1);
3
Richard Tinkler

Medienelemente sind wie Posts mitpost_type = attachmentundpost_status = inherit.

wenn wir uns auf der Seite upload.php befinden, haben wir zwei Ansichten:

  • Listenansicht
  • Rasteransicht

Die Rasteransicht wird über JavaScript ausgefüllt und die Listenansicht wird normal erweitertWP_List_Table.

Da es sich bei der Listenansicht um eine normale Post-Abfrage handelt, können wir die Abfrage mitpre_get_postsso ändern, dass die erforderlichen Medienelemente ausgeblendet werden.

Wie verhindern wir, dass diese Dateien in der Medienbibliothek angezeigt werden?
Können wir nach Posttyp filtern?

Wir können die Medienelemente nicht einfach nach post_type filtern, da die Medienelemente post_type attachment sind. Sie möchten Medienelemente nach ihrenpost_parent'sPost-IDs filtern.

add_action( 'load-upload.php' , 'wp_231165_load_media' );
function wp_231165_load_media() {
   add_action('pre_get_posts','wp_231165_hide_media',10,1);
}

function wp_231165_hide_media($query){
    global $pagenow;

// there is no need to check for update.php as we are already hooking to it, but anyway
    if( 'upload.php' != $pagenow  || !is_admin())
        return;

    if(is_main_query()){
        $excluded_cpt_ids = array();//find a way to get all cpt post ids
        $query->set('post_parent__not_in', $excluded_cpt_ids);
    }

    return $query;
}

Aktivieren Sie diese Frage , um die IDs eines bestimmten Beitragstyps abzurufen.

Wie @tomjnowell betonte, funktioniert es für die Listenansicht, aber es ist eine teure Abfrage.

Eine Sache, die Sie tun können, ist, dass Sie beim Hochladen einen Metawert hinzufügen und diesen Metawert abfragen

4
bravokeyl

Wenn Sie einen Anhang erstellen, gehen Sie wie folgt vor:

  • Wenn die übergeordnete ID für Anhänge für einen Beitrag mit einem ausgeschlossenen Beitragstyp bestimmt ist, tun Sie nichts
  • Wenn es nicht in der Liste der ausgeschlossenen Beitragstypen enthalten ist, weisen Sie ihm ein Tag in einer ausgeblendeten benutzerdefinierten Taxonomie zu

z.B.

function create_hidden_taxonomy() {
    register_taxonomy(
        'hidden_taxonomy',
        'attachment',
        array(
            'label' => __( 'Hidden Attachment Taxonomy' ),
            'public' => false, // it's hidden!
            'rewrite' => false,
            'hierarchical' => false,
        )
    );
}
add_action( 'init', 'create_hidden_taxonomy' );

function tomjn_add_term( $post_id, \WP_Post $p, $update ) {

    if ( 'attachment' !== $p->post_type ) {
        return;
    }
    if ( wp_is_post_revision( $post_id ) ) {
        return;
    }
    if ( $post->post_parent ) {
        $excluded_types = array( 'example_post_type', 'other_post_type' );
        if ( in_array( get_post_type( $p->post_parent ), $excluded_types ) ) {
            return;
        }
    }
    $result = wp_set_object_terms( $post_id, 'show_in_media_library', 'hidden_taxonomy', false );
    if ( !is_array( $result ) || is_wp_error( $result ) ) {
        wp_die( "Error setting up terms") ;
    }
}
add_action( 'save_post', 'tomjn_add_term', 10, 2 );

Nehmen Sie nun den Code in bravokeyls Antwort und suchen Sie anstelle von post_parent__not_in nach dem Tag in der verborgenen benutzerdefinierten Taxonomie:

add_action( 'pre_get_posts' , 'assets_hide_media' );
/**
 * Only show attachments tagged as show_in_media_library
 **/
function assets_hide_media( \WP_Query $query ){
    if ( !is_admin() ) {
        return;
    }
    global $pagenow;
    if ( 'upload.php' != $pagenow && 'media-upload.php' != $pagenow ) {
        return;
    }

    if ( $query->is_main_query() ) {
        $query->set('hidden_taxonomy', 'show_in_media_library' );
    }

    return $query;
}

Dies sollte eine signifikante Leistungssteigerung und Skalierung bieten, die besser ist als die Verwendung von post_parent__not_in und eine Taxonomie bietet, mit der Sie nach anderen Dingen filtern können

Damit haben Sie ein letztes Problem. Anhänge werden nur angezeigt, wenn sie diesen Begriff haben, aber was ist mit allen Anhängen, die Sie bereits hochgeladen haben? Wir müssen zurückgehen und diesen Begriff hinzufügen. Um dies zu tun, würden Sie einen Code wie diesen einmal ausführen:

$q = new WP_Query( array(
    'post_type' => 'attachment',
    'post_status' => 'any',
    'nopaging' => true,
) );

if ( $q->have_posts() ) {
    global $post;
    while ( $q->have_posts() ) {
        $q->the_post();

        $excluded_types = array( 'example_post_type', 'other_post_type' );
        if ( $post->post_parent ) {
            if ( in_array( get_post_type( $post->post_parent ), $excluded_types ) ) {
                echo "Skipping ".intval( $post_id )." ".esc_html( get_the_title() )."\n";
                continue;
            }
        }
        echo "Setting term for ".intval( $post_id )." ".esc_html( get_the_title() )."\n";
        $result = wp_set_object_terms( $post_id, 'show_in_media_library', 'hidden_taxonomy', false );
        if ( !is_array( $result ) || is_wp_error( $result ) ) {
            echo "Error setting up terms";
        }
    }
    wp_reset_postdata();
} else {
    echo "No attachments found!\n";
}

Ich würde empfehlen, diesen Befehl als WP CLI-Befehl auszuführen, insbesondere wenn Sie viele Anhänge haben, die verarbeitet werden müssen

4
Tom J Nowell
add_action( 'ajax_query_attachments_args' , 'custom_ajax_query_attachments_args' );

function custom_ajax_query_attachments_args( $query ) {

    if( $query['post_type'] != 'attachment' ) {

        return $query;

    }


    $posts = get_posts([
      'post_type' => 'YOUR_CUSTOM_POST_TYPE',
      'post_status' => 'publish',
      'numberposts' => -1
    ]);

    foreach($posts as $post){

        $excluded_cpt_ids[] = $post->ID;
    }  

    $query['post_parent__not_in'] = $excluded_cpt_ids;

    return $query;

}
0
EndyVelvet