В 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, можно сделать выпадающие списки таксономий, которые реагируют друг на друга без перезагрузки страницы. Например, при выборе производителя автоматически обновлять список моделей.
Основные шаги:
- Создать два селектора: для производителей и моделей.
- Подключить JavaScript с AJAX-запросом к серверу при изменении производителя.
- Обработать AJAX-запрос в WordPress, вернуть список моделей.
- Обновить список моделей на странице.
Пример 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, который содержит множество полезных дополнений для работы с таксономиями и оптимизацией.