Вопрос или проблема
У меня есть два собственных типа записей, называемые «product» и «reference». К «references» я прикрепил пользовательскую таксономию под названием «product_reference», которую использую для указания, к каким продуктам относятся ссылки. К собственным записям «product» я прикрепил пользовательский модуль под названием «module-relevant-references» для получения ссылочных записей, относящихся к продукту.
Это может прозвучать немного запутанно в целом, поэтому я включил упрощенную картинку, чтобы описать настройку.
Мне нужно собрать три соответствующих сообщения «reference» в модуль «relevant references» (скорее всего, с параметром фильтра tax_query
WP_Query), но мне не удалось достичь этого предусмотренным способом.
Фильтрация с WP_Query
работает, если я заполняю термины tax_query
вручную, как в приведенном ниже фрагменте кода (категория_продукта 1, 2 и 3):
$the_query = new WP_Query(array(
'post_type' => 'reference',
'post_status' => 'publish',
'post__not_in' => array( get_the_ID() ),
'orderby' => 'date',
'order' => 'DESC',
'posts_per_page' => 3,
'tax_query' => array(
array(
'taxonomy' => 'product_reference',
'field' => 'slug',
'terms' => array(
'product_category1',
'product_category2',
'product_category3'
),
'hide_empty' => true,
'include_children' => true,
'operator' => 'IN'
),
)
));
Однако мне нужно, чтобы это работало динамически, получая термины «product_reference» из всех соответствующих ссылок в виде массива. Модуль relevant-references и шаблон reference находятся в разных файлах.
Я попытался использовать функцию get_the_terms
в PHP файле модуля, но она не может собрать информацию из ссылки и возвращает «bool(false)».
var_dump(get_the_terms(get_the_ID(), 'product_reference'));
wp_get_object_terms
или wp_get_post_terms
тоже не помогли, и оба вернули array(0) { }.
Итак, мой вопрос: Как правильным образом с такой настройкой получить соответствующие записи ссылок, отфильтровав по терминам «product_reference»?
Я открыт для совершенно других подходов, но на данном этапе я бы предпочел не перестраивать всю структуру, если это возможно.
Спасибо за любую помощь!
Пример того, как это сделать, есть в официальной документации для WP_Query
:
https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters
В частности, путем объявления нескольких элементов в tax_query
и установки их отношения:
Отобразить записи, которые находятся в категории quotes ИЛИ имеют формат записи quote:
$args = array( 'post_type' => 'post', 'tax_query' => array( 'relation' => 'OR', array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => array( 'quotes' ), ), array( 'taxonomy' => 'post_format', 'field' => 'slug', 'terms' => array( 'post-format-quote' ), ), ), ); $query = new WP_Query( $args );
.
Ответ или решение
Для решения вопроса с динамическим выводом "reference" постов, связанных с определенными "product_reference" терминами, необходимо сначала понять, как интегрировать данные термины в вашу WP_Query. Проблема, с которой вы столкнулись, заключается в том, что функции get_the_terms
, wp_get_object_terms
и wp_get_post_terms
не возвращают ожидаемых результатов в связи с неверным контекстом вызова. Давайте подробно рассмотрим шаги, которые помогут вам решить эту задачу.
-
Определение текущего контекста:
Поскольку модуль "relevant-references" находится в отдельном файле, важно убедиться, что вы получаете правильный ID продукта, с которым хотите работать. Убедитесь, чтоget_the_ID()
возвращает ID именно того поста, с которого вы хотите извлечь термины таксономии. Возможно, в вашем файле требуется использовать метод передачи ID в функцию. -
Получение терминов "product_reference":
Вместо функцииget_the_terms
, попробуйте использовать следующую конструкцию для получения терминов таксономии для текущего продукта:$product_id = get_the_ID(); // Или другой способ получения ID текущего поста $terms = get_the_terms($product_id, 'product_reference'); if ($terms && !is_wp_error($terms)) { $term_slugs = wp_list_pluck($terms, 'slug'); } else { $term_slugs = array(); }
Здесь функция
wp_list_pluck
извлекает только слаги терминов для последующего использования в запросе. -
Конфигурация WP_Query с динамичным tax_query:
После получения массиваterm_slugs
, воспользуйтесь данным массивом для динамического формирования запроса:$the_query = new WP_Query(array( 'post_type' => 'reference', 'post_status' => 'publish', 'post__not_in' => array($product_id), 'orderby' => 'date', 'order' => 'DESC', 'posts_per_page' => 3, 'tax_query' => array( array( 'taxonomy' => 'product_reference', 'field' => 'slug', 'terms' => $term_slugs, 'include_children' => true, 'operator' => 'IN' ), ) ));
-
Убедитесь в правильной передаче данных:
Проверьте, что ваш шаблон корректно передает ID поста, и данные передаются верно в "relevant-references" модуль. Возможно, потребуется задать ID явно или использовать глобальную переменную, чтобы гарантировать правильный контекст. -
Тестирование и отладка:
Используйте функции, такие какvar_dump
илиerror_log
, для проверки получаемых данных и корректности условий запроса. Убедитесь, что переменные содержат ожидаемые значения. Это поможет понять, на каком этапе возникают неполадки.
Применяя эти шаги, вы сможете динамически подгружать посты из кастомного типа "reference", основываясь на терминах таксономии, связанных с текущим продуктом. Надеюсь, данное решение поможет вам эффективно разрешить поставленную задачу без необходимости глобальной перестройки структуры.