web-dev-qa-db-fra.com

wp_get_post_terms de cpt mais ne duplique pas s’ils sont utilisés plus d’une fois dans la boucle

J'ai un CPT 'media_blog' avec la taxonomie 'media_blog_category'. J'ai deux boucles sur la page qui correspondent à la pagination pour ce CPT. J'ai la première boucle juste des termes utilisés dans les messages. Plusieurs termes sont attribués à chaque poste. Je souhaite afficher la liste des termes utilisés sur les messages, mais pas les doublons contenant les mêmes termes.

C’est ce que j’ai jusqu’à présent et c’est très proche , il ne montre pas les doublons du même terme utilisé sur les posts,maisil ne montre pas non plus d’autres termes sur les posts qui avoir plus d'un terme. Je vais assez fou à ce stade:

if ( is_post_type_archive( 'media_blog' ) ) :

        global $post;
        global $wp_query;

        $args = array(
            'post_type'      => 'media_blog',
            'posts_per_page' => 16, // same as the pre_get_posts
            'post_status'    => 'publish',
            'paged'          => get_query_var( 'paged' ),
        );


    $wp_query = new WP_Query( $args );

    if ( have_posts() ) : 

        echo '<ul class="filter">';

            echo '<li class="current-menu-item"><a href="#" data-filter="*">' . __( 'All' ) . '</a></li>';

                $term_list = wp_get_post_terms( $post->ID, 'media_blog_category', array( 'fields' => 'all' ) );

                foreach( $term_list as $term ) :

                    $dupe = 0;

                    while ( have_posts() ) : the_post(); 

                    if ( $dupe == 0 ) :

                        echo '<li><a href="#" data-filter=".media_blog_category-' . $term->slug . '">' . $term->name . '</a></li>';

                        $dupe++;

                    endif; //dupe

                    endwhile;

                endforeach; //term_list


        echo '</ul>';

    endif; //WP_Query

    wp_reset_query();       

    endif; //media_blog
2
Christina

Corrigez la logique de vérification des doublons:

Votre logique de vérification des doublons est incorrecte. Vous deviez conserver les termes dans un tableau, puis vérifier si le terme existait déjà dans le tableau pour déterminer s'il s'agissait d'un doublon.

Ainsi, au lieu de la condition if ( $dupe == 0 ) : et de l’imbrication incorrecte de la boucle, ce sera comme suit:

if ( have_posts() ) : 
    echo '<ul class="filter">';
        echo '<li class="current-menu-item"><a href="#" data-filter="*">' . __( 'All' ) . '</a></li>';     
        $unique_terms = array(); // instead of $dupe = 0;
        while ( have_posts() ) : the_post();
            $term_list = wp_get_post_terms( $post->ID, 'media_blog_category', array( 'fields' => 'all' ) );
            foreach( $term_list as $term ) :
                if( ! in_array( $term->term_id, $unique_terms ) ):
                    array_Push( $unique_terms, $term->term_id );
                    echo '<li><a href="#" data-filter=".media_blog_category-' . $term->slug . '">' . $term->name . '</a></li>';
                endif;
            endforeach; //term_list
        endwhile;
    echo '</ul>';
endif; //WP_Query

Cela devrait fonctionner comme vous le souhaitiez.

Une meilleure solution:

Votre CODE fonctionnera après avoir corrigé la logique ci-dessus. Cependant, vous pouvez le rendre plus efficace avec le code suivant:

if ( is_post_type_archive( 'media_blog' ) ) :
    $args = array(
        'post_type'      => 'media_blog',
        'posts_per_page' => 16, // same as the pre_get_posts
        'post_status'    => 'publish',
        'paged'          => get_query_var( 'paged' ),
        'fields'         => 'ids' // for this specific case, all you need are the IDs
    );
    $wp_query = new WP_Query( $args );
    if ( have_posts() ) :
        echo '<ul class="filter">';
            echo '<li class="current-menu-item"><a href="#" data-filter="*">' . __( 'All' ) . '</a></li>';
                $term_list = wp_get_object_terms( $wp_query->get_posts(), 'media_blog_category' );
                foreach( $term_list as $term ) :
                    echo '<li><a href="#" data-filter=".media_blog_category-' . $term->slug . '">' . $term->name . '</a></li>';
                endforeach; //term_list
        echo '</ul>';
    endif; //WP_Query
    wp_reset_query();
endif; //media_blog
2
Fayaz