Вопрос или проблема
Я создал пользовательский тип записи под названием “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. В этом ответе я объясню, как правильно настроить запрос с использованием таксономии, чтобы гарантировать, что в результаты попадут только те записи, которые соответствуют заданным критериям.
Шаги для изменения функции фильтрации записей по таксономии
-
Изменение типа постов: Убедитесь, что в аргументах запроса
post_type
установлен как ‘listas’, чтобы выбирать только записи вашего пользовательского типа. -
Добавление фильтрации по таксономии: Используйте параметр
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;
Объяснение нового кода
-
Изменение
post_type
: Мы установилиpost_type
в'listas'
, чтобы запрашивались только записи этого типа. -
Использование
tax_query
: Мы добавили массивtax_query
ко всем аргументам, который будет filter-ить по нашей пользовательской таксономииtaxolistas
. Параметрterms
позволяет указать, какие термины должны быть использованы для фильтрации. Вы можете передать их через запятую, и функция обработает их корректно, разделив на массив. -
Гибкость параметров: Вы можете добавить параметр
tax_term
в шорткод, что сделает вашу функцию более универсальной. Например:[thumbs_rating_top tax_term="taxolistas-term1,taxolistas-term2"]
.
Теперь ваша функция полностью настроена для фильтрации по пользовательским таксономиям вашего пользовательского типа записей. Если у вас возникнут дополнительные вопросы или потребуется помощь, пожалуйста, обращайтесь!