Вопрос или проблема
Я пытался добиться этого в течение последних двух дней, но ничего не работает. Я пытаюсь создать функциональность для поиска любого поста, страницы и нескольких других пользовательских типов постов по тегу. Я создал плагин, который регистрирует таксономию под названием search_tag.
search-tags.php
require_once __DIR__ . '/includes/search-tags.class.php';
function search_tags_closure() {
$search_tags = new Search_Tags;
$search_tags->create_taxonomy();
}
add_action('init', 'search_tags_closure');
search-tags.class.php
class Search_Tags
{
const NAME = 'search_tag';
const LABEL = 'Поисковые Теги';
protected function get_post_types()
{
$args = [
'public' => 'true',
'publicly_queryable' => 'true',
];
$post_types = get_post_types($args, 'names');
$post_types['page'] = 'page';
unset($post_types['attachment']);
return array_keys($post_types);
}
protected function is_custom_post_type($name)
{
$built_in_post_types = [
'post',
'page',
];
if (in_array($name, $built_in_post_types)) return false;
return true;
}
public function create_taxonomy()
{
$name = $this::LABEL;
$labels = [
'name' => $name,
'menu_name' => $name,
'singular_name' => 'Поисковый Тег',
'all_items' => "Все $name",
'edit_item' => "Редактировать $name",
'view_item' => "Просмотреть $name",
'update_item' => "Обновить $name",
'add_new_item' => "Добавить Новый $name",
'new_item_name' => "Новый $name",
'search_items' => "Найти $name",
'add_or_remove_items' => "Добавить или удалить $name",
];
$args = [
'labels' => $labels,
'show_in_nav_menu' => false,
];
register_taxonomy($this::NAME, $this->get_post_types(), $args);
foreach ($this->get_post_types() as $post_type) {
register_taxonomy_for_object_type($this::NAME, $post_type);
}
}
}
Все вышеперечисленное работает прекрасно. Таксономия зарегистрирована, и я добавил теги на страницу.
Ниже приведен код, который я имею для запроса страниц по таксономии search_tag. Я временно закодировал значение для параметров tax_query, чтобы протестировать это. Я уверен, что термин и таксономия существуют, так как они отображаются, когда я перечисляю термин и таксономию с помощью WP CLI.
functions.php
function testing() {
$args = [
'post_type' => [
'post',
'page',
'product',
'distribution_centre',
],
'numberposts' => -1,
'post_status' => 'publish',
'tax_query' => [
[
'taxonomy' => 'search_tag',
'field' => 'name',
'terms' => 'Ничего',
]
]
];
return get_posts($args);
}
var_dump(testing());
Есть ли у вашего пользовательского типа поста настройка publicly_queryable=true?
Проверьте тип поста в результирующем запросе, чтобы убедиться, что он соответствует вашему типу поста. Я предполагаю, что ваш тип поста ‘distribution_centre’ не запрашивается по какой-то причине.
add_filter( 'posts_request', 'dump_request' );//показать запрос
function dump_request( $query ) {
echo "<pre>";
var_dump( $query );
echo "</pre>";
return $query;
}
Ответ или решение
Если вы сталкиваетесь с проблемой использования tax_query
в функции get_posts()
для выборки постов по пользовательской таксономии search_tag
, можно рассмотреть несколько аспектов, которые могут вызвать трудности. Давайте подробно разберем вашу ситуацию и предложим возможные решения.
Контекст проблемы
Вы создали пользовательскую таксономию search_tag
и зарегистрировали ее для нескольких типов постов, включая страницы и пользовательские посты. Вы также написали функцию testing()
, которая использует get_posts()
для поиска постов по тегам.
Проверка настроек пользовательского типа поста
Первое, что следует сделать, это убедиться, что все ваши пользовательские типы постов, включая distribution_centre
, имеют параметр publicly_queryable
установленным в true
. Это критично, так как если тип поста недоступен для запросов, он не будет возвращен в результатах вашего запроса.
Вы можете проверить это, используя следующий код:
$post_type_object = get_post_type_object('distribution_centre');
var_dump($post_type_object);
Убедитесь, что в результатах выводится public
как true
.
Проверка существования термина таксономии
Проверьте, существует ли термин Nothing
в вашей таксономии search_tag
. Используйте WP CLI или следующий код, чтобы увидеть доступные термины:
$terms = get_terms([
'taxonomy' => 'search_tag',
'hide_empty' => false,
]);
var_dump($terms);
Убедитесь, что Nothing
действительно присутствует среди термов.
Отладка SQL-запроса
Для получения более детальной информации о выполненном SQL-запросе вы можете использовать фильтр posts_request
. Это поможет вам понять, какие условия применяются к вашему tax_query
.
Добавьте следующий код после вашей функции testing()
:
add_filter('posts_request', function($query) {
echo "<pre>" . htmlspecialchars($query) . "</pre>";
return $query;
});
Это выведет SQL-запрос, который генерирует get_posts()
, что позволит вам убедиться, что запрос формируется корректно.
Пример исправленного кода
Убедитесь, что ваш код в testing()
выглядит следующим образом :
function testing() {
$args = [
'post_type' => [
'post',
'page',
'product',
'distribution_centre',
],
'numberposts' => -1,
'post_status' => 'publish',
'tax_query' => [
[
'taxonomy' => 'search_tag',
'field' => 'name',
'terms' => 'Nothing',
]
]
];
// Убедитесь, что ваш запрос выполняется и выводите его
$posts = get_posts($args);
if(empty($posts)) {
echo "Нет постов с таким тегом.";
}
return $posts;
}
var_dump(testing());
Заключение
Если, после выполнения всех этих шагов, вы все равно не получаете ожидаемый результат, возможно, стоит проверить, не возникает ли конфликтов с другими плагинами или функциями темы. Также не забудьте проверить наличие ошибок в журнале отладчика WordPress.
Эти рекомендации должны помочь в диагностике и исправлении вашей ситуации с tax_query
. Если будет нужно, не стесняйтесь задавать дополнительные вопросы для более углубленной помощи.