Найти в Дзене

Как сделать фильтрацию ACF блоков мероприятий на странице по дате, выбранной в календаре

Оглавление

Если у вас на сайте используются блоки ACF для вывода мероприятий, то бывает необходимо добавить возможность фильтрации этих мероприятий по дате. Например, пользователь выбирает дату в календаре, и на странице отображаются только те мероприятия, которые запланированы на эту дату. В этой статье я покажу, как реализовать такую функциональность на сайте WordPress.

Что нужно для реализации:

  1. Advanced Custom Fields (ACF) — для создания блоков мероприятий с датами.
  2. JavaScript (или jQuery) — для обработки кликов по датам календаря и отправки AJAX-запросов.
  3. AJAX на стороне WordPress — для фильтрации и получения мероприятий на сервере.

Шаг 1. Создание ACF полей для мероприятий

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

  • Дата мероприятия (тип поля: Date Picker).
  • Название мероприятия (тип поля: Text).
  • Описание мероприятия (тип поля: Textarea).

Пример структуры полей ACF:

  1. event_name — Название мероприятия.
  2. event_description — Описание мероприятия.
  3. event_date — Дата мероприятия.

Шаг 2. Вывод мероприятий на странице

Далее нужно вывести эти мероприятия на странице. Для этого добавляем стандартный цикл, который перебирает все мероприятия и выводит их данные:

<?php
$events = new WP_Query([
'post_type' => 'event', // Тип поста "Мероприятия"
'posts_per_page' => -1,
]);

if ($events->have_posts()) :
while ($events->have_posts()) : $events->the_post();
$event_name = get_field('event_name');
$event_description = get_field('event_description');
$event_date = get_field('event_date');
?>
<div class="event-block" data-date="<?php echo esc_attr($event_date); ?>">
<h3><?php echo esc_html($event_name); ?></h3>
<p><?php echo esc_html($event_description); ?></p>
<p>Дата мероприятия: <?php echo esc_html($event_date); ?></p>
</div>
<?php
endwhile;
wp_reset_postdata();
endif;
?>

Каждое мероприятие будет обернуто в блок div с атрибутом data-date, который содержит дату мероприятия.

Шаг 3. Создание календаря для выбора даты

Создайте простой календарь на JavaScript. В примере ниже будем использовать стандартный JavaScript для работы с выбором даты:

<div id="calendarDates"></div>

<script>
document.addEventListener("DOMContentLoaded", function() {
let currentMonth = new Date().getMonth();
let currentYear = new Date().getFullYear();
const calendarDates = document.getElementById("calendarDates");

function renderCalendar(month, year) {
calendarDates.innerHTML = "";

let daysInMonth = new Date(year, month + 1, 0).getDate();
for (let i = 1; i <= daysInMonth; i++) {
const dayElement = document.createElement("div");
const formattedDate = `${year}-${("0" + (month + 1)).slice(-2)}-${("0" + i).slice(-2)}`;
dayElement.textContent = i;

dayElement.addEventListener("click", function() {
filterEventsByDate(formattedDate);
});

calendarDates.appendChild(dayElement);
}
}

function filterEventsByDate(selectedDate) {
jQuery.ajax({
url: ajax_object.ajax_url,
type: 'POST',
data: {
action: 'filter_by_date',
date: selectedDate
},
success: function(response) {
document.getElementById("events-container").innerHTML = response.data || '<p>Нет мероприятий на выбранную дату.</p>';
},
error: function(xhr, status, error) {
console.error('AJAX Error: ' + status + ' ' + error);
}
});
}

renderCalendar(currentMonth, currentYear);
});
</script>

Этот код создает календарь, который позволяет пользователю выбрать дату. При выборе даты срабатывает функция filterEventsByDate, которая отправляет AJAX-запрос на сервер для фильтрации мероприятий по дате.

Шаг 4. Обработка AJAX-запроса в WordPress

Теперь нужно создать обработчик для AJAX-запроса на стороне WordPress, который будет фильтровать мероприятия по выбранной дате.

Добавьте следующий код в ваш файл functions.php:

add_action('wp_ajax_filter_by_date', 'filter_events_by_date');
add_action('wp_ajax_nopriv_filter_by_date', 'filter_events_by_date');

function filter_events_by_date() {
$selected_date = $_POST['date'];

$events = new WP_Query([
'post_type' => 'event',
'meta_query' => [
[
'key' => 'event_date',
'value' => $selected_date,
'compare' => '=',
]
]
]);

if ($events->have_posts()) {
ob_start();
while ($events->have_posts()) {
$events->the_post();
$event_name = get_field('event_name');
$event_description = get_field('event_description');
$event_date = get_field('event_date');
?>
<div class="event-block">
<h3><?php echo esc_html($event_name); ?></h3>
<p><?php echo esc_html($event_description); ?></p>
<p>Дата мероприятия: <?php echo esc_html($event_date); ?></p>
</div>
<?php
}
wp_reset_postdata();
$response = ob_get_clean();
} else {
$response = '<p>Нет мероприятий на выбранную дату.</p>';
}

wp_send_json_success($response);
}

Этот код создает AJAX-обработчик, который принимает выбранную дату и ищет мероприятия с этой датой в базе данных. Если мероприятия найдены, они возвращаются в формате HTML, который обновляет блок с мероприятиями на странице.

Шаг 5. Инициализация AJAX

Не забудьте инициализировать объект AJAX в WordPress, добавив в скрипт следующую строку:

<script>
var ajax_object = {
ajax_url: "<?php echo admin_url('admin-ajax.php'); ?>"
};
</script>

Итог

Теперь у вас есть фильтрация мероприятий по дате на сайте WordPress с использованием ACF. Пользователь выбирает дату в календаре, и AJAX-запрос отправляется на сервер, чтобы получить мероприятия, соответствующие выбранной дате. Эта функциональность удобна для сайтов с календарем мероприятий, выставок, встреч и других событий.

Советы

  • Если ваши мероприятия привязаны к диапазону дат (например, начало и конец мероприятия), используйте сравнение диапазонов в meta_query.
  • Для улучшения пользовательского интерфейса вы можете использовать готовые библиотеки для календарей, такие как FullCalendar или Datepicker.

Теперь ваш сайт готов фильтровать мероприятия по выбранным датам и предлагать удобный и интуитивный интерфейс для пользователей!