Фильтр записей пользовательского типа по таксономии

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

Я создал пользовательский тип записи под названием “listas” и пользовательскую таксономию под названием “taxolistas”.

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

Заранее спасибо.

if (!function_exists('thumbs_rating_top_func')):
    function thumbs_rating_top_func($atts)
        {
        $return = '';

        // Принимаемые параметры

        extract(shortcode_atts(array(
            'exclude_posts' => '',
            'type' => 'positive',
            'posts_per_page' => 5,
            'category' => '',
            'show_votes' => 'yes',
            'post_type' => 'any',
            'show_both' => 'no',
            'order' => 'DESC',
            'orderby' => 'meta_value_num'
        ) , $atts));

        // Проверяем, какой meta_key хочет пользователь

        if ($type == 'positive')
            {
            $meta_key = '_thumbs_rating_up';
            $other_meta_key = '_thumbs_rating_down';
            $sign = "+";
            $other_sign = "-";
            }
          else
            {
            $meta_key = '_thumbs_rating_down';
            $other_meta_key = '_thumbs_rating_up';
            $sign = "-";
            $other_sign = "+";
            }

        // Формируем массив параметров

        $args = array(
            'post__not_in' => explode(",", $exclude_posts) ,
            'post_type' => $post_type,
            'post_status' => 'publish',
            'cat' => $category,
            'pagination' => false,
            'posts_per_page' => $posts_per_page,
            'cache_results' => true,
            'meta_key' => $meta_key,
            'order' => $order,
            'orderby' => $orderby,
            'ignore_sticky_posts' => true
        );

        // Получаем записи

        $thumbs_ratings_top_query = new WP_Query($args);

        // Формируем список записей

        if ($thumbs_ratings_top_query->have_posts()):
            $return.= '';
            while ($thumbs_ratings_top_query->have_posts())
                {
                $thumbs_ratings_top_query->the_post();
                $return.= '<h2 class="lista-item-h2 lista-item-h2-grade flex">

  <div class="listapop">
   <strong class="lista-ranking "><span class="figlista"></span></strong> </div>    

   <figure class="lista-item-foto">';
                $return.= '<div class="videoPlayer">
    ' . get_the_post_thumbnail($post_id, array(
                    'class' => ' videoPlayer__image lista-item-imagem'
                )) . '
         </div>
   </figure>


   ';
                $return.= ' 
   <div class="votar-lista">

' . thumbs_rating_getlink() . '

   </div>

';
                $return.= '

 <a class="titulo-da-lista modal-link" href="' . get_permalink() . '"> <div class="listItem__data"> <div class="trimtitulo"> ' . wp_trim_words(get_the_title() , 11, null) . ' </div> <span class="listItem__props">
<span class="lista-item-blerg grey default"></span>';
                $return.= '<span class="wikipedia-lista block grey">   ' . mts_excerpt(32) . '  </span></span></div></a>
</h2>';
                if ($show_votes == "yes")
                    {

                    // Получаем голоса

                    $meta_values = get_post_meta(get_the_ID() , $meta_key);

                    // Добавляем голоса в HTML

                    $return.= ' (' . $sign;
                    if (sizeof($meta_values) > 0)
                        {
                        $return.= $meta_values[0];
                        }
                      else
                        {
                        $return.= "0";
                        }

                    // Показываем другие голоса, если нужно

                    if ($show_both == 'yes')
                        {
                        $other_meta_values = get_post_meta(get_the_ID() , $other_meta_key);
                        $return.= " " . $other_sign;
                        if (sizeof($other_meta_values) > 0)
                            {
                            $return.= $other_meta_values[0];
                            }
                          else
                            {
                            $return.= "0";
                            }
                        }

                    $return.= ')';
                    }
                }

            // Сбрасываем данные записи, иначе небо упадет

            wp_reset_postdata();
        endif;
        return $return;
        }

    add_shortcode('thumbs_rating_top', 'thumbs_rating_top_func');
endif;

Вы должны указать listas в качестве post_type в аргументах запроса. И указать taxolistas вместе с любыми терминами таксономии taxolistas в tax_query.

$args = array(
    'post_type' => 'listas',
    'tax_query' => array(
        array(
            'taxonomy' => 'taxolistas',
            'field' => 'slug',
            'terms' => array ( 'taxolistas-term1', 'taxolistas-term2' )
        )
    )
);

.

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

Для фильтрации записей пользовательского типа постов (Custom Post Type) "listas" по пользовательской таксономии "taxolistas" в функции плагина Thumbs Rating, вам необходимо внести изменения в массив аргументов, передаваемых в WP_Query. В этом ответе я объясню, как правильно настроить запрос с использованием таксономии, чтобы гарантировать, что в результаты попадут только те записи, которые соответствуют заданным критериям.

Шаги для изменения функции фильтрации записей по таксономии

  1. Изменение типа постов: Убедитесь, что в аргументах запроса post_type установлен как ‘listas’, чтобы выбирать только записи вашего пользовательского типа.

  2. Добавление фильтрации по таксономии: Используйте параметр tax_query, чтобы уточнить выборку постов по заданной пользовательской таксономии "taxolistas" и указанным терминам.

Пример кода

Вот как можно изменить вашу функцию thumbs_rating_top_func, чтобы включить фильтрацию по таксономии:

if (!function_exists('thumbs_rating_top_func')):
    function thumbs_rating_top_func($atts)
    {
        $return = '';

        // Параметры, принимаемые функцией

        extract(shortcode_atts(array(
            'exclude_posts' => '',
            'type' => 'positive',
            'posts_per_page' => 5,
            'category' => '',
            'show_votes' => 'yes',
            'post_type' => 'listas', // Изменено на 'listas'
            'show_both' => 'no',
            'order' => 'DESC',
            'orderby' => 'meta_value_num',
            'tax_term' => '' // Добавлен параметр для термина таксономии
        ), $atts));

        // Установка мета ключей на основе типа

        if ($type == 'positive') {
            $meta_key = '_thumbs_rating_up';
            $other_meta_key = '_thumbs_rating_down';
            $sign = "+";
            $other_sign = "-";
        } else {
            $meta_key = '_thumbs_rating_down';
            $other_meta_key = '_thumbs_rating_up';
            $sign = "-";
            $other_sign = "+";
        }

        // Построение массива аргументов

        $args = array(
            'post__not_in' => explode(",", $exclude_posts),
            'post_type' => $post_type,
            'post_status' => 'publish',
            'pagination' => false,
            'posts_per_page' => $posts_per_page,
            'cache_results' => true,
            'meta_key' => $meta_key,
            'order' => $order,
            'orderby' => $orderby,
            'ignore_sticky_posts' => true,
            'tax_query' => array(
                array(
                    'taxonomy' => 'taxolistas',
                    'field' => 'slug',
                    'terms' => explode(',', $tax_term) // Допустимо передать несколько терминов через запятую
                )
            )
        );

        // Получаем посты

        $thumbs_ratings_top_query = new WP_Query($args);

        // Формирование списка постов

        if ($thumbs_ratings_top_query->have_posts()):
            while ($thumbs_ratings_top_query->have_posts()) {
                $thumbs_ratings_top_query->the_post();
                $return .= '<h2 class="lista-item-h2 ...">';
                // Добавить код генерации HTML для поста...
                $return .= '</h2>';
            }

            wp_reset_postdata();
        endif;
        return $return;
    }

    add_shortcode('thumbs_rating_top', 'thumbs_rating_top_func');
endif;

Объяснение нового кода

  1. Изменение post_type: Мы установили post_type в 'listas', чтобы запрашивались только записи этого типа.

  2. Использование tax_query: Мы добавили массив tax_query ко всем аргументам, который будет filter-ить по нашей пользовательской таксономии taxolistas. Параметр terms позволяет указать, какие термины должны быть использованы для фильтрации. Вы можете передать их через запятую, и функция обработает их корректно, разделив на массив.

  3. Гибкость параметров: Вы можете добавить параметр tax_term в шорткод, что сделает вашу функцию более универсальной. Например: [thumbs_rating_top tax_term="taxolistas-term1,taxolistas-term2"].

Теперь ваша функция полностью настроена для фильтрации по пользовательским таксономиям вашего пользовательского типа записей. Если у вас возникнут дополнительные вопросы или потребуется помощь, пожалуйста, обращайтесь!

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

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