Получите налоговый термин, в котором находится пост через wp_query.

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

Я перефразирую свой вопрос, потому что мне кажется, что я не могу быть понятым:
Я создал шаблонную страницу, на которой у меня есть разные WP_Query.
У меня есть таксономия категорий (страны). Эта шаблонная страница соответствует одному из терминов этой таксономии.

Например, страница Франция соответствует термин категории

$countries->france

Администратор имеет возможность, если захочет, создать перевод, который будет отображаться на том же шаблоне страницы.

Эти переведенные посты будут иметь ту же категорию $countries->france, но также с другой (например):

$language->english

Что бы я хотел сделать сейчас, так это проверить, есть ли совпадающий пост с терминами категорий france и english, и если да, вернуть термин языка (english) или любой другой, если он существует.

Например, у меня есть этот запрос:

// Получаем ID термина категории языка
$parent_id = get_cat_ID( 'languages' );
// Получаем дочерние термины языка
$languages = get_term_children( $parent_id, 'category' );
// Помещаем их в массив для запроса
$langs = array();
foreach ( $languages as $key => $value ) {
    $cat = get_category( $value, ARRAY_A );
    $langs[] = $cat['slug'];
}
// Запрос
$langQuery = new WP_Query( array(
    'post_type' => 'post',
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy'     => 'category',
            'category__in' => array( 'countries' ),
            'parent'       => '1',
            'field'        => 'slug',
            'terms'        => array( $cat[0] ) // slug страницы
        ),
        array(
            'taxonomy'     => 'category',
            'category__in' => array( 'languages' ),
            'parent'       => '1',
            'field'        => 'slug',
            'terms'        => $langs
        )
    )
) );

Спасибо за помощь

Когда вы проверяете свой SQL-запрос сразу после его выполнения

$GLOBALS['wp_query']->last_query

вы увидите, что SQL-запрос требует AND. Перейдите к фильтру posts_where или posts_clauses (где вам нужно посмотреть значение ключа where) и измените его на OR.

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

Чтобы проверить наличие постов, относящихся к терминам таксономии "страны" и "языки", вам нужно внести некоторые изменения в ваш запрос WP_Query. Ваша задача состоит в том, чтобы найти посты, которые соответствуют термину "франция" и также являются переведёнными на "английский". Решение этой проблемы включает настройку tax_query и использование фильтров в WordPress для изменения логики связывания таксономий.

Шаги для решения проблемы

  1. Получите идентификатор родительской таксономии: Вы уже это сделали. Получив ID категории "языки", вы сможете формировать дочерние термины.

  2. Создание массива языковых терминов: Убедитесь, что ваш массив языков верно собирается. В вашем коде это сделано корректно.

  3. Обновление WP_Query: Вам следует изменить операцию AND на OR для таксономических запросов, чтобы находить посты с любым из указанных языков.

Изменение кода

Вот переработанный вариант вашего запроса, который будет делать что нужно:

// Получаем ID родительской категории
$parent_id = get_cat_ID('languages');
// Получаем дочерние термины языков
$languages = get_term_children($parent_id, 'category');
$langs = array();
foreach ($languages as $value) {
    $cat = get_category($value, ARRAY_A);
    $langs[] = $cat['slug'];
}

// Основной запрос
$langQuery = new WP_Query(array(
    'post_type' => 'post',
    'tax_query' => array(
        'relation' => 'AND', // Используем AND для первого условия
        array(
            'taxonomy' => 'category',
            'field' => 'slug',
            'terms' => 'france', // Термин "франция"
        ),
        array(
            'taxonomy' => 'category',
            'field' => 'slug',
            'terms' => $langs,
            'operator' => 'IN', // Параметр для соответствия одному из языков
        ),
    )
));

// Проверка наличия постов
if ($langQuery->have_posts()) {
    while ($langQuery->have_posts()) {
        $langQuery->the_post();
        // Извлечение информации о посте
        $term_list = get_the_terms(get_the_ID(), 'category');
        foreach ($term_list as $term) {
            if (in_array($term->slug, $langs)) {
                echo 'Найден переведенный пост на ' . $term->name; // Здесь выводим найденный язык
            }
        }
    }
}
wp_reset_postdata();

Пояснения к изменениям

  • Оператор ‘IN’: Позволяет вам искать посты, которые относятся к любому из указанных языков. Однако нам нужно также проверить, что посты относятся к "франции".

  • Цикл по постам: Для каждого поста вы извлекаете термины и проверяете, есть ли соответствие языку. В случае совпадения выводите информацию о найденном языке.

Использование фильтров

Если вам действительно нужно изменить операцию с AND на OR, то вот как это можно сделать с фильтрами:

add_filter('posts_clauses', 'modify_tax_query_relation', 10, 2);

function modify_tax_query_relation($clauses, $query) {
    if (isset($query->query_vars['tax_query'])) {
        // Меняем оператор на OR
        $clauses['where'] = str_replace('AND', 'OR', $clauses['where']);
    }
    return $clauses;
}

Заключение

С этим кодом вы сможете проверить наличие постов с соответствующими терминами таксономии "страны" и "языки". Убедитесь, что адаптируете код под собственные нужды и протестируете его в вашей среде WordPress. Вы также можете добавить дополнительные условия для улучшения производительности и точности запросов.

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

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