Пользовательские таксономии записей в качестве условий tax_query?

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

У меня есть два собственных типа записей, называемые «product» и «reference». К «references» я прикрепил пользовательскую таксономию под названием «product_reference», которую использую для указания, к каким продуктам относятся ссылки. К собственным записям «product» я прикрепил пользовательский модуль под названием «module-relevant-references» для получения ссылочных записей, относящихся к продукту.

Это может прозвучать немного запутанно в целом, поэтому я включил упрощенную картинку, чтобы описать настройку.
setup

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

  1. Определение текущего контекста:
    Поскольку модуль "relevant-references" находится в отдельном файле, важно убедиться, что вы получаете правильный ID продукта, с которым хотите работать. Убедитесь, что get_the_ID() возвращает ID именно того поста, с которого вы хотите извлечь термины таксономии. Возможно, в вашем файле требуется использовать метод передачи ID в функцию.

  2. Получение терминов "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 извлекает только слаги терминов для последующего использования в запросе.

  3. Конфигурация 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'
           ),
       )
    ));
  4. Убедитесь в правильной передаче данных:
    Проверьте, что ваш шаблон корректно передает ID поста, и данные передаются верно в "relevant-references" модуль. Возможно, потребуется задать ID явно или использовать глобальную переменную, чтобы гарантировать правильный контекст.

  5. Тестирование и отладка:
    Используйте функции, такие как var_dump или error_log, для проверки получаемых данных и корректности условий запроса. Убедитесь, что переменные содержат ожидаемые значения. Это поможет понять, на каком этапе возникают неполадки.

Применяя эти шаги, вы сможете динамически подгружать посты из кастомного типа "reference", основываясь на терминах таксономии, связанных с текущим продуктом. Надеюсь, данное решение поможет вам эффективно разрешить поставленную задачу без необходимости глобальной перестройки структуры.

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

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