Отобразить связанные CPT с пользовательской таксономией

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

У меня есть два пользовательских типа записей: “storefront_location” и “services”

Они связаны пользовательской таксономией “location”

Я создаю шаблон записи для “storefront_location” и хотел бы отобразить список записей “services”, связанных с любым данным магазином.

Что я пытаюсь достичь:

Запись “storefront-location”, Лондон, имеет категорию “london” (таксономия “location”). Я хотел бы, чтобы запись “storefront-location” Лондон отображала все “services”, которые также имеют категорию “london” (таксономия “location”). Пользователи могли бы затем кликнуть на каждую услугу, чтобы прочитать о ней, так как это типы записей.

Я пытаюсь получить информацию о таксономии текущей записи (Лондон) и использовать tax-query, чтобы найти все услуги, которые разделяют ту же таксономию с этой конкретной записью Лондон.

Примечание: это для фильтра WP_query в Elementor, поэтому дополнительный код для запроса Elementor взят из их урока здесь.

Я довольно нов в этом, так что может быть проблема новичка. Я пытался разобраться в этом по другим примерам кода здесь на stack exchange. Я был бы признателен за любую помощь!

add_action( 'elementor/query/my_filter', function( $query ) {
// получить местоположение записи storefront-location
   $custom_terms = wp_get_post_terms($post->ID, 'location');

if( $custom_terms ){

    // сохраняем параметры tax query
    $tax_query = array();


    // проходим по местоположениям и создаем tax query
    foreach( $custom_terms as $custom_term ) {

        $tax_query[] = array(
            'taxonomy' => 'location',
            'field' => 'slug',
            'terms' => $custom_term->slug,
        );

    }

    // объединяем все аргументы WP_Query
    $args = array( 'post_type' => 'services',
                    'posts_per_page' => -1,
                    'tax_query' => $tax_query );

    // наконец, выполняем запрос
    $loop = new WP_Query($args);

    if( $loop->have_posts() ) {

        while( $loop->have_posts() ) : $loop->the_post(); ?>

        

ИЗМЕНЕНИЕ: Для уточнения, код, показанный выше, кажется, вообще ничего не делает, когда добавляется в functions.php и при использовании 'my_filter' на виджете Записи. Поэтому запись Лондон показывает все "services", а не только услуги, отнесенные к местоположению "london."

Я строил что-то подобное пару лет назад, вот что я сделал, возможно, это поможет ... (изменено для вашего случая использования)

$result = new WP_Query([
    'post_type' => 'location',
    'orderby' => 'name',
    'order' => 'ASC',
    'posts_per_page' => -1, // все на одной странице
    'tax_query' => [
        [
            'taxonomy' => 'services',
            'field' => 'id',
            'terms' => $custom_term->term_id,
            'include_children' => true
        ]
    ]
]);

Так что вы уже довольно близки. Что я заметил, так это то, что вы используете $custom_term->slug, но должно быть $custom_term->term_id, насколько я знаю.

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

Для решения вашей задачи, связанной с выводом постов индивидуальных услуг, связанных с конкретным местоположением "storefront_location" в WordPress, важно учитывать правильную настройку WP_Query и использование таксономий. Давайте рассмотрим, как можно организовать код так, чтобы отобразить все посты "services", относящиеся к определенному местоположению, связанному с текущим постом "storefront_location".

Шаги по реализации

  1. Получение термина текущего поста: Вам нужно получить термины таксономии "location" для текущего поста "storefront_location". Это можно сделать с помощью функции wp_get_post_terms.

  2. Формирование запроса: Создайте новый объект WP_Query, который будет фильтровать посты "services" на основе полученных терминов.

  3. Проверка и вывод результатов: Проверьте, есть ли посты, и выведите их на экран.

Пример кода

Вот пример кода, который вы можете использовать в вашем файле functions.php, чтобы реализовать вышеописанную логику. Обратите внимание на исправления, включая использование $custom_term->term_id в tax_query.

add_action( 'elementor/query/my_filter', function( $query ) {
    // Получаем термины текущего поста "storefront_location"
    if ( is_singular('storefront_location') ) {
        global $post;

        // Получаем термины таксономии "location"
        $custom_terms = wp_get_post_terms($post->ID, 'location');

        // Если есть термины
        if( !empty($custom_terms) && !is_wp_error($custom_terms) ) {

            // Массив для хранения параметров таксономического запроса
            $tax_query = array('relation' => 'OR');

            // Проходим по терминам и формируем таксономический запрос
            foreach( $custom_terms as $custom_term ) {
                $tax_query[] = array(
                    'taxonomy' => 'location',
                    'field'    => 'term_id',
                    'terms'    => $custom_term->term_id, // Используем term_id
                );
            }

            // Параметры WP_Query
            $args = array(
                'post_type' => 'services',
                'posts_per_page' => -1,
                'tax_query' => $tax_query,
            );

            // Выполняем запрос
            $loop = new WP_Query($args);

            // Проверяем наличие постов и выводим их
            if( $loop->have_posts() ) {
                while( $loop->have_posts() ) {
                    $loop->the_post(); ?>
                    <div class="listing-title"><?php the_title(); ?></div>
                    <?php
                }
                wp_reset_postdata(); // Сброс данных поста
            } else {
                echo '<p>Услуги не найдены.</p>';
            }
        }
    }
});

Объяснение кода

  • Получение терминов: Мы используем wp_get_post_terms для извлечения всех терминов из таксономии "location" для текущего поста.

  • Проверка на ошибки: Убедитесь, что не возникло ошибок при получении терминов.

  • Формирование таксономического запроса: Создайте массив tax_query, который будет содержать условия для нахождения всех постов с нужными терминами из таксономии.

  • Запрос и вывод постов: Выполните запрос, а затем переберите посты, выводя заголовки на экран.

Заключение

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

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

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