Как создать динамический календарь событий в WordPress с поддержкой AJAX

Если вам нужно на сайте WordPress реализовать удобный и современный календарь событий, который позволяет пользователям просматривать мероприятия по месяцам без перезагрузки страницы, то этот материал для вас. Мы подробно разберем, как создать динамический календарь с поддержкой AJAX, чтобы повысить удобство использования и производительность.

Почему стоит использовать динамический календарь событий в WordPress

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

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

Выбор плагинов для управления событиями и их интеграция

Для хранения событий оптимально использовать кастомный тип записи (custom post type) — hueman_event. Для удобства управления можно использовать плагин Custom Post Type UI или зарегистрировать тип записи через код.

Пример регистрации типа записи через код:

function hueman_register_event_post_type() {
  $labels = array(
    'name' => 'События',
    'singular_name' => 'Событие',
    'add_new' => 'Добавить событие',
    'add_new_item' => 'Добавить новое событие',
    'edit_item' => 'Редактировать событие',
    'new_item' => 'Новое событие',
    'view_item' => 'Просмотреть событие',
    'search_items' => 'Поиск событий',
    'not_found' =>  'События не найдены',
    'not_found_in_trash' => 'В корзине событий не найдено',
  );
  $args = array(
    'labels' => $labels,
    'public' => true,
    'has_archive' => true,
    'supports' => array('title', 'editor', 'custom-fields'),
    'menu_icon' => 'dashicons-calendar-alt',
  );
  register_post_type('hueman_event', $args);
}
add_action('init', 'hueman_register_event_post_type');

Для хранения даты события рекомендуем использовать метаполе, например, с ключом hueman_event_date. Для удобства можно пользоваться плагином Advanced Custom Fields (ACF) или создавать метаполе вручную.

Создание шорткода для вывода календаря с AJAX

Теперь создадим шорткод [hueman_event_calendar], который будет выводить календарь и загружать события динамически по месяцам.

Сначала регистрируем шорткод и подключаем скрипты:

function hueman_enqueue_event_calendar_scripts() {
  wp_enqueue_script('hueman-event-calendar', get_template_directory_uri() . '/js/hueman-event-calendar.js', array('jquery'), '1.0', true);
  wp_localize_script('hueman-event-calendar', 'huemanEventCalendar', array(
    'ajax_url' => admin_url('admin-ajax.php'),
    'nonce' => wp_create_nonce('hueman_event_calendar_nonce')
  ));
}
add_action('wp_enqueue_scripts', 'hueman_enqueue_event_calendar_scripts');

function hueman_event_calendar_shortcode() {
  ob_start();
  ?>
  <div id="hueman-event-calendar">
    <div class="calendar-navigation">
      <button id="hueman-prev-month">« Предыдущий</button>
      <span id="hueman-current-month"></span>
      <button id="hueman-next-month">Следующий »</button>
    </div>
    <div id="hueman-calendar-content">Загрузка...</div>
  </div>
  <?php
  return ob_get_clean();
}
add_shortcode('hueman_event_calendar', 'hueman_event_calendar_shortcode');

JavaScript для обработки навигации и запроса AJAX

Создаем файл hueman-event-calendar.js в папке темы /js/ с таким содержимым:

jQuery(document).ready(function($) {
  var currentDate = new Date();

  function hueman_load_events(year, month) {
    $('#hueman-calendar-content').html('Загрузка...');
    $('#hueman-current-month').text(year + '-' + (month + 1));
    $.ajax({
      url: huemanEventCalendar.ajax_url,
      method: 'POST',
      data: {
        action: 'hueman_load_events',
        year: year,
        month: month + 1,
        nonce: huemanEventCalendar.nonce
      },
      success: function(response) {
        if(response.success) {
          $('#hueman-calendar-content').html(response.data.html);
        } else {
          $('#hueman-calendar-content').html('Ошибка загрузки событий');
        }
      },
      error: function() {
        $('#hueman-calendar-content').html('Ошибка AJAX запроса');
      }
    });
  }

  $('#hueman-prev-month').on('click', function() {
    currentDate.setMonth(currentDate.getMonth() - 1);
    hueman_load_events(currentDate.getFullYear(), currentDate.getMonth());
  });

  $('#hueman-next-month').on('click', function() {
    currentDate.setMonth(currentDate.getMonth() + 1);
    hueman_load_events(currentDate.getFullYear(), currentDate.getMonth());
  });

  hueman_load_events(currentDate.getFullYear(), currentDate.getMonth());
});

Обработка AJAX-запроса на сервере

Чтобы возвращать события за указанный месяц, регистрируем обработчик AJAX в functions.php:

function hueman_ajax_load_events() {
  check_ajax_referer('hueman_event_calendar_nonce', 'nonce');

  $year = intval($_POST['year']);
  $month = intval($_POST['month']);

  // Получаем первый и последний день месяца
  $start_date = date('Y-m-d', strtotime("$year-$month-01"));
  $end_date = date('Y-m-t', strtotime($start_date));

  $args = array(
    'post_type' => 'hueman_event',
    'posts_per_page' => -1,
    'meta_query' => array(
      array(
        'key' => 'hueman_event_date',
        'value' => array($start_date, $end_date),
        'compare' => 'BETWEEN',
        'type' => 'DATE',
      ),
    ),
    'orderby' => 'meta_value',
    'meta_key' => 'hueman_event_date',
    'order' => 'ASC',
  );
  $query = new WP_Query($args);

  if(!$query->have_posts()) {
    wp_send_json_success(array('html' => '<p>Событий не найдено на этот месяц.</p>'));
  }

  $html = '<ul class="hueman-event-list">';
  while($query->have_posts()) {
    $query->the_post();
    $event_date = get_post_meta(get_the_ID(), 'hueman_event_date', true);
    $html .= '<li><strong>' . esc_html($event_date) . ':</strong> ' . get_the_title() . '</li>';
  }
  wp_reset_postdata();
  $html .= '</ul>';

  wp_send_json_success(array('html' => $html));
}
add_action('wp_ajax_hueman_load_events', 'hueman_ajax_load_events');
add_action('wp_ajax_nopriv_hueman_load_events', 'hueman_ajax_load_events');

Рекомендации по улучшению и расширению функционала

Для удобства пользователей можно добавить:

  • Вывод подробной информации о событии при клике, используя модальные окна или отдельную страницу.
  • Календарь с визуальным отображением дней месяца и отметками событий (например, с помощью CSS-сеток или библиотек типа FullCalendar).
  • Фильтры по категориям событий или по типам, если их несколько.
  • Автоматическую интеграцию с плагинами SEO для улучшения индексации страниц событий.

Для тех, кто предпочитает готовые решения, советуем обратить внимание на плагин Expert Review от WPShop, который содержит расширенные возможности для создания и управления отзывами и событиями в удобном интерфейсе.

Также можно использовать плагин ABC Pagination для удобной навигации по страницам с большим количеством событий.

Итог

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

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как создать динамические поля в WordPress для расширения форм
09.01.2026
Как автоматизировать управление пользовательскими ролями в WordPress
03.03.2026
Как сделать динамический календарь событий в WordPress с AJAX и темой Hueman
27.02.2026
Как избежать конфликтов плагинов в WordPress: практические советы и примеры
23.11.2025
Как создать динамические виджеты в WordPress на основе темы Hueman
10.03.2026
×
WordPress
прокачай свой сайт!

Скидка на премиум темы и плагины

Успей забрать скидку ⋙