Создание пользовательского типа записи «Event» в WordPress
Что такое пользовательские типы записей в WordPress?
Пользовательский тип записи (Custom Post Type, CPT) — это способ добавить в WordPress ещё один вид контента, отличный от обычных записей и страниц. CPT удобно использовать для событий, портфолио, товаров, справочников и т.д. Это отдельная секция в админке, собственные URL-адреса и свои шаблоны вывода.
Коротко: CPT = отдельный «контейнер» контента с собственными метаданными и шаблонами.
Важно: для сложных задач по календарям и билетам лучше использовать готовые плагины (например, The Events Calendar). Этот материал — учебный пример создания CPT вручную.

Зачем создавать отдельный тип записей для событий?
- Разделение логики: события отдельно от блога и страниц.
- Отдельные архивы и URL: /events/ вместо смешивания в ленте блога.
- Собственные поля (дата, место, цена) без загрязнения обычных записей.
- Гибкость шаблонов: отдельные archive- и single-шаблоны.
Когда это не нужно: если у вас один-две записи и нет требований к фильтрации/архиву — проще использовать стандартные рубрики/метки.
Как зарегистрировать пользовательский тип записей (пример: Event)
Мы внесём код в functions.php темы или подключим через плагин для пользовательских функций. Если не хотите править тему — используйте плагин My Custom Functions:
https://en-gb.wordpress.org/plugins/my-custom-functions/
Откройте functions.php в папке темы (wp-content/themes/ваша-тема/functions.php) и добавьте в конец файла (до закрывающего тега ?>, если он есть) следующий код:
add_action('init', 'events_init');
function events_init() {
$args = array(
'labels' => array(
'name' => __('Events'),
'singular_name' => __('Event'),
),
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'events'),
'supports' => array('thumbnail', 'editor', 'title', 'custom-fields')
);
register_post_type('events', $args);
}Пояснения к ключевым опциям:
- labels — подписи в интерфейсе; используйте функции локализации __() для переводов.
- public — делает тип публичным (видимым на фронтэнде и в поиске).
- has_archive — включает архив по адресу /events/.
- rewrite => slug — часть URL, которую мы выбираем сами.
- supports — какие элементы редактора включить (миниатюра, редактор, заголовок, произвольные поля).
После добавления кода и сохранения темы в админке появится пункт «Events» (или «События», если локализовать labels).
Добавьте несколько мероприятий через админку, чтобы проверить вывод.
Как хранить дату события
Не используйте дату публикации поста для даты проведения — она показывает, когда объявление опубликовано. Для даты события заведите пользовательское поле, например date.
Рекомендации по формату даты:
- Самый надёжный формат для парсинга — ISO: YYYY-MM-DD (например, 2025-12-23).
- Для локализации и удобства редактора можно показывать поле в формате ДД.MM.ГГГГ, но при сохранении лучше конвертировать в YYYY-MM-DD.
- Функция PHP strtotime корректно парсит ISO-формат везде; локализованные форматы могут вести себя непредсказуемо.
Если вы используете расширения типа ACF (Advanced Custom Fields), задайте поле даты как поле типа Date и храните в ISO.
Регистрация постоянных ссылок (Permalinks)
После добавления нового типа WordPress может выдавать 404 при просмотре постов/архива. Решение: зайдите в Настройки > Постоянные ссылки и нажмите «Сохранить изменения» — это заставит WordPress обновить правила перезаписи.
Создание шаблона архива: archive-events.php
Поскольку мы указали has_archive => true и slug => ‘events’, WordPress будет пытаться использовать шаблон archive-events.php для вывода архива. Скопируйте archive.php вашей темы и переименуйте копию в archive-events.php.
В шаблоне можно упростить вывод и взять из мета-поля date фактическую дату события вместо даты публикации. В примере ниже показан упрощённый каркас поста (вставьте в файл archive-events.php внутри цикла):
' . esc_html( date_i18n( get_option('date_format'), strtotime(get_post_meta(get_the_ID(), 'date', true)) ) ) . ' Пояснение: мы используем date_i18n(get_option(‘date_format’), strtotime(…)) — это позволяет вывести дату в формате, заданном в настройках WordPress и с учётом локали сайта.
После замены функции, заменяющей ссылку на время, на извлечение мета-поля даты, архив начнёт показывать дату события, а не дату публикации:
// Было: twentyseventeen_time_link()
// Стало:
echo esc_html( date_i18n( get_option('date_format'), strtotime( get_post_meta( get_the_ID(), 'date', true ) ) ) );Альтернативные подходы и инструменты
- Плагин The Events Calendar — полный функционал календаря, поведение и дизайн уже готовы.
- Плагин CPT UI — интерфейс для регистрации типов записей без кода.
- Создание собственного лёгкого плагина вместо правки темы — изменения останутся при смене темы и не потеряются при обновлении.
- ACF (Advanced Custom Fields) для удобного редактирования и хранения структуры метаданных.
Когда вручную писать CPT:
- Вы хотите тонко контролировать структуру, шаблоны и поведение.
- У вас нет требований к сложному календарю/бронированию.
Когда выбрать плагин:
- Нужна продвинутая функциональность (повторяющиеся события, билеты, синхронизация с календарём).
Отладка и типичные проблемы (когда «не работает»)
- 404 на новых CPT-страницах — решение: Настройки > Постоянные ссылки → Сохранить.
- Конфликт slug с существующими страницами/маршрутами — проверьте уникальность slug в rewrite.
- Кеширование (CDN, плагины кеша) может показывать старую версию — очистите кеш.
- Права доступа: public => true, но если нужно REST API, добавьте ‘show_in_rest’ => true.
- Локализация дат: используйте date_i18n/wp_date, если хотите корректные названия дней/месяцев для локали.
Практические рекомендации по дизайну и UX
- Показывайте дату события крупно — это ключевая метрика.
- Добавьте фильтры по будущим/прошедшим событиям: мета-запросы по полю date.
- Для удобства редактирования добавьте пользовательский мета-бокс или используйте ACF.
- Добавьте микроразметку (schema.org/Event) для улучшения видимости в поиске.
Чек-листы по ролям
Разработчик:
- Зарегистрировать CPT с правильными labels и rewrite.
- Обеспечить show_in_rest при необходимости.
- Добавить шаблоны archive-events.php и single-events.php.
- Учесть i18n и формат даты (date_i18n/get_option(‘date_format’)).
- Реализовать валидацию и нормализацию поля date в ISO.
Редактор/контент-менеджер:
- Ввести дату события в указанном формате (рекомендуем ISO или системный формат).
- Добавить описания, изображение и место проведения в поля.
- Проверить отображение в архиве и на странице события.
Администратор сайта:
- Проверить доступность меню для нового CPT.
- Обновить навигацию и меню сайта, чтобы событие было доступно.
- Очистить кеш и проверить permalinks после добавления CPT.
Мини-методология внедрения (SOP)
- План: определите поля и поведение (архив, фильтры, REST API).
- Реализация: зарегистрируйте CPT в теме/плагине.
- Шаблоны: создайте archive-events.php и single-events.php.
- Данные: добавьте несколько тестовых событий с датами в ISO.
- Тестирование: проверьте пермалинки, фильтры, локализацию дат и доступность.
- Релиз: обновите меню, очистите кеш, обучите редакторов.
Примеры запросов WP_Query для событий
- Получить только будущие события (сортировка по дате):
$query = new WP_Query(array(
'post_type' => 'events',
'meta_key' => 'date',
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'date',
'value' => date('Y-m-d'),
'compare' => '>=',
'type' => 'DATE'
)
)
));- Получить прошедшие события (для архива истории): поменяйте compare на ‘<’ и order на DESC.
Модель мышления и эвристики
- Разделяйте содержание по смыслу: если контент имеет свою структуру и логику — делайте CPT.
- Храните машинно-удобные форматы (ISO) и отображайте локализованные форматы пользователю.
- Отдавайте приоритет доступности: семантический HTML, aria-атрибуты, читаемые даты.
Когда это не лучшая идея (контрпример)
Если у вас одностраничный сайт с 3–4 событиями в год, отдельный CPT и шаблоны могут быть избыточны. В таких случаях проще вести список на странице или использовать записи с метками.
Советы по безопасности и производительности
- Валидируйте и очищайте мета-поля (sanitize_text_field, date parsing).
- Не хардкодьте SQL-запросы; используйте WP_Query и WP_Meta_Query.
- Кешируйте тяжёлые запросы и фрагменты шаблонов (transients, object cache).
Куда двигаться дальше
- Добавьте микроразметку schema.org/Event — поисковые системы смогут показывать дату и место прямо в результатах.
- Рассмотрите интеграцию с календарями Google/ICS для импорта/экспорта событий.
Кстати: если вы недовольны текущим хостингом, можно рассмотреть managed WordPress-хостинг (например, WP Engine) или экономичный план от InMotion Hosting.
Критерии приёмки
- В админке доступен раздел Events с возможностью добавлять события.
- На странице /events/ отображается архив событий с датой из пользовательского поля.
- Страница отдельного события корректно показывает дату, изображение и описание.
- Permalinks работают без 404 после обновления настроек.
Резюме
Создание пользовательского типа записи в WordPress даёт гибкость в организации контента: отдельные архивы, собственные поля и шаблоны. Для событий важно хранить дату в машинно-удобном формате (ISO), использовать date_i18n для вывода и не забывать обновлять постоянные ссылки. Альтернативы — готовые плагины и UI-инструменты — подходят, если нужна быстрая или продвинутая функциональность.
Похожие материалы
Заменить Блокнот в Windows на другой редактор
Добавление изображений в Google Формы
Установка OTA на рутованный Android без потери root
Отключить лишние уведомления Shortcuts
Установка Nessus на Kali Linux — пошагово