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
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.
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