Ich habe ein CPT 'media_blog' mit der Taxonomie 'media_blog_category'. Ich habe zwei Schleifen auf der Seite, die der Paginierung für diese CPT entsprechen. Ich habe die erste Schleife nur der in den Beiträgen verwendeten Begriffe. Jedem Beitrag sind mehrere Begriffe zugeordnet. Ich möchte die Liste der in den Beiträgen verwendeten Begriffe anzeigen, aber keine Duplikate von Beiträgen mit denselben Begriffen anzeigen.
Dies ist, was ich bisher habe und es ist sehr nah , es zeigt keine Duplikate desselben Begriffs, der für die Posts verwendet wird,aberes zeigt auch keine anderen Begriffe für Posts an, die habe mehr als eine Amtszeit. Ich werde an dieser Stelle ziemlich verrückt:
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
Ihre doppelte Prüflogik ist falsch. Sie mussten die Begriffe in einem Array behalten und dann überprüfen, ob der Begriff bereits im Array vorhanden ist, um festzustellen, ob es sich um ein Duplikat handelt.
Anstelle von if ( $dupe == 0 ) :
condition und falschem Loop-Nesting sieht es also so aus:
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
Dies sollte so funktionieren, wie Sie es wollten.
Ihr CODE wird nach der Korrektur mit der obigen Logik funktionieren. Mit dem folgenden CODE können Sie es jedoch effizienter gestalten:
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