Автоматизация создания и отображения событий в WordPress — востребованная задача для сайтов с календарями мероприятий, расписаниями и анонсами. В этой статье подробно разберём, как можно автоматически создавать события, хранить их в базе и выводить на сайте в удобном формате, используя кастомные типы записей, метаданные и примеры кода. Также рассмотрим полезные плагины, которые помогут упростить задачу.
Создание кастомного типа записей для событий в WordPress
Для начала создадим отдельный тип записи event, чтобы отделить события от обычных постов и страниц. Это позволяет гибко управлять данными и выводить события в отдельном разделе.
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpgenerate_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,
'rewrite' => array('slug' => 'events'),
'supports' => array('title', 'editor', 'thumbnail'),
'show_in_rest' => true,
);
register_post_type('event', $args);
}
add_action('init', 'wpgenerate_register_event_post_type');Теперь в админке появится раздел «События» для удобного управления.
Добавление метаполей для даты и времени события
Чтобы хранить дату и время, нужны дополнительные поля. Рекомендуется использовать метаполя event_date и event_time.
Добавим метабокс с полями для даты и времени:
function wpgenerate_add_event_meta_boxes() {
add_meta_box('wpgenerate_event_date_time', 'Дата и время события', 'wpgenerate_event_date_time_callback', 'event', 'side', 'default');
}
add_action('add_meta_boxes', 'wpgenerate_add_event_meta_boxes');
function wpgenerate_event_date_time_callback($post) {
$event_date = get_post_meta($post->ID, 'event_date', true);
$event_time = get_post_meta($post->ID, 'event_time', true);
wp_nonce_field('wpgenerate_event_date_time_save', 'wpgenerate_event_date_time_nonce');
echo '<label for="event_date">Дата события:</label><br>';
echo '<input type="date" id="event_date" name="event_date" value="'.esc_attr($event_date).'" style="width:100%;"><br><br>';
echo '<label for="event_time">Время события:</label><br>';
echo '<input type="time" id="event_time" name="event_time" value="'.esc_attr($event_time).'" style="width:100%;">';
}
function wpgenerate_save_event_date_time($post_id) {
if (!isset($_POST['wpgenerate_event_date_time_nonce']) || !wp_verify_nonce($_POST['wpgenerate_event_date_time_nonce'], 'wpgenerate_event_date_time_save')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['event_date'])) {
update_post_meta($post_id, 'event_date', sanitize_text_field($_POST['event_date']));
}
if (isset($_POST['event_time'])) {
update_post_meta($post_id, 'event_time', sanitize_text_field($_POST['event_time']));
}
}
add_action('save_post', 'wpgenerate_save_event_date_time');Теперь при создании или редактировании события можно указать дату и время.
Автоматическое создание событий из массива данных
Часто нужно автоматически создавать события по расписанию или из внешних источников. Для примера создадим функцию, которая добавляет события из массива с параметрами.
function wpgenerate_create_events_from_array($events) {
foreach ($events as $event) {
// Проверяем, есть ли уже событие с таким названием и датой
$existing = new WP_Query(array(
'post_type' => 'event',
'title' => $event['title'],
'meta_query' => array(
array(
'key' => 'event_date',
'value' => $event['date'],
'compare' => '=',
),
),
));
if ($existing->have_posts()) {
continue; // Пропускаем дубликаты
}
// Создаём новое событие
$post_id = wp_insert_post(array(
'post_title' => wp_strip_all_tags($event['title']),
'post_content' => $event['description'],
'post_status' => 'publish',
'post_type' => 'event',
));
if ($post_id) {
update_post_meta($post_id, 'event_date', $event['date']);
update_post_meta($post_id, 'event_time', $event['time']);
}
}
}
// Пример вызова
$events_to_add = array(
array(
'title' => 'Вебинар по WordPress',
'description' => 'Подробный разбор создания событий.',
'date' => '2024-07-15',
'time' => '18:00',
),
array(
'title' => 'Онлайн-конференция',
'description' => 'Обсуждаем новинки WordPress.',
'date' => '2024-08-01',
'time' => '10:00',
),
);
wpgenerate_create_events_from_array($events_to_add);Так можно автоматически загружать события из API, CSV или других источников, вызывая эту функцию.
Вывод событий на сайте с фильтрацией по дате
Теперь создадим шаблон вывода ближайших событий, отсортированных по дате, с фильтрацией только будущих.
function wpgenerate_get_upcoming_events($limit = 10) {
$today = date('Y-m-d');
$args = array(
'post_type' => 'event',
'posts_per_page' => $limit,
'meta_key' => 'event_date',
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'event_date',
'value' => $today,
'compare' => '>=',
'type' => 'DATE',
),
),
);
$query = new WP_Query($args);
if (!$query->have_posts()) {
return '<p>Ближайших событий нет.</p>';
}
$output = '<ul class="wpgenerate-events-list">';
while ($query->have_posts()) {
$query->the_post();
$date = get_post_meta(get_the_ID(), 'event_date', true);
$time = get_post_meta(get_the_ID(), 'event_time', true);
$output .= '<li><strong>' . get_the_title() . '</strong> — ' . esc_html($date);
if ($time) {
$output .= ' в ' . esc_html($time);
}
$output .= '<br>' . get_the_excerpt() . '</li>';
}
$output .= '</ul>';
wp_reset_postdata();
return $output;
}
// Использование в шаблоне или в шорткоде
add_shortcode('wpgenerate_upcoming_events', function() {
return wpgenerate_get_upcoming_events(5);
});Добавьте шорткод [wpgenerate_upcoming_events] в нужное место, чтобы вывести список ближайших событий.
Рекомендации по использованию плагинов для событий
Если нужен более функциональный календарь с поддержкой повторяющихся событий, интеграцией с внешними сервисами и удобным интерфейсом, рассмотрите следующие плагины:
- OmniVideo — позволяет создавать видео-мероприятия с автоматической публикацией и уведомлениями.
- WPCommunity — плагин для организации сообществ с календарём событий, RSVP и обменом сообщениями.
Интеграция собственного кода с этими плагинами позволяет расширить функционал и автоматизировать процессы.
Автоматизация создания событий с помощью WP-Cron и REST API
Можно настроить периодическое создание событий через WP-Cron, вызывая функцию импорта из внешних источников.
Пример регистрации задачи:
function wpgenerate_schedule_events_import() {
if (!wp_next_scheduled('wpgenerate_import_events_hook')) {
wp_schedule_event(time(), 'hourly', 'wpgenerate_import_events_hook');
}
}
add_action('wp', 'wpgenerate_schedule_events_import');
add_action('wpgenerate_import_events_hook', 'wpgenerate_import_events_function');
function wpgenerate_import_events_function() {
// Здесь логика получения данных из API и вызова wpgenerate_create_events_from_array
}Для создания и обновления событий через REST API можно расширить стандартный API:
add_action('rest_api_init', function () {
register_rest_route('wpgenerate/v1', '/events', array(
'methods' => 'POST',
'callback' => 'wpgenerate_rest_create_event',
'permission_callback' => function () {
return current_user_can('edit_posts');
},
));
});
function wpgenerate_rest_create_event(WP_REST_Request $request) {
$title = sanitize_text_field($request->get_param('title'));
$description = sanitize_textarea_field($request->get_param('description'));
$date = sanitize_text_field($request->get_param('date'));
$time = sanitize_text_field($request->get_param('time'));
$post_id = wp_insert_post(array(
'post_title' => $title,
'post_content' => $description,
'post_status' => 'publish',
'post_type' => 'event',
));
if (!$post_id) {
return new WP_Error('cant-create', __('Не удалось создать событие'), array('status' => 500));
}
update_post_meta($post_id, 'event_date', $date);
update_post_meta($post_id, 'event_time', $time);
return array('id' => $post_id, 'message' => 'Событие создано');
}Это открывает возможности для интеграции с внешними сервисами и мобильными приложениями.