Вопрос или проблема
Я перефразирую свой вопрос, потому что мне кажется, что я не могу быть понятым:
Я создал шаблонную страницу, на которой у меня есть разные 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 для изменения логики связывания таксономий.
Шаги для решения проблемы
-
Получите идентификатор родительской таксономии: Вы уже это сделали. Получив ID категории "языки", вы сможете формировать дочерние термины.
-
Создание массива языковых терминов: Убедитесь, что ваш массив языков верно собирается. В вашем коде это сделано корректно.
-
Обновление 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. Вы также можете добавить дополнительные условия для улучшения производительности и точности запросов.