Вопрос или проблема
Я пытаюсь использовать WP_Query();
, чтобы выбирать конкретные категории и отображать все теги, используемые для постов в этих категориях.
Я заметил, что некоторые теги, такие как трюфели, не включены в результаты, хотя этот пост является категоризированным как рецепт, а его другая категория, сладости, также включена в массив категорий.
Есть ли мысли о том, что я делаю неправильно, чтобы получить только некоторые теги? Спасибо!
<ul class="tag-list">
<?php
$query = new WP_Query( 'cat=4,101,94,93,56,72,99,100,63,98,95,96,80' );
$posttags = "";
if (have_posts()) : while (have_posts()) : the_post();
if( get_the_tag_list() ){
$posttags = $posttags . get_the_tag_list('',',',',');
}
endwhile; endif;
wp_reset_postdata();
// Разбить теги на массив
$sortedtags = explode(',', $posttags);
// Отсортировать массив
asort($sortedtags);
// Удалить дубликаты из массива
$sortedtags = array_unique($sortedtags);
// Удалить пустую запись из-за get_the_tag_list
$sortedtags = array_values( array_filter($sortedtags) );
foreach ($sortedtags as $tagname) {
echo '<li>' . $tagname . '</li>';
}
?>
</ul>
Обновление
Я думал, что использование основного цикла if (have_posts)...the_post();
мешает всему, поэтому я изменил код, но по-прежнему не хватает моих грибов! 😛
<ul class="tag-list">
<?php
$query_args = array( 'cat' => '4,101,94,93,56,72,99,100,63,98,95,96,80' );
$query = new WP_Query( $query_args );
$posttags = "";
while( $query->have_posts() ) {
$query->the_post();
if( get_the_tag_list() ){
$posttags = $posttags . get_the_tag_list('',',',',');
}
}
wp_reset_postdata();
// Разбить теги на массив
$sortedtags = explode(',', $posttags);
// Отсортировать массив
asort($sortedtags);
// Удалить дубликаты из массива
$sortedtags = array_unique($sortedtags);
// Удалить пустую запись из-за get_the_tag_list
$sortedtags = array_values( array_filter($sortedtags) );
foreach ($sortedtags as $tagname) {
echo '<li>' . $tagname . '</li>';
}
?>
</ul>
Похоже, что всё, что мне нужно было сделать, это включить 'posts_per_page' => -1
в массив $query_args
.
Итоговый рабочий код:
<ul class="tag-list">
<?php
$query_args = array(
// Проще называть родительскую категорию, "рецепт" вместо того, чтобы иметь дело со всеми этими id
// 'cat' => '101,94,93,56,72,99,100,63,98,95,96,80,4',
// Используем category ids рецепты (4) и ингредиенты (56) - специфические типы рецептов, которые являются дочерними к рецептам
'category__in' => array( 4, 56 ),
// Берет все посты, а не только те, что на первой странице
'posts_per_page' => -1
);
$query = new WP_Query( $query_args );
// $query = new WP_Query( 'author_name=centehua' );
$posttags = "";
while( $query->have_posts() ) {
$query->the_post();
if( get_the_tag_list() ){
$posttags = $posttags . get_the_tag_list('',',',',');
}
}
wp_reset_postdata();
// Разбить теги на массив
$sortedtags = explode(',', $posttags);
// Отсортировать массив
asort($sortedtags);
// Удалить дубликаты из массива
$sortedtags = array_unique($sortedtags);
// Удалить пустую запись из-за get_the_tag_list
$sortedtags = array_values( array_filter($sortedtags) );
foreach ($sortedtags as $tagname) {
echo '<li>' . $tagname . '</li>';
}
?>
</ul>
Вы пытаетесь объединить списки тегов для всех постов в одну строку, что может быть не самым лучшим подходом и вызывает проблему с тем, как вы извлекаете и объединяете теги в вашем цикле.
<ul class="tag-list">
<?php
$query = new WP_Query('cat=4,101,94,93,56,72,99,100,63,98,95,96,80');
$all_tags = array();
if ($query->have_posts()) : while ($query->have_posts()) : $query->the_post();
$post_tags = get_the_tags();
if ($post_tags) {
foreach ($post_tags as $tag) {
$all_tags[] = $tag->name;
}
}
endwhile;
endif;
wp_reset_postdata();
// Отсортировать и удалить дубликаты
$sorted_tags = array_unique($all_tags);
asort($sorted_tags);
foreach ($sorted_tags as $tag_name) {
echo '<li>' . $tag_name . '</li>';
}
?>
</ul>
Ответ или решение
Проблема, с которой вы столкнулись, заключается в том, что запрос WP_Query не возвращает все теги из тех категорий, которые вас интересуют. В вашем исходном коде определенные теги не учитываются при извлечении данных, и возможно, их может не хватать из-за нескольких причин. Давайте разберем ваш вопрос более подробно.
Причины проблемы и их решение
-
Ограничение количества постов:
Вы изначально не указывали параметрposts_per_page
, который по умолчанию равен 10. Если у вас меньше постов в категориях или по каким-то причинам они не все загружаются, некоторые теги могут не отображаться. В вашем окончательном решении вы правильно добавили'posts_per_page' => -1
, что позволяет загружать все посты без ограничений. -
Метод получения тегов:
В первом подходе вы использовалиget_the_tag_list()
, который возвращает теги в виде строки. Это может привести к проблеме с дублированием и усложнением процесса последующей обработки. Вместо этого рекомендуется использоватьget_the_tags()
, который возвращает массив объектов тегов. Это дает больше контроля и упрощает извлечение названий тегов без лишних манипуляций со строками. -
Обработка дубликатов:
Ваш код использует массивы для хранения тегов и сортировки, что является правильным подходом. Удаление дубликатов с помощьюarray_unique()
и сортировка с помощьюasort()
– это необходимые шаги, которые позволяют получить уникальные теги в отсортированном порядке.
Коды с улучшением
В качестве итогового результата, вот оптимизированный код для вашей задачи:
<ul class="tag-list">
<?php
$query_args = array(
'category__in' => array(4, 56), // Замена на массив ID категорий
'posts_per_page' => -1 // Получение всех постов
);
$query = new WP_Query($query_args);
$all_tags = array();
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$post_tags = get_the_tags();
if ($post_tags) {
foreach ($post_tags as $tag) {
$all_tags[] = $tag->name; // Добавляем название тега в массив
}
}
}
}
wp_reset_postdata();
// Удаление дубликатов и сортировка
$sorted_tags = array_unique($all_tags);
sort($sorted_tags); // Сортировка в алфавитном порядке
foreach ($sorted_tags as $tag_name) {
echo '<li>' . esc_html($tag_name) . '</li>'; // Безопасный вывод
}
?>
</ul>
Заключение
Используя данный подход, вы получите все теги из указанных категорий без пропусков. Таким образом, улучшение вашего изначального кода не только решает проблему, но и делает код более читабельным и легко поддерживаемым.
Если у вас возникнут другие вопросы по оптимизации вашего сайта на WordPress или по другим аспектам его работы, не стесняйтесь задавать их.