Для каждого l oop отображается двойное отображение сообщения, когда сообщение имеет более одной категории - PullRequest
0 голосов
/ 20 января 2020

У меня есть следующий код:

<div class="documents-posts">
    <?php if (!empty($posts)) : ?>
        <?php foreach ($posts as $post) : ?>
            <?php set_query_var( 'taxonomy', $taxonomy ); ?>
            <?php get_template_part('document'); ?>
        <?php endforeach; ?>
    <?php endif; ?>
</div>

, который прекрасно работает, если у каждого сообщения есть только одна категория. Когда я назначаю вторую категорию посту, пост отображается дважды. Если я сделаю так, чтобы в нем было 3 категории, пост будет отображаться трижды ... Почему?

Обновление: Объявление переменной $ posts

$post_type = 'press-release';
$taxonomy = 'press-release-types';
$categories = $xxxxxx->get_categories($taxonomy);
$posts = $xxxxxx->get_posts_ordered_by_categories($post_type, $taxonomy, $categories);

set_query_var( 'posts', $posts );
set_query_var( 'categories', $categories );
set_query_var( 'taxonomy', $taxonomy );

Обновление 2: От Помощника php

public function get_posts_ordered_by_categories($post_type, $taxonomy, $categories) {
    $posts = [];
    foreach ($categories as $category) {
        $category_posts = $this->get_posts_from_category($post_type, $taxonomy, $category->term_id);
        $posts = array_merge($posts, $category_posts);
    }
    return $posts;
}

protected function get_posts_from_category($post_type, $taxonomy, $category_id) {
    return get_posts([
        'tax_query' => array(
            array(
                'taxonomy' => $taxonomy,
                'field'    => 'term_id',
                'terms'    => (int) $category_id,
            )
        ),
        'posts_per_page' => -1,
        'orderby' => 'date',
        'order' => 'DESC',
        'post_status' => 'publish',
        'post_type' => $post_type,
        'suppress_filters' => false,
    ]);
}

Ответы [ 2 ]

1 голос
/ 21 января 2020
public function get_posts_ordered_by_categories($post_type, $taxonomy, $categories) {
    $posts = [];
    foreach ($categories as $category) {
        $category_posts = $this->get_posts_from_category($post_type, $taxonomy, $category->term_id);
       print_r($category_posts);
    }
    return $posts;
}

опубликовать результаты этого кода.

1 голос
/ 21 января 2020

В get_posts_ordered_by_categories вы получаете все сообщения из категории и помещаете их в массив сообщений. Вы должны проверить, существует ли запись в этом массиве. Например:

public function get_posts_ordered_by_categories($post_type, $taxonomy, $categories) {
    $posts = [];
    foreach ($categories as $category) {
        $category_posts = $this->get_posts_from_category($post_type, $taxonomy, $category->term_id);
        foreach ($category_posts as $post) {
            $posts[$post->ID] = $post;
        }
    }
    return $posts;
}

Таким образом, вы получите список уникальных сообщений.

...