web-dev-qa-db-de.com

wp_get_post_terms von cpt, aber nicht dupliziert, wenn sie mehrmals in der Schleife verwendet werden

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
2
Christina

Korrigieren Sie die Duplikatprüflogik:

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.

Eine bessere Lösung:

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
2
Fayaz