Yamao
@Yamao
Я норм.

Как вывести дочерние категории через событие ajax?

Всем привет. У меня в проекте wordpress есть фильтр по категориям. Категории находятся в таксономии "business-listings-category". Вот часть моего фильтра....
<form action="" method="get">
    <p>
<?php
$terms = get_terms(
    'business-listings-category',
    array('parent' => 0,
        'hide_empty'=> false
        )
);
        ?>
        <select name="categoryfilter" ><option disabled="disabled" selected value="">Select a category...</option>';
            <?php
            foreach ( $terms as $term ) {
            echo '<option value="' . $term->term_id . '">' . $term->name . '</option>';
            }
            ?>
            </select>


В этом списке выводятся все родительские категории. Мне надо создать событие при помощи ajax. Что бы после выбора основной категории появлялся второй список и в нём все дочерние категории. С JS очень на "ВЫ". Если кто то может помочь полезной информацией или (в идеале) примером, буду очень благодарен.
  • Вопрос задан
  • 93 просмотра
Пригласить эксперта
Ответы на вопрос 1
rc-dm
@rc-dm
Full-Stack Web Developer
Тебе нужно повесить событие изменения (change) на select, затем отправить AJAX к серверному скрипту который вернёт JSON список дочерних категорий для только что выбранной категории.

Пример для JQuery:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title></title>
  </head>
  <body>

    <!-- Select родительских категорий -->
    <select name="categoryfilter">
      <option disabled="disabled" selected value="">Выберите категорию</option>
      <option value="1">Категория 1</option>
      <option value="2">Категория 2</option>
    </select>

    <!-- Select дочерних категорий -->
    <select name="subcategories"></select>

    <!-- Подключение JQuery для примера -->
    <script
        src="https://code.jquery.com/jquery-3.6.0.min.js"
        integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4="
        crossorigin="anonymous"></script>

    <!-- Логика клиентской части -->
    <script type="text/javascript">
      // Вешаем событие изменения на селект категорий
      $('select[name="categoryfilter"]').on('change', function(){
        let val = $(this).val(); // value только что выбранной категории
        $('select[name="categoryfilter"]').html(''); // Очищаем фильтр дочерних категорий

        //Запрашиваем данные
        $.ajax({
          url: '/path/to/file', // Путь к файлу PHP от корня сайта
          type: 'POST', // Отправляем данные методом POST
          dataType: 'json', // Ждём что сервер вернёт JSON
          data: {
            category: val, // Отправляем переменную 'category' со значением 'val'
          },
        })
        .done(function(data) {
          // Когда сервер вернул JSON
          // Перебираем данные циклом
          $.each(data, function(index, item) {
            // Добавляем внутрь select'а дочерних категорий новые опции
            $('select[name="subcategories"]').append('\
              <option value="' + item.id + '">' + item.name + '</option>\
            ');
          });
        })
        .fail(function() {
          // Любая ошибка
          console.log("error");
        })
        .always(function() {
          // Когда запрос завершился успешно или с ошибкой
          console.log("complete");
        });
      });
    </script>
  </body>
</html>


Неполная серверная часть на PHP:
<?php

	//Тут должна быть логика загрузки нужных дочерних
	//категорий согласно пришедшему значению 'category' ($_POST['category'])

	$subCategories = [
		[
			'id' => 1,
			'name' => 'Дочерняя категория 1',
		],
		[
			'id' => 2,
			'name' => 'Дочерняя категория 2',
		],
		[
			'id' => 3,
			'name' => 'Дочерняя категория 3',
		],
	];

	//json_encode превращяет массив PHP в JSON, который ждёт AJAX
	exit(json_encode($subCategories));
?>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 нояб. 2024, в 01:31
1000 руб./за проект
23 нояб. 2024, в 00:16
2000 руб./за проект