Что такое Custom Post Types и зачем они нужны в WordPress
WordPress изначально создан как платформа для блогов, где основным типом контента является запись (post). Однако, для создания более сложных сайтов, например, с каталогами, портфолио, отзывами или товарами, стандартных записей может быть недостаточно. Здесь на помощь приходят Custom Post Types (CPT) — пользовательские типы записей, позволяющие создавать новые виды контента с уникальной структурой и поведением.
Использование CPT помогает структурировать сайт, облегчить управление контентом и улучшить пользовательский опыт. Например, если вы создаёте сайт ресторана, можно сделать отдельный CPT для меню, чтобы не смешивать блюда с обычными записями блога.
В этой статье мы рассмотрим, как создать CPT вручную через код, а также с помощью популярных плагинов, а также как настроить их отображение и взаимодействие с другими элементами WordPress.
Создание Custom Post Type вручную через functions.php
Самый гибкий способ — зарегистрировать CPT в теме или плагине. Для этого используется функция register_post_type(). Ниже пример кода для создания CPT «Продукты» с базовыми настройками:
function wp1_register_product_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' => 'В корзине продуктов не найдено',
'menu_name' => 'Продукты'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'products'),
'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
'show_in_rest' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-products',
);
register_post_type('wp1_product', $args);
}
add_action('init', 'wp1_register_product_post_type');В этом коде мы определили метки для интерфейса, сделали CPT публичным и включили поддержку редактора, миниатюр и пользовательских полей. Также указали slug для ЧПУ и добавили иконку в админ-панель.
После добавления этого кода в functions.php темы и обновления панели администратора, в меню появится новый раздел «Продукты».
Особенности и нюансы при регистрации CPT
Обратите внимание на параметр show_in_rest. Он отвечает за поддержку Gutenberg и REST API. Если вы планируете использовать блоковый редактор или API, этот параметр должен быть true.
Параметр supports задаёт, какие возможности будут у записей данного типа — заголовок, редактор, миниатюры, комментарии и др. Подбирайте этот список исходя из потребностей проекта.
Для SEO и удобства пользователей важно правильно настроить параметр rewrite, чтобы ссылки были читаемыми и логичными.
Использование плагинов для создания Custom Post Types
Если вы не хотите писать код или нужно быстро создать CPT, существуют удобные плагины:
- Custom Post Type UI — позволяет создавать CPT и таксономии через интерфейс без кода.
- Pods — мощный плагин для создания CPT, таксономий и кастомных полей с гибкими настройками.
- Toolset Types — комплексное решение для создания сложных типов контента.
Для примера рассмотрим создание CPT с помощью Custom Post Type UI:
- Установите и активируйте плагин.
- Перейдите в меню «CPT UI» -> «Add/Edit Post Types».
- Введите slug, например,
wp1_event, название и описание. - Настройте параметры отображения, поддержки и пермалинков.
- Сохраните изменения — CPT появится в админке.
Преимущество плагинов — скорость и удобство, недостаток — меньшая гибкость и возможная нагрузка на сайт.
Как вывести Custom Post Types на сайте: запросы WP_Query и шаблоны
Создать CPT — только половина дела, важно правильно вывести их на фронтенде. Для этого используются пользовательские запросы и шаблоны.
Пример простого вывода всех продуктов на странице:
$args = array(
'post_type' => 'wp1_product',
'posts_per_page' => 10,
);
$query = new WP_Query($args);
if ($query->have_posts()) :
echo '<ul>';
while ($query->have_posts()) : $query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
endwhile;
echo '</ul>';
wp_reset_postdata();
else :
echo 'Продукты не найдены';
endif;Для более профессионального подхода создайте файл шаблона archive-wp1_product.php в папке темы. WordPress автоматически его использует для архива CPT.
В шаблоне можно использовать стандартные функции цикла WordPress, стилизовать вывод и подключать дополнительные поля.
Добавление пользовательских полей и мета-данных
Часто для CPT нужны дополнительные данные, например цена, дата события или рейтинг. Для этого используются пользовательские поля (Custom Fields) или мета-боксы.
Простейший способ добавить поле — использовать встроенный функционал WordPress. Для более удобной работы подойдут плагины:
- Advanced Custom Fields (ACF) — позволяет создавать удобные интерфейсы для ввода произвольных данных.
- Meta Box — аналогичный функционал с расширенными возможностями.
Пример добавления мета-поля «Цена» с помощью ACF:
- Установите и активируйте ACF.
- Создайте группу полей, выберите тип записи «Продукты».
- Добавьте поле с названием «Цена» и типом «Число».
- В шаблоне вывода используйте код:
echo 'Цена: ' . get_field('цена') . ' руб.';Если хотите добавить мета-бокс вручную, можно использовать хук add_meta_boxes и функцию add_meta_box(). Это более сложный путь, требующий знаний PHP и WordPress API.
Регистрация таксономий для Custom Post Types
Для структурирования и фильтрации CPT полезно создавать собственные таксономии — категории и метки.
Пример регистрации таксономии «Категории продуктов» для CPT «Продукты»:
function wp1_register_product_taxonomy() {
$labels = array(
'name' => 'Категории продуктов',
'singular_name' => 'Категория продукта',
'search_items' => 'Поиск категорий',
'all_items' => 'Все категории',
'edit_item' => 'Редактировать категорию',
'update_item' => 'Обновить категорию',
'add_new_item' => 'Добавить новую категорию',
'new_item_name' => 'Новое имя категории',
'menu_name' => 'Категории продуктов'
);
$args = array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array('slug' => 'product-category'),
);
register_taxonomy('wp1_product_category', array('wp1_product'), $args);
}
add_action('init', 'wp1_register_product_taxonomy');Таксономии позволяют удобно фильтровать и группировать записи, а также автоматически добавляются в админку.
Советы по оптимизации и безопасности Custom Post Types
При создании CPT важно не забывать про безопасность и производительность:
- Регистрация CPT и таксономий должна происходить на хуке
initдля корректной работы. - Используйте префиксы в названиях функций и slug, чтобы избежать конфликтов с другими плагинами и темами.
- Ограничьте права доступа, если нужно, используя параметры
capability_typeиcapabilities. - Оптимизируйте запросы, особенно если CPT содержит много записей — используйте кэширование и правильные индексы в базе.
- Тестируйте отображение CPT на разных устройствах и с разными плагинами, чтобы избежать конфликтов.