Вопрос или проблема
Я пытаюсь отобразить список всех постов из нескольких категорий (если кто-то ответит на это, вам, возможно, стоит включить в ответ комбинирование тегов, так как это, вероятно, сделает ответ более полным для будущих ищущих).
Вот что я использую:
Эта функция работает для отображения списка:
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); ?>
Пояснения к изменениям
-
Передача параметров: Параметр
$categories
– это строка, содержащая ID категорий, разделённых запятыми. Параметр$tags
– это массив, содержащий ID тегов. -
Использование
tag__in
: Для выборки постов с тегами мы используемtag__in
, который принимает массив ID тегов. Это позволяет гибко фильтровать записи по нескольким тегам. -
Проверка на пустые значения: Перед тем как добавлять параметры в
$args
, выполняется проверка на их наличие, что предотвращает возможные ошибки.
Заключение
Эта модификация позволяет вам более гибко выбирать записи из нескольких категорий и тегов, не теряя при этом производительность и простоту использования функции. Таким образом, вы можете легко адаптировать её под ваши нужды. Используйте данную функцию для улучшения контента вашего сайта, облегчая поиск нужных записей для ваших пользователей.