Комбинирование категорий (Запросы к постам с несколькими таксономическими терминами)

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

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

Вот что я использую:

Эта функция работает для отображения списка:

function my_custom_loop_three_posts($category, $tag, $offset) {
        $args=array(
          // showposts был заменен, используйте 'posts_per_page' вместо
          // 'showposts'        => 1,
          'posts_per_page'      => 3,
          // это было заменено, используйте 'ignore_sticky_posts'
          // 'caller_get_posts' => 1,
          'ignore_sticky_posts' => true,
        );

        if ($category) {
          $args['cat'] = $category;
        }

        if ($tag) {
          $args['tag'] = $tag;
        }

        if ($offset) {
          $args['offset'] = $offset;
        }

        $my_query = new WP_Query($args);
        // ... остальная часть функции для вывода цикла

if( $my_query->have_posts() ) {
            while ($my_query->have_posts()) : $my_query->the_post(); ?>
             <div class="">
              <a href="https://wordpress.stackexchange.com/questions/233546/<?php the_permalink() ?>" >
   <div class="menu-item-list-item menu-item-list-item-not-title">
      <?php the_title(); ?>
   </div>
              </a>
             </div>
            <?php
            endwhile;
        } //if ($my_query)

        wp_reset_query();  // Восстановить глобальные данные поста, перезаписанные the_post().   
 };


function myFilter($query) {
    if ($query->is_feed) {
        $query->set('cat','-121');
    }
return $query;
}
add_filter('pre_get_posts','myFilter');

И я просто использую это, чтобы отобразить список на странице:

<?php my_custom_loop_three_posts(330, NULL, 1); ?>

Поскольку эта функция работает нормально, я надеялся, что смогу изменить ее, чтобы показывать несколько категорий / тегов в результатах, но немного затрудняюсь с этим. Может быть, это легко, может быть, сложно? Решения ИЛИ указания на то, как это исправить, приветствуются. Спасибо

Этот тип поведения описан в документации WP_Query. Вы можете использовать список ID категорий, разделенный запятыми, вместо одного. Например (взято непосредственно из страницы Codex):

$query = new WP_Query( array( 'cat' => '2,6,17,38' ) );

С тегами немного по-другому, но не сильно:

$query = new WP_Query( array( 'tag__in' => array( 37, 47 ) ) );

Вы, возможно, сможете использовать это, как и категории с ID, отделенными запятыми, но я не уверен на 100%, не проверив, и документация немного неясна по этому вопросу. Но в основном, с несколькими правками, если это необходимо, вы могли бы использовать ту же функцию и вызывать ее так:

<?php my_custom_loop_three_posts('33,44,55', array(12,13,14), 1); ?>

Если использовать этот пример, просто убедитесь, что вы изменили

if ($tag) {
    $args['tag'] = $tag;
}

на:

if ($tag) {
    $args['tag__in'] = $tag;
}

Надеюсь, это имеет смысл. Документация должна помочь вам в остальном.

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

Для того чтобы отображать записи из нескольких категорий и тегов в WordPress, вы можете модифицировать вашу функцию my_custom_loop_three_posts. Ниже приведённый вариант функции учитывает возможность передачи нескольких ID категорий и тегов. Мы будем использовать массив для тегов и строку для категорий, что позволит вам легко указать необходимые параметры.

Обновлённая функция

function my_custom_loop_three_posts($categories, $tags, $offset) {
    $args = array(
        'posts_per_page' => 3,
        'ignore_sticky_posts' => true,
        'offset' => $offset,
    );

    // Обработка категорий
    if (!empty($categories)) {
        $args['cat'] = $categories; // Здесь указываем ID категорий через запятую
    }

    // Обработка тегов
    if (!empty($tags) && is_array($tags)) {
        $args['tag__in'] = $tags; // Здесь передаём массив ID тегов
    }

    $my_query = new WP_Query($args);

    if ($my_query->have_posts()) {
        while ($my_query->have_posts()) : $my_query->the_post(); ?>
            <div class="">
                <a href="<?php the_permalink(); ?>">
                    <div class="menu-item-list-item menu-item-list-item-not-title">
                        <?php the_title(); ?>
                    </div>
                </a>
            </div>
        <?php
        endwhile;
    } //if ($my_query)

    wp_reset_postdata(); // Восстанавливаем глобальные данные поста
}

Пример использования

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

<?php my_custom_loop_three_posts('33,44,55', array(12,13,14), 1); ?>

Пояснения к изменениям

  1. Передача параметров: Параметр $categories – это строка, содержащая ID категорий, разделённых запятыми. Параметр $tags – это массив, содержащий ID тегов.

  2. Использование tag__in: Для выборки постов с тегами мы используем tag__in, который принимает массив ID тегов. Это позволяет гибко фильтровать записи по нескольким тегам.

  3. Проверка на пустые значения: Перед тем как добавлять параметры в $args, выполняется проверка на их наличие, что предотвращает возможные ошибки.

Заключение

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

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

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