Вопрос или проблема
Я использую WordPress 3.5. Мне нужен способ реализовать код или плагин, чтобы пользователи могли проходить по постам, используя зависимые (связанные) выпадающие списки.
Другими словами, я хотел бы, чтобы 3 выпадающих меню заполнялись динамически на основе выбора, сделанного в предыдущих выпадающих списках.
Это будет состоять из:
Выпадающий список 1: Категория*
Выпадающий список 2: Подкатегория*
Выпадающий список 3: Список постов в подкатегории*
*Выпадающий список 1 будет предварительно заполнен категориями.
*Выпадающий список 2 будет перечислять подкатегории меню 1 на основе выбора пользователя.
*Выпадающий список 3 будет перечислять посты в подкатегории, выбранной в меню 2.
Чтобы помочь вам понять лучше, на моем сайте есть категория “Сериалы”, которая имеет подкатегории (дочерние) другие сериалы, такие как “Декстер”, “CSI:Майами” и т.д.
Сериалы также имеют другие подкатегории (дочерние) по количеству сезонов, такие как:
1. "Сезон 1"
2. "Сезон 2"
3. "Сезон N".
Каждый сезон содержит соответствующие посты.
Иерархия выглядит так:
Сериалы (главная категория)
Декстер
Сезон 1
Сезон 2
Сезон n
CSI:Майами
1. Сезон 1
2. Сезон 2
3. Сезон n
Так что, например, динамические выпадающие списки, которые я хотел бы использовать, следующие:
Выпадающий список 1: Выберите ТВ шоу (категория)
Выпадающий список 2: Выберите сезон (подкатегория)
Выпадающий список 3: Выберите эпизод (посты)
Я искал в интернете последние несколько дней без каких-либо результатов.
Я уже пробовал плагин под названием Category Ajax Chain Selects, но он устарел и не работает должным образом.
вы можете найти свой ответ здесь и вот демо этого.
Пример HTML кода
<div class="ccms_form_element cfdiv_custom" id="style_container_div">
<label for="brand">Марка:</label>
<select size="1" id="make" class=" validate['required']" title="" onChange="updatepage();" type="select" name="style">
<option value="-1">–Выберите марку-</option>
<option class="Audio" value="Audi">Audi</option>
<option class="BMW" value="BMW">BMW</option>
</select>
<div class="clear"></div><div id="error-message-style"></div>
<div id="style-sub-1" class="BMW" style="display: none;" name="stylesub1" onchange="ChangeDropdowns(this.value)">
<label for="brand">Модель:</label>
<select name="cat" id="cat" class="postform">
<option value="-1">–Выберите модель-</option>
<option class="level-0" value="172">1 серия</option>
<option class="level-0" value="173">2 серия</option>
<option class="level-0" value="106">3 серия</option>
</select>
</div>
<div id="style-sub-1" class="Audi" style="display: none;" name="stylesub1" onchange="ChangeDropdowns(this.value)">
<label for="brand">Модель:</label>
<select name="cat" id="cat" class="postform">
<option value="-1">–Выберите модель-</option>
<option class="level-0" value="169">A1</option>
<option class="level-0" value="170">A3</option>
<option class="level-0" value="171">A4</option>
</select>
</div>
<div class="clear"></div>
<div id="error-message-style-sub-1"></div></div>
JS код
$("#make").change ( function () {
var targID = $(this).val ();
$("div#style-sub-1").hide ();
$('.' + targID).show ();
});
вы должны рассмотреть возможность включения jQuery и перемещения кода из функции, чтобы он вызывался.
<!-- Ваш файл шаблона (например, page-template.php) -->
<form action="#" method="post">
<label for="tv-show-dropdown">Выберите ТВ шоу:</label>
<select name="tv-show" id="tv-show-dropdown">
<?php
$tv_shows = get_terms(array('taxonomy' => 'tv_show', 'hide_empty' => false));
foreach ($tv_shows as $tv_show) {
echo '<option value="' . $tv_show->term_id . '">' . $tv_show->name . '</option>';
}
?>
</select>
<label for="season-dropdown">Выберите сезон:</label>
<select name="season" id="season-dropdown"></select>
<label for="episode-dropdown">Выберите эпизод:</label>
<select name="episode" id="episode-dropdown"></select>
</form>
// Добавить JS скрипт
jQuery(document).ready(function ($) {
$('#tv-show-dropdown').change(function () {
var selectedShow = $(this).val();
$.ajax({
url: ajaxurl,
type: 'POST',
data: {
action: 'load_dropdown_options',
taxonomy: 'season',
parent_id: selectedShow,
},
success: function (response) {
$('#season-dropdown').html('');
$.each(response.data, function (key, value) {
$('#season-dropdown').append('<option value="' + value.term_id + '">' + value.name + '</option>');
});
}
});
});
$('#season-dropdown').change(function () {
var selectedSeason = $(this).val();
$.ajax({
url: ajaxurl,
type: 'POST',
data: {
action: 'load_dropdown_options',
taxonomy: 'episode',
parent_id: selectedSeason,
},
success: function (response) {
$('#episode-dropdown').html('');
$.each(response.data, function (key, value) {
$('#episode-dropdown').append('<option value="' + value.term_id + '">' + value.name + '</option>');
});
}
});
});
});
// functions.php
function create_custom_taxonomies() {
register_taxonomy('tv_show', 'post', array(
'label' => 'ТВ Шоу',
'hierarchical' => true,
'public' => true,
'show_ui' => true,
));
register_taxonomy('season', 'post', array(
'label' => 'Сезоны',
'hierarchical' => true,
'public' => true,
'show_ui' => true,
));
}
add_action('init', 'create_custom_taxonomies');
Создайте AJAX-эндпоинт для обработки динамических обновлений выпадающего списка. Добавьте следующий код в свой файл functions.php.
// functions.php
function load_dropdown_options() {
$taxonomy = isset($_POST['taxonomy']) ? sanitize_text_field($_POST['taxonomy']) : '';
$parent_id = isset($_POST['parent_id']) ? intval($_POST['parent_id']) : 0;
$options = get_terms(array(
'taxonomy' => $taxonomy,
'parent' => $parent_id,
'hide_empty' => false,
));
wp_send_json_success($options);
}
add_action('wp_ajax_load_dropdown_options', 'load_dropdown_options');
add_action('wp_ajax_nopriv_load_dropdown_options', 'load_dropdown_options');
Ответ или решение
Чтобы внедрить динамические зависимые выпадающие списки в WordPress версии 3.5, мы используем JavaScript и функцию AJAX для взаимодействия с сервером. В рамках данной реализации мы создадим три выпадающих списка: категории, подкатегории и посты, которые строятся на основе выборов пользователя. Приведенный ниже пример кода продемонстрирует, как это сделать, начиная с создания пользовательских таксономий до реализации функциональности на странице с помощью JavaScript и PHP.
Шаг 1: Регистрация пользовательских таксономий
В вашем файле functions.php
, зарегистрируйте свои таксономии для телевизионных шоу и сезонов:
function create_custom_taxonomies() {
register_taxonomy('tv_show', 'post', array(
'label' => 'Телевизионные шоу',
'hierarchical' => true,
'public' => true,
'show_ui' => true,
));
register_taxonomy('season', 'post', array(
'label' => 'Сезоны',
'hierarchical' => true,
'public' => true,
'show_ui' => true,
));
}
add_action('init', 'create_custom_taxonomies');
Шаг 2: Создание AJAX эндпоинта
Добавьте следующий код в functions.php
, чтобы создать обработчик PHP для AJAX-запросов, который будет возвращать подкатегории и посты:
function load_dropdown_options() {
$taxonomy = isset($_POST['taxonomy']) ? sanitize_text_field($_POST['taxonomy']) : '';
$parent_id = isset($_POST['parent_id']) ? intval($_POST['parent_id']) : 0;
$options = get_terms(array(
'taxonomy' => $taxonomy,
'parent' => $parent_id,
'hide_empty' => false,
));
wp_send_json_success($options);
}
add_action('wp_ajax_load_dropdown_options', 'load_dropdown_options');
add_action('wp_ajax_nopriv_load_dropdown_options', 'load_dropdown_options');
Шаг 3: HTML разметка для выпадающих списков
Теперь вы можете добавить HTML-код на страницу (например, в вашем шаблоне page-template.php
):
<form action="#" method="post">
<label for="tv-show-dropdown">Выберите телевизионное шоу:</label>
<select name="tv-show" id="tv-show-dropdown">
<?php
$tv_shows = get_terms(array('taxonomy' => 'tv_show', 'hide_empty' => false));
foreach ($tv_shows as $tv_show) {
echo '<option value="' . $tv_show->term_id . '">' . $tv_show->name . '</option>';
}
?>
</select>
<label for="season-dropdown">Выберите сезон:</label>
<select name="season" id="season-dropdown"></select>
<label for="episode-dropdown">Выберите эпизод:</label>
<select name="episode" id="episode-dropdown"></select>
</form>
Шаг 4: JavaScript для динамического обновления
Добавьте следующий JavaScript код, чтобы обработать выбор пользователя и запрашивать данные через AJAX:
jQuery(document).ready(function ($) {
$('#tv-show-dropdown').change(function () {
var selectedShow = $(this).val();
$.ajax({
url: ajaxurl,
type: 'POST',
data: {
action: 'load_dropdown_options',
taxonomy: 'season',
parent_id: selectedShow,
},
success: function (response) {
$('#season-dropdown').html('');
$.each(response.data, function (key, value) {
$('#season-dropdown').append('<option value="' + value.term_id + '">' + value.name + '</option>');
});
}
});
});
$('#season-dropdown').change(function () {
var selectedSeason = $(this).val();
$.ajax({
url: ajaxurl,
type: 'POST',
data: {
action: 'load_dropdown_options',
taxonomy: 'episode',
parent_id: selectedSeason,
},
success: function (response) {
$('#episode-dropdown').html('');
$.each(response.data, function (key, value) {
$('#episode-dropdown').append('<option value="' + value.term_id + '">' + value.name + '</option>');
});
}
});
});
});
Шаг 5: Интеграция и тестирование
Убедитесь, что ваш файл functions.php
правильно подключается, и добавьте необходимые стили для выпадающих списков. После этого протестируйте выпадающие списки на вашей странице. Выберите телевизионное шоу, и посмотрите, чтобы сезон обновлялся в зависимости от вашего выбора, а затем посты по выбранному сезону.
Заключение
С помощью этого подхода вы сможете создать динамические зависимые выпадающие списки на вашем сайте WordPress, которые улучшат пользовательский интерфейс и навигацию по вашему контенту. Правильная реализация AJAX и работа с таксономиями позволяют легко управлять зависимыми данными. Не забудьте протестировать функциональность на различных устройствах для обеспечения наилучшего пользовательского опыта.