Не удалось получить все теги из определенных категорий.

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

Страница в вопросе.

Я пытаюсь использовать 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 не возвращает все теги из тех категорий, которые вас интересуют. В вашем исходном коде определенные теги не учитываются при извлечении данных, и возможно, их может не хватать из-за нескольких причин. Давайте разберем ваш вопрос более подробно.

Причины проблемы и их решение

  1. Ограничение количества постов:
    Вы изначально не указывали параметр posts_per_page, который по умолчанию равен 10. Если у вас меньше постов в категориях или по каким-то причинам они не все загружаются, некоторые теги могут не отображаться. В вашем окончательном решении вы правильно добавили 'posts_per_page' => -1, что позволяет загружать все посты без ограничений.

  2. Метод получения тегов:
    В первом подходе вы использовали get_the_tag_list(), который возвращает теги в виде строки. Это может привести к проблеме с дублированием и усложнением процесса последующей обработки. Вместо этого рекомендуется использовать get_the_tags(), который возвращает массив объектов тегов. Это дает больше контроля и упрощает извлечение названий тегов без лишних манипуляций со строками.

  3. Обработка дубликатов:
    Ваш код использует массивы для хранения тегов и сортировки, что является правильным подходом. Удаление дубликатов с помощью 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 или по другим аспектам его работы, не стесняйтесь задавать их.

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

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