Как выбрать родительскую категорию и показать дочерние категории для выбора в другом выпадающем списке?

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

Как выбрать родительскую категорию и показать детей для выбора в другом select?

это код (родительская таксономия)

<select>
<option value=""><?php esc_html_e('Selecciona País', 'eltd-tours'); ?></option>
        <?php 
            //Listado de taxonomias por país
            $tax_terms = get_terms(array(
            'taxonomy' => 'tipo_pais',
            'hide_empty' => false,
            'hierarchical' => true,
            'orderby'    => 'parent',
            'fields' => 'all',
            'parent' => '0',                    ) );
            foreach ($tax_terms as $tax_term) {?>
            <option value=""><?php echo $tax_term->name;?></option>
        <?php }?>

</select>

мне нужен код для дочерней таксономии, помогите, пожалуйста!

Если я правильно вас понял, вы хотите иметь два select, один для родительских терминов и другой для дочерних терминов, которые будут динамически заполняться на основе выбора родителя. Верно?

Сначала вам понадобится разметка html для элементов select.

<select name="parent_term">
  <option value=""><?php esc_html_e('Selecciona País', 'eltd-tours'); ?></option>
  <?php echo implode( '', my_select_options( my_parent_tax_terms('tipo_pais') ) ); ?>
</select>

<select name="child_term"></select>

Вот вспомогательные функции, которые я использовал, чтобы сделать html немного чище.

function my_parent_tax_terms( string $taxonomy ) {
  $terms = get_terms(array(
    'taxonomy'     => $taxonomy,
    'hide_empty'   => false,
    'hierarchical' => true,
    'orderby'      => 'parent',
    'fields'       => 'all',
    'parent'       => '0',
  ) );
  return ( $terms && is_array($terms) ) ? $terms: array();
}

function my_select_options( array $terms ) {
  $out = array();
  foreach ($terms => $term) {
    $out[] = sprintf(
      '<option value="%d">%s</option>',
      $term->term_id,
      $term->name
    );
  }
  return $out;
}

Затем добавьте обработчик событий для родительского термина select, чтобы он заполнял дочерний термин select при изменении выбора родителя. Вы можете сделать это с помощью jQuery или обычного javascript.

jQuery(document).on('ready', function(){
  // populate child term select, when parent selection changes
  jQuery('select[name="parent_term"]').on('change', function(){
    // get child terms select element
    var $child_select = jQuery('select[name="child_term"]');
    // clear any previous options
    jQuery($child_select).empty();
    // get new options
    var $child_options = get_child_terms_from_admin_ajax_or_WP_REST_or_localized_script();
    // loop options to append them to the child select
    for (i = 0; i < $child_options.length; i++) {
      jQuery($child_select).append(`<option value="${$child_options[i].value}">${$child_options[i].name}</option>`);
    }    
  });  
});

Обратите внимание, что дочерние термины должны откуда-то поступать. Это может быть либо устаревший admin-ajax, более современный WP REST API, или вы даже можете создать большой конфигурационный массив с родительскими терминами и их дочерними терминами, а затем сделать его доступным для jQuery/js с помощью wp_localize_script().

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

Конечно, эффективная реализация функционала выбора родительской категории и динамического отображения дочерних категорий — это важная задача в разработке веб-проектов на базе WordPress. Рассмотрим детально, как можно реализовать эту функцию.

Шаг 1: Создание HTML-шаблона с двумя элементами <select>

Во-первых, мы создадим два элемента <select>: один для выбора родительской категории (например, страны), и второй, который будет динамически заполняться дочерними категориями (например, городами).

<select name="parent_term">
  <option value=""><?php esc_html_e('Selecciona País', 'eltd-tours'); ?></option>
  <?php echo implode( '', my_select_options( my_parent_tax_terms('tipo_pais') ) ); ?>
</select>

<select name="child_term"></select>

Шаг 2: Создание вспомогательных функций

Теперь создадим две вспомогательные функции в PHP, которые помогут получить термины для элементов <select>.

function my_parent_tax_terms( string $taxonomy ) {
    $terms = get_terms(array(
        'taxonomy'     => $taxonomy,
        'hide_empty'   => false,
        'hierarchical' => true,
        'orderby'      => 'parent',
        'fields'       => 'all',
        'parent'       => 0,
    ));
    return is_array($terms) ? $terms : array();
}

function my_select_options( array $terms ) {
    $out = array();
    foreach ($terms as $term) {
        $out[] = sprintf(
            '<option value="%d">%s</option>',
            $term->term_id,
            esc_html($term->name)
        );
    }
    return $out;
}

Шаг 3: JavaScript для динамического обновления второго <select>

Используем jQuery для мониторинга изменений в первом элементе <select> и обновления второго.

jQuery(document).ready(function(){
    jQuery('select[name="parent_term"]').on('change', function(){
        var selectedParentId = jQuery(this).val();
        var $childSelect = jQuery('select[name="child_term"]');
        $childSelect.empty();

        if(selectedParentId) {
            jQuery.ajax({
                url: 'your-server-endpoint-url',  // замените на ваш URL для AJAX запроса
                method: 'POST',
                data: { parent_id: selectedParentId },
                success: function(response) {
                    response.forEach(function(child){
                        $childSelect.append(`<option value="${child.id}">${child.name}</option>`);
                    });
                }
            });
        }
    });
});

Шаг 4: Получение дочерних элементов через AJAX или REST API

Для получения дочерних элементов используйте либо AJAX, либо WP REST API. Создайте серверный обработчик, который будет возвращать массив дочерних терминов в формате JSON. Например, так может выглядеть обработчик AJAX:

add_action('wp_ajax_get_child_terms', 'get_child_terms');
add_action('wp_ajax_nopriv_get_child_terms', 'get_child_terms');

function get_child_terms() {
    $parent_id = intval($_POST['parent_id']);
    $terms = get_terms(array(
        'taxonomy' => 'tipo_pais',
        'hide_empty' => false,
        'parent' => $parent_id
    ));

    $output = array();
    foreach ($terms as $term) {
        $output[] = array('id' => $term->term_id, 'name' => esc_html($term->name));
    }
    wp_send_json($output);
}

Убедитесь, что в ваших скриптах прописаны правильные пути и они загружаются при загрузке страницы. Это обеспечит корректную работу функционала.

Заключение

Этот метод позволяет создать динамический и интерактивный интерфейс для пользователя. Такая реализация на базе AJAX или REST API делает сайт более отзывчивым и улучшает пользовательский опыт. Учитывайте безопасность запросов и авторизацию, если необходимо, чтобы информация не могла быть изменена злоумышленниками.

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

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