Не удается отфильтровать wp_query по текущему идентификатору категории.

Вопрос или проблема

Я делаю запрос к пользовательскому типу записи (“донор”) и хотел бы сгруппировать их по категориям (пользовательская таксономия для этого типа записи), при этом отображая название категории, а затем все записи для этой категории.

После долгих исследований у меня есть следующий код (в шаблоне архива моего пользовательского типа записи, archive-donor.php):

global $paged;
global $query_args;

$category_args = array(
'taxonomy' => 'donor_taxonomy',
'orderby' => 'name',
'parent' => 0
  );
$categories = get_categories( $category_args );
foreach ( $categories as $category ) {

echo '<h3><a href="' . get_category_link( $category->term_id ) . '">' . $category->name . '</a></h3>';  

echo 'ID: ' . $category->term_id . '. ';

$post_args = array(
    'cat' => $category->term_id,
    'post_type' => 'donor',
    'orderby'       => 'post_date',
    'posts_per_page'=> '-1', // переопределяет количество постов на странице в настройках темы

);

$loop = new WP_Query( $post_args );
if( $loop->have_posts() ) {

 [вставьте здесь запрос, который работает нормально, если я НЕ пытаюсь указать категорию в своих аргументах запроса]
} 

wp_reset_postdata();    
}

Хотя я могу вывести номер ID с помощью этой строки…

echo 'ID: ' . $category->term_id . '. ';

…если я включаю следующее в свои $post_args, которое использует тот же код для получения ID, система сообщает, что записи не найдены:

'cat' => $category->term_id

Если я убираю эту строку, я получаю все записи, независимо от категории, которые отображаются после каждого заголовка категории. Если я включаю ее, то после каждого заголовка появляется сообщение “записи не найдены”. Заголовки отображаются правильно в порядке.

Наверняка я делаю что-то не так, но не могу понять, что именно. Надеюсь, кто-то сможет помочь! 8^)

Вы упомянули, что используете пользовательскую таксономию – поэтому включение ключа cat в ваши аргументы wp_query не сработает. wp_query ожидает, что это будет ID термина, относящегося к стандартной WP категории. С пользовательской таксономией вам нужно использовать специальные параметры таксономии.

Поэтому ваши аргументы должны выглядеть следующим образом:

$post_args = array(
    'post_type' => 'donor',
    'orderby'       => 'post_date',
    'posts_per_page'=> '-1', // переопределяет количество постов на странице в настройках темы
    'tax_query' => array(
        array(
            'taxonomy' => 'donor_taxonomy',
            'field'    => 'term_id',
            'terms'    => $category->term_id,
        ),
    )
);

Ответ или решение

Проблема, с которой вы столкнулись, связана с неверным использованием параметров при описании WP_Query для кастомного таксономического термина. Так как вы используете пользовательскую таксономию (donor_taxonomy), вам не следует использовать параметр cat, так как он предназначен только для стандартной таксономии категорий WordPress.

Чтобы корректно отфильтровать ваши посты по пользовательской таксономии, вам нужно использовать tax_query. Ваш обновленный код для запроса должен выглядеть следующим образом:

global $paged;
global $query_args;

$category_args = array(
    'taxonomy' => 'donor_taxonomy',
    'orderby' => 'name',
    'parent' => 0
);
$categories = get_categories($category_args);

foreach ($categories as $category) {
    echo '<h3><a href="' . get_category_link($category->term_id) . '">' . $category->name . '</a></h3>';  
    echo 'ID is: ' . $category->term_id . '. ';

    $post_args = array(
        'post_type' => 'donor',
        'orderby' => 'post_date',
        'posts_per_page' => '-1', // переопределяет количество постов в настройках темы
        'tax_query' => array(
            array(
                'taxonomy' => 'donor_taxonomy',
                'field' => 'term_id',
                'terms' => $category->term_id,
            ),
        )
    );

    $loop = new WP_Query($post_args);
    if ($loop->have_posts()) {
        while ($loop->have_posts()) {
            $loop->the_post();
            // Здесь выводите ваши посты, например:
            the_title('<h4>', '</h4>'); // Заголовок поста
        }
    } else {
        echo 'Посты не найдены в этой категории.';
    }

    wp_reset_postdata();    
}

Обратите внимание на следующие изменения:

  1. Заменили 'cat' => $category->term_id на параметры tax_query, что позволяет фильтровать посты по вашей кастомной таксономии.
  2. Добавили цикл while ($loop->have_posts()) для вывода самих постов внутри каждой категории.
  3. Опционально добавили сообщение, если не найдено постов для данной категории.

После внесения этих изменений ваш код должен корректно отображать все посты по категориям, группируя их по пользовательской таксономии.

Оцените материал
Добавить комментарий

Капча загружается...