web-dev-qa-db-fra.com

Post Admin - Filtrer par posts sans les tags

Je suis coincé sur celui-ci et c'est probablement une réponse très simple, mais quelqu'un peut-il éclairer un peu la manière d'ajouter un menu de filtrage avec la valeur d'option "Pas de balises" qui, en cliquant sur le bouton Filtrer, ne montrera que les publications sans balises associé avec eux? Merci d'avance!

3
Jesse Robbins

La première partie consiste à ajouter une liste déroulante à l'aide du filtre restrict_manage_posts , et la seconde consiste à obtenir réellement des publications sans balises en utilisant pre_get_posts filtre:

function wpse147471_add_no_tags_filter() {
    if ( 'post' !== get_current_screen()->post_type ) {
        return;
    }

    $selected = ( isset( $_GET['tag-filter'] ) && 'no-tags' === $_GET['tag-filter'] );
    ?>
    <select name="tag-filter">
        <option value="">&mdash; Select &mdash;</option>
        <option value="no-tags" <?php echo selected( $selected ); ?>>No Tags</option>
    </select>
    <?php
}
add_action( 'restrict_manage_posts', 'wpse147471_add_no_tags_filter' );

function wpse147471_get_posts_with_no_tags( $query ) {
    if ( ! is_admin() || ! $query->is_main_query() ) {
        return;
    }

    if ( ! isset( $_GET['tag-filter'] ) || 'no-tags' !== $_GET['tag-filter'] ) {
        return;
    }

    $tag_ids = get_terms( 'post_tag', array( 'fields' => 'ids' ) );

    $query->set( 'tax_query', array(
        array(
            'taxonomy' => 'post_tag',
            'field'    => 'id',
            'terms'    => $tag_ids,
            'operator' => 'NOT IN'
        )
    ) );
}
add_action( 'pre_get_posts', 'wpse147471_get_posts_with_no_tags' );

Il semble qu'il n'y ait pas de moyen plus efficace d'obtenir toutes les publications sans balises via WP_Query que d'utiliser une requête de taxonomie 'NOT IN' avec tous les ID de balises existants, mais au moins, cela fonctionne.

1
SergeyBiryukov