Na stronie archiwum autora chcę pokazać każdą taksonomię (w mojej kategorii produktu), w którym autor ma posty (w moim przypadku produkty WooCommerce).

Aby to zrobić, używam następującego kodu:

$posts = get_posts( array('post_type' => 'product', 'posts_per_page' => -1, 'author' => $author_id) );
$author_categories = array();
//loop over the posts and collect the terms
foreach ($posts as $p) {
    $author_categories = wp_get_object_terms( $p->ID, 'product_cat');

    if ( ! empty( $author_categories ) && ! is_wp_error( $author_categories ) ){
        echo '<div class="d-flex flex-wrap">';
            foreach ($author_categories as $author_category) {
                //var_dump($t);
                $author_category_link   = get_term_link( $author_category );
                $author_category_name   = $author_categories[] = $author_category->name;

                echo '<a href="'.esc_url( $author_category_link ).'" class="p-2 p-lg-5 bg-light text-center">';
                echo $author_category_name;
                echo '</a>';
            }
        echo '</div>';
    }
}
wp_reset_postdata();

Problem polega na tym, że kategoria produktu pojawia się wiele razy. Myślę, że dla każdego postu w tej kategorii produktów.

Czy jest jakiś sposób, aby zebrać terminy i wyświetlać je tylko raz zamówione przez liczbę postów w kategorii produktu?

0
Cray 7 wrzesień 2020, 12:23

1 odpowiedź

Najlepsza odpowiedź

Najpierw należy zebrać wszystkie kategorie w tablicy kontenerowej. Korzystając z ID lub nazwy kategorii jako klawisza tablicy podczas dodawania kategorii do tablicy, eliminujesz duplikaty. Następnie po prostu pętlasz się nad wynikową tablicą, aby echo kategorie.

// First just collect the distinct categories.
$posts = get_posts( array('post_type' => 'product', 'posts_per_page' => -1, 'author' => $author_id) );
$all_author_categories = array();
foreach ($posts as $p) {
    $author_categories_for_p = wp_get_object_terms( $p->ID, 'product_cat');
    if ( ! empty( $author_categories_for_p ) && ! is_wp_error( $author_categories_for_p ) ){
        foreach ($author_categories_for_p as $author_category) {
            $all_author_categories[$author_category->name] = $author_category;  
        }
    }
}

// Then just loop over the collected categories and display them.
echo '<div class="d-flex flex-wrap">';
foreach($all_author_categories as $author_category) {
    $author_category_link   = get_term_link( $author_category );
    $author_category_name   = $author_categories[] = $author_category->name;

    echo '<a href="'.esc_url( $author_category_link ).'" class="p-2 p-lg-5 bg-light text-center">';
    echo $author_category_name;
    echo '</a>';
}
echo '</div>';

Uwagi:

  1. Ten kod nie jest dobrze skalowany, gdy masz dużo postów. Zamiast tego powinieneś użyć niestandardowego zapytania.
  2. Jestem prawie pewien, że na końcu nie jest potrzebny wp_reset_postdata();, ponieważ nie zmieniasz obiektu globalnego $post.
1
Cray 23 wrzesień 2020, 11:57