Я не могу сделать так, чтобы tax_query в get_posts() работал с пользовательской таксономией.

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

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

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

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