Как передать таксономические термины в WP_Query вместе с $args?

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

Я создал пользовательский тип записи (CPT) и связанную с ним пользовательскую таксономию. Допустим, имя пользовательской таксономии – Спорт. Я добавил термины – футбол, баскетбол.

Теперь я хочу получить заголовки постов, помеченных футболом и баскетболом отдельно на одной странице. (Примечание: я использую пользовательский шаблон страницы для отображения списка статей из CPT).

$args = array(
      'post_type' => 'sports',
      'tax_query' => array(
                array(
                'taxonomy' => 'sports_category',
                'field'    => 'slug',
                'terms'    => 'football'
           ),
   ),
);

$myquery = new WP_Query($args);

Итак, я успешно получил посты для футбола, но если я хочу получить посты для баскетбола, нужно ли мне создавать другой запрос с ‘terms’ => ‘basketball’?

Существует ли способ динамически передать ‘terms’ в WP_Query вместе с установленными $args, чтобы не писать одни и те же аргументы дважды?

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

Я хочу узнать специфическое для WP или эффективное решение.

Вы можете сделать так:

              $thiscat = $wp_query->get_queried_object();//вставьте этот код

              $args = array(
               'post_type' => 'sports',
               'tax_query' => array(
               array(
                 'taxonomy' => 'sports_category',
                 'field'    => 'slug',
                'terms'    => $thiscat->slug // Передайте это в slug
           ),
     ),
 );

 $myquery = new WP_Query($args);

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

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

Чтобы получить посты, относящиеся к пользовательской таксономии в WordPress, вы можете использовать класс WP_Query вместе с параметрами, которые позволяют фильтровать записи по определённым терминам таксономии. В вашем случае это относится к пользовательскому типу записи (CPT) «sports» и таксономии «sports_category» с терминами «football» и «basketball».

Основной подход

Если вы хотите извлечь посты для обоих терминов—футбол и баскетбол—на одной странице, существует несколько эффективных способов сделать это, не дублируя код.

1. Использование WP_Query с динамическими терминами

Вы можете использовать один и тот же объект WP_Query и передавать разные термины в качестве переменной. Например:

// Получаем текущий термин
$current_term = get_queried_object();

// Массив для хранения термина
$terms_list = ['football', 'basketball'];

// Массив для хранения результатов
$results = [];

// Проходим по каждому термину
foreach ($terms_list as $term) {
    $args = array(
        'post_type' => 'sports',
        'tax_query' => array(
            array(
                'taxonomy' => 'sports_category',
                'field'    => 'slug',
                'terms'    => $term,
            ),
        ),
    );

    // Выполняем WP_Query для каждого термина
    $myquery = new WP_Query($args);

    // Сохраняем результаты
    if ($myquery->have_posts()) {
        while ($myquery->have_posts()) : $myquery->the_post();
            $results[$term][] = get_the_title(); // Сохраняем заголовки
        endwhile;
        wp_reset_postdata();
    }
}

// Теперь вы можете вывести результаты
foreach ($results as $term => $titles) {
    echo '<h2>' . ucfirst($term) . '</h2>';
    echo '<ul>';
    foreach ($titles as $title) {
        echo '<li>' . $title . '</li>';
    }
    echo '</ul>';
}

2. Использование функции для переиспользования кода

Если вы хотите сделать ваш код более структурированным, вы можете создать отдельную функцию для обработки запросов:

function get_posts_by_term($term) {
    $args = array(
        'post_type' => 'sports',
        'tax_query' => array(
            array(
                'taxonomy' => 'sports_category',
                'field'    => 'slug',
                'terms'    => $term,
            ),
        ),
    );

    return new WP_Query($args);
}

// Определяем массив терминов
$terms_list = ['football', 'basketball'];

// Результаты
$results = [];

// Получаем посты для каждого термина
foreach ($terms_list as $term) {
    $myquery = get_posts_by_term($term);

    if ($myquery->have_posts()) {
        while ($myquery->have_posts()) : $myquery->the_post();
            $results[$term][] = get_the_title();
        endwhile;
        wp_reset_postdata();
    }
}

// Выводим результаты
foreach ($results as $term => $titles) {
    echo '<h2>' . ucfirst($term) . '</h2>';
    echo '<ul>';
    foreach ($titles as $title) {
        echo '<li>' . $title . '</li>';
    }
    echo '</ul>';
}

Заключение

Эти подходы не только устраняют необходимость дублирования кода, но и упрощают его поддержку и расширение в будущем. Вы можете легко добавлять новые термины в массив terms_list, и код будет продолжать работать без изменений. Использование функций делает код более читаемым и повторно используемым, что является хорошей практикой в разработке на WordPress.

Использование базовых принципов организации кода, как указано выше, помогает поддерживать чистоту и эффективность вашего проекта, что, в свою очередь, способствует лучшей оптимизации по SEO.

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

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