wplinks.ru wordpress WPLinks.ru

Как создать динамические связи между таксономиями в WordPress

В WordPress стандартно таксономии (категории, метки и пользовательские таксономии) работают независимо друг от друга. Но иногда возникает задача связать объекты из разных таксономий — например, чтобы при выборе термина из одной таксономии автоматически фильтровались или отображались связанные термины из другой. Такая функциональность полезна для сложных каталогов, магазинов, новостных сайтов и других проектов с большим объемом контента.

Что такое динамические связи между таксономиями и зачем они нужны

Динамические связи — это когда выбор термина в одной таксономии влияет на выбор и отображение терминов в другой таксономии. Например, в каталоге техники есть таксономии «Производитель» и «Модель». При выборе производителя нужно показывать только модели этого производителя, а не все подряд.

Стандартный функционал WordPress не позволяет напрямую связать термины разных таксономий, но мы можем создать такую логику с помощью программирования и базы данных.

В этой статье рассмотрим, как:

  • создать связь между терминами таксономий;
  • автоматизировать фильтрацию и отображение связанных терминов;
  • использовать AJAX для динамического обновления списков в админке и на фронтенде;
  • привести примеры кода для практического использования.

Как связать термины разных таксономий в WordPress

Самый простой способ — использовать метаполя терминов, чтобы хранить в одном термине ссылку на связанные термины другой таксономии. Например, в терминах таксономии «Модель» хранить ID производителя.

Для этого можно использовать функцию add_term_meta и соответствующие функции для чтения мета.

Пример кода для добавления метаполя при создании модели:

function wplinks_add_manufacturer_meta_to_model( $term_id, $tt_id, $taxonomy ) {
    if ( 'model' === $taxonomy && isset( $_POST['manufacturer_id'] ) ) {
        $manufacturer_id = intval( $_POST['manufacturer_id'] );
        add_term_meta( $term_id, 'wplinks_manufacturer_id', $manufacturer_id, true );
    }
}
add_action( 'created_term', 'wplinks_add_manufacturer_meta_to_model', 10, 3 );

Здесь мы при создании термина таксономии model сохраняем мета с ID производителя.

Для обновления метаполя используйте аналогичный хук edited_term.

Вывод связанных терминов на фронтенде

Чтобы вывести модели конкретного производителя, нужно получить все модели, у которых метаполе wplinks_manufacturer_id равно ID выбранного производителя.

Пример запроса:

$manufacturer_id = 123; // ID выбранного производителя
$args = [
    'taxonomy' => 'model',
    'hide_empty' => false,
    'meta_query' => [
        [
            'key' => 'wplinks_manufacturer_id',
            'value' => $manufacturer_id,
            'compare' => '=',
        ],
    ],
];
$models = get_terms( $args );

foreach ( $models as $model ) {
    echo '<li>' . esc_html( $model->name ) . '</li>';
}

Так вы динамически получите все модели для выбранного производителя.

Динамическая фильтрация таксономий с помощью AJAX

Чтобы улучшить UX, можно сделать выпадающие списки таксономий, которые реагируют друг на друга без перезагрузки страницы. Например, при выборе производителя автоматически обновлять список моделей.

Основные шаги:

  1. Создать два селектора: для производителей и моделей.
  2. Подключить JavaScript с AJAX-запросом к серверу при изменении производителя.
  3. Обработать AJAX-запрос в WordPress, вернуть список моделей.
  4. Обновить список моделей на странице.

Пример JavaScript для AJAX

jQuery(document).ready(function($){
    $('#manufacturer-select').on('change', function(){
        var manufacturer_id = $(this).val();
        $.ajax({
            url: wplinks_ajax_object.ajax_url,
            method: 'POST',
            data: {
                action: 'wplinks_get_models',
                manufacturer_id: manufacturer_id
            },
            success: function(response) {
                var modelsSelect = $('#model-select');
                modelsSelect.empty();
                if(response.success) {
                    $.each(response.data, function(index, model) {
                        modelsSelect.append('<option value="' + model.term_id + '">' + model.name + '</option>');
                    });
                } else {
                    modelsSelect.append('<option>Нет моделей</option>');
                }
            }
        });
    });
});

PHP-обработчик AJAX-запроса

function wplinks_ajax_get_models() {
    $manufacturer_id = isset( $_POST['manufacturer_id'] ) ? intval( $_POST['manufacturer_id'] ) : 0;
    if ( ! $manufacturer_id ) {
        wp_send_json_error();
    }

    $models = get_terms([
        'taxonomy' => 'model',
        'hide_empty' => false,
        'meta_query' => [
            [
                'key' => 'wplinks_manufacturer_id',
                'value' => $manufacturer_id,
                'compare' => '=',
            ],
        ],
    ]);

    if ( is_wp_error( $models ) || empty( $models ) ) {
        wp_send_json_error();
    }

    $data = [];
    foreach ( $models as $model ) {
        $data[] = [
            'term_id' => $model->term_id,
            'name' => $model->name,
        ];
    }

    wp_send_json_success( $data );
}
add_action( 'wp_ajax_wplinks_get_models', 'wplinks_ajax_get_models' );
add_action( 'wp_ajax_nopriv_wplinks_get_models', 'wplinks_ajax_get_models' );

Автоматизация и удобство: редактирование метаданных терминов

Чтобы в админке удобно ставить связь производителя для модели, можно добавить поле в форму создания и редактирования терминов таксономии model.

Пример добавления поля:

function wplinks_add_manufacturer_field() {
    $manufacturers = get_terms([
        'taxonomy' => 'manufacturer',
        'hide_empty' => false,
    ]);
    ?>
    <div class="form-field term-group">
        <label for="manufacturer_id">Производитель</label>
        <select name="manufacturer_id" id="manufacturer_id">
            <option value="">Выберите производителя</option>
            <?php foreach ($manufacturers as $manufacturer) : ?>
                <option value="<?php echo esc_attr($manufacturer->term_id); ?>"><?php echo esc_html($manufacturer->name); ?></option>
            <?php endforeach; ?>
        </select>
    </div>
    <?php
}
add_action( 'model_add_form_fields', 'wplinks_add_manufacturer_field', 10, 2 );

function wplinks_edit_manufacturer_field( $term ) {
    $manufacturers = get_terms([
        'taxonomy' => 'manufacturer',
        'hide_empty' => false,
    ]);
    $manufacturer_id = get_term_meta( $term->term_id, 'wplinks_manufacturer_id', true );
    ?>
    <tr class="form-field term-group-wrap">
        <th scope="row"><label for="manufacturer_id">Производитель</label></th>
        <td>
            <select name="manufacturer_id" id="manufacturer_id" class="postform">
                <option value="">Выберите производителя</option>
                <?php foreach($manufacturers as $manufacturer) : ?>
                    <option value="<?php echo esc_attr($manufacturer->term_id); ?>" <?php selected($manufacturer_id, $manufacturer->term_id); ?>><?php echo esc_html($manufacturer->name); ?></option>
                <?php endforeach; ?>
            </select>
        </td>
    </tr>
    <?php
}
add_action( 'model_edit_form_fields', 'wplinks_edit_manufacturer_field', 10, 2 );

Вывод

Создание динамических связей между таксономиями — мощный способ расширить возможности WordPress для сложных проектов. Использование метаполей терминов и AJAX позволяет строить гибкие интерфейсы выбора и отображения контента.

Если нужно получить готовый инструмент для создания подобных связей и автоматизации — рекомендую посмотреть на плагин Clearfy Pro, который содержит множество полезных дополнений для работы с таксономиями и оптимизацией.

×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше