Вопрос или проблема
Я работаю над разработкой плагина, и мой плагин называется plugindev
. У меня есть пользовательский тип записей под названием team
. У меня есть пользовательская таксономия Team_Category
, которая регистрируется с помощью этого кода.
/***************************таксономия****************************/
add_action( 'init', 'create_team_taxonomies', 0 );
function create_team_taxonomies() {
// Добавить новую таксономию, сделать ее иерархической (как категории)
$labels = array(
'name' => _x( 'Категории_Команд', 'общее название таксономии' ),
'singular_name' => _x( 'Категория_Команды', 'единичное название таксономии' ),
'search_items' => __( 'Поиск Категорий_Команд' ),
'all_items' => __( 'Все Категории_Команд' ),
'parent_item' => __( 'Родительская Категория_Команды' ),
'parent_item_colon' => __( 'Родительская Категория_Команды:' ),
'edit_item' => __( 'Редактировать Категорию_Команды' ),
'update_item' => __( 'Обновить Категорию_Команды' ),
'add_new_item' => __( 'Добавить Новую Категорию_Команды' ),
'new_item_name' => __( 'Новое Название Категории_Команды' ),
'menu_name' => __( 'Категория_Команды' ),
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => false,
'query_var' => true,
'rewrite' => array( 'slug' => 'Категория_Команды' ),
);
register_taxonomy( 'Team_Category', array( 'team' ), $args );
}
/****************************конец таксономии***********************************/
Но когда я использую tax_query в своем WP_Query, я не получаю никаких записей. Вот мой код:
<?php
$taxonomy_name="Team_Category";
$get_categories = get_terms($taxonomy_name);
$total_categories = count($get_categories);
// Проходим по всем категориям:
for ($i = 0; $i < $total_categories; $i++) {
?>
<div class="row">
<div class="col-md-4">
<?php echo $category_name = $get_categories[$i]->name; ?>
</div>
<?php
$args = array(
'post_type' => 'team',
'tax_query' => array(
array(
'taxonomy' => 'Team_Category',
'field' => 'slug', 'terms' => $category_name,)
)
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
the_title();
}
}
wp_reset_query(); ?>
</div>
<?php }
Это работает идеально без tax_query
. Я много искал в Google, но не нашел подходящего результата. Есть ли какое-нибудь решение, чтобы исправить эту проблему? Буду очень признателен за любую помощь.
Я думаю, что проблема заключается именно в вашем коде, но это действительно легко пропустить. Давайте подробнее рассмотрим эту часть:
<div class="col-md-4">
<?php echo $category_name = $get_categories[$i]->name; ?>
</div>
<?php
$args = array(
'post_type' => 'team',
'tax_query' => array(
array(
'taxonomy' => 'Team_Category',
'field' => 'slug', 'terms' => $category_name
)
)
);
Что здесь происходит? Вы получите имя термина и сохраните его как $category_name
($category_name = $get_categories[$i]->name;
).
Позже вы используете это значение в качестве slug ('field' => 'slug', 'terms' => $category_name
).
Slug и имя – это разные вещи, поэтому есть большая вероятность, что ваш Tax_Query не найдет ничего (если имя содержит заглавную букву, пробел или любой специальный символ, slug будет отличаться от имени).
Таким образом, это должно работать хорошо, если вы измените его так, чтобы он выглядел следующим образом:
<div class="col-md-4">
<?php echo $get_categories[$i]->name; ?>
</div>
<?php
$args = array(
'post_type' => 'team',
'tax_query' => array(
array(
'taxonomy' => 'Team_Category',
'field' => 'slug',
'terms' => $get_categories[$i]->slug;
)
)
);
$query = new WP_Query($args);
Ответ или решение
Ваша проблема с использованием tax_query
в WP_Query
, скорее всего, связана с тем, что вы используете название термина вместо его слага (slug) в запросе. Давайте разберёмся в этом более подробно.
Анализ Проблемы
В вашем коде вы получаете название категории (термина) следующим образом:
$category_name = $get_categories[$i]->name;
Однако, когда вы передаете это значение в tax_query
, вы используете поле slug
, что является причиной неудачи вашего запроса. В WordPress "имя" (name) и "слаг" (slug) – это два разных поля:
- Имя (name): человекочитаемое имя термина, которое может содержать пробелы и специальные символы.
- Слаг (slug): URL-дружественная версия имени, которая обычно содержит только строчные буквы, цифры и дефисы.
Решение
Чтобы исправить ваш код, вам нужно использовать поле slug
вместо поля name
. Ваша модификация кода должна выглядеть следующим образом:
<div class="col-md-4">
<?php echo $get_categories[$i]->name; ?>
</div>
<?php
$args = array(
'post_type' => 'team',
'tax_query' => array(
array(
'taxonomy' => 'Team_Category',
'field' => 'slug',
'terms' => $get_categories[$i]->slug // Изменено на slug
)
)
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
the_title();
}
}
wp_reset_postdata(); // Лучше использовать wp_reset_postdata(), чем wp_reset_query()
?>
Дополнительные Рекомендации
-
Используйте
wp_reset_postdata()
: В конце цикла запросов рекомендуется использоватьwp_reset_postdata()
, чтобы сбросить глобальные переменные поста. Это правильный способ управления контекстом запроса. -
Проверка существования терминов: Перед тем как выполнять
WP_Query
, вы можете добавить проверку на наличие терминов, чтобы удостовериться, что вы получите корректный вывод. -
Ограничьте количество запросов: Если количество категорий велико, это может повлиять на производительность, так как вы делаете один запрос для каждой категории. Вы можете рассмотреть возможность объединения запросов, если это целесообразно для вашего сценария.
Заключение
Ваша проблема связана с путаницей между именем термина и его слагом. Исправление этого в вашем tax_query
должно помочь вам получить корректные результаты из базы данных. Убедитесь также, что вы используете правильные функции для сброса данных и контролируете производительность ваших запросов. Надеюсь, это поможет вам успешно завершить разработку вашего плагина и добавить функциональность, которую вы планируете.