Получить пост из категории по приоритету

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

Я хочу получить 3 записи из типа записи события (custom post type). Но я хочу сделать это с приоритетом категории. Если в категории “особые” будет 3 предстоящих события, то я хочу показать 3 записи из этой категории; если в категории “особые” нет 3 предстоящих событий, то я хочу получить записи из других категорий + записи без какой-либо категории.

Конечный результат должен вернуть 3 предстоящих события. Я немного запутался, как добавить этот условный параметр в WP_Query.

Текущий код (который возвращает только максимальные 3 записи из категории “особые”) –

$events_args = array(
      'post_type'     => 'ctc_event',                
      'meta_query' => array(
        array(
          'key' => '_ctc_event_end_date',
          'value' => date_i18n( 'Y-m-d' ),
          'compare' => '>=',
          'type' => 'DATE'
        ),
      ),
      'meta_key'      => '_ctc_event_start_date_start_time',
      'meta_type'     => 'DATETIME',
      'orderby'     => 'meta_value',
      'order'       => 'ASC',
      'posts_per_page' => 3,
      'tax_query' => array(
          array(
              'taxonomy' => 'ctc_event_category',
              'field'    => 'slug',
              'terms'    => 'featured',
          ),
      ),
    );

$events = new WP_Query( $events_args );

Заранее спасибо.

Сначала вы можете получить записи из вашей категории “особые” и проверить, есть ли там какие-либо записи или нет. Если да, то вы их покажете.

Если нет, вы сделаете другой запрос, который получит 3 записи из случайных категорий (как вы описали) и покажете их.

$events_args = array(
            // вставьте код из вашего вопроса сюда 
);
$events = new WP_Query( $events_args );
if ($events->have_posts()){
     while ($events->have_posts()) : the_post();
          // ваш код цикла здесь
     endwhile;
} 
if ((3-($events->found_posts)) > 0) {
     wp_reset_postdata();
     $remaining = 3 - ($events->found_posts);
     $random_args = array(
         // ваш желаемый массив атрибутов, установите 'posts_per_page' на $remaining
     );
     $random_posts = new WP_Query($random_args);
     while ($random_posts->have_posts()) : the_post();
         // ваш код цикла здесь
     endwhile;
}

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

Конечно! Для решения вашей задачи, мы можем сначала выполнить запрос для получения постов из категории "featured". Если количество найденных постов меньше трех, то мы будем выполнять второй запрос, чтобы получить оставшиеся посты из других категорий или посты без категории. Вот как это можно реализовать:

// Первый запрос для получения постов из категории 'featured'
$events_args = array(
    'post_type'     => 'ctc_event',                
    'meta_query'    => array(
        array(
            'key'     => '_ctc_event_end_date',
            'value'   => date_i18n('Y-m-d'),
            'compare' => '>=',
            'type'    => 'DATE'
        ),
    ),
    'meta_key'      => '_ctc_event_start_date_start_time',
    'meta_type'     => 'DATETIME',
    'orderby'       => 'meta_value',
    'order'         => 'ASC',
    'posts_per_page'=> 3,
    'tax_query'     => array(
        array(
            'taxonomy' => 'ctc_event_category',
            'field'    => 'slug',
            'terms'    => 'featured',
        ),
    ),
);

$events = new WP_Query($events_args);

// Проверка, есть ли посты из категории 'featured'
if ($events->have_posts()) {
    while ($events->have_posts()) : $events->the_post();
        // Ваш код для отображения поста
        the_title('<h2>', '</h2>');
    endwhile;
} 

// Если необходимо, получаем оставшиеся посты
if (3 - $events->found_posts > 0) {
    wp_reset_postdata(); // Сбрасываем данные поста
    $remaining = 3 - $events->found_posts; // Количество оставшихся постов
    $random_args = array(
        'post_type'     => 'ctc_event',
        'meta_query'    => array(
            array(
                'key'     => '_ctc_event_end_date',
                'value'   => date_i18n('Y-m-d'),
                'compare' => '>=',
                'type'    => 'DATE'
            ),
        ),
        'meta_key'      => '_ctc_event_start_date_start_time',
        'meta_type'     => 'DATETIME',
        'orderby'       => 'meta_value',
        'order'         => 'ASC',
        'posts_per_page'=> $remaining,
        'tax_query'     => array(
            'relation' => 'OR', // Итак, у нас будет несколько условий
            array(
                'taxonomy' => 'ctc_event_category',
                'field'    => 'slug',
                'terms'    => 'featured',
                'operator' => 'NOT IN', // Исключая посты из 'featured'
            ),
            array(
                'taxonomy' => 'ctc_event_category',
                'field'    => 'slug',
                'terms'    => '', // Посты без категории
                'operator' => 'EXISTS', // Исключаем пустую категорию
            ),
        ),
    );

    $random_posts = new WP_Query($random_args);

    while ($random_posts->have_posts()) : $random_posts->the_post();
        // Ваш код для отображения поста
        the_title('<h2>', '</h2>');
    endwhile;
}
wp_reset_postdata(); // Обязательно сбрасываем после каждого запроса

Разбор кода:

  1. Первый запрос: Мы ищем события, относящиеся к категории "featured". Устанавливаем максимальное количество постов — 3, чтобы получить только три предстоящих события.

  2. Проверка на наличие постов: Если в результате первого запроса существуют посты, мы их выводим.

  3. Второй запрос для оставшихся постов: Если найденных постов меньше трех, мы рассчитываем, сколько постов еще нужно получить. Второй запрос убирает посты с категорией "featured" и выбирает посты из других категорий или те, которые не имеют категорий.

  4. Вытаскивание заголовка: В каждом цикле мы выводим заголовок каждого поста; вы можете модифицировать эту часть на ваше усмотрение.

  5. Сброс данных: После каждого запроса мы сбрасываем данные поста, чтобы избежать путаницы.

Этот код успешно решает вашу задачу. Вы можете адаптировать его под свои нужды и дополнить нужной логикой.

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

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