В WordPress стандартно используются типы записей «Записи» и «Страницы», но для многих проектов этого недостаточно. Создание собственного типа записи (Custom Post Type, CPT) позволяет структурировать контент более гибко и удобно. В этой статье мы подробно разберём, как правильно создать CPT с примерами кода и полезными советами.
Что такое собственный тип записи в WordPress и зачем он нужен
Собственный тип записи — это дополнительный вид контента, который вы регистрируете в системе. Это может быть портфолио, отзывы, продукты, события или любой другой контент, который не подходит под стандартные «Записи» или «Страницы».
Преимущества CPT:
- Чёткое разделение контента;
- Своя админка с удобным интерфейсом;
- Возможность создавать собственные таксономии и метаполя;
- Улучшение SEO благодаря структурированным данным;
- Гибкость в отображении на сайте.
Для начала работы с CPT необязательно использовать плагины, но они могут упростить процесс.
Регистрация собственного типа записи через functions.php
Самый простой и контролируемый способ — добавить код регистрации CPT в файл functions.php вашей темы или в плагин-функции. Рассмотрим пример регистрации типа записи «Отзывы».
function wptalk_register_post_type_reviews() {
$labels = array(
'name' => 'Отзывы',
'singular_name' => 'Отзыв',
'menu_name' => 'Отзывы',
'name_admin_bar' => 'Отзыв',
'add_new' => 'Добавить отзыв',
'add_new_item' => 'Добавить новый отзыв',
'new_item' => 'Новый отзыв',
'edit_item' => 'Редактировать отзыв',
'view_item' => 'Просмотреть отзыв',
'all_items' => 'Все отзывы',
'search_items' => 'Поиск отзывов',
'not_found' => 'Отзывы не найдены',
'not_found_in_trash' => 'В корзине отзывы не найдены'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'reviews'),
'show_in_rest' => true, // для поддержки Gutenberg
'supports' => array('title', 'editor', 'author', 'thumbnail', 'comments'),
'menu_icon' => 'dashicons-testimonial',
);
register_post_type('wptalk_review', $args);
}
add_action('init', 'wptalk_register_post_type_reviews');В этом примере мы создали тип записи с названием wptalk_review. Обратите внимание на show_in_rest — он позволяет использовать блоковый редактор и REST API для вашего CPT.
Подробности параметров
Параметры register_post_type очень гибкие. Например, можно управлять видимостью типа записи в админке, возможностями поиска, поддержкой таксономий и многое другое. Подробнее можно посмотреть в официальной документации WordPress.
Добавление пользовательских таксономий к CPT
Чтобы структурировать ваш кастомный тип записи, полезно добавить собственные таксономии (категории или метки). Например, для отзывов можно добавить таксономию «Тип отзыва».
function wptalk_register_taxonomy_review_type() {
$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' => 'review-type'),
'show_in_rest' => true,
);
register_taxonomy('wptalk_review_type', array('wptalk_review'), $args);
}
add_action('init', 'wptalk_register_taxonomy_review_type');Теперь у отзывов появится возможность классифицировать их по типу — это удобно для фильтрации и вывода на фронтенде.
Использование плагинов для создания CPT
Если вы не хотите писать код, есть несколько отличных плагинов:
- Custom Post Type UI — самый популярный и удобный плагин для создания CPT и таксономий через интерфейс.
- Pods — расширенный инструмент для создания CPT, таксономий и метаполей с возможностью кастомизации.
- WPCPT — лёгкий плагин с минималистичным интерфейсом.
Например, Custom Post Type UI позволяет создать CPT за несколько кликов, а потом экспортировать настройки в PHP-код, чтобы использовать их в теме или плагине.
Вывод Custom Post Type на сайте: примеры кода шаблонов
После создания CPT нужно вывести записи на сайте. Можно использовать стандартный цикл WordPress или WP_Query.
$args = array(
'post_type' => 'wptalk_review',
'posts_per_page' => 10,
);
$wptalk_reviews = new WP_Query($args);
if ($wptalk_reviews->have_posts()) {
while ($wptalk_reviews->have_posts()) {
$wptalk_reviews->the_post();
echo '<h2>' . get_the_title() . '</h2>';
echo '<div>' . get_the_content() . '</div>';
}
wp_reset_postdata();
} else {
echo 'Отзывы не найдены.';
}Этот код можно вставить в любой шаблон темы, например, в файл archive-wptalk_review.php для архива или в кастомную страницу.
Подключение метаполей к CPT
Для расширения функционала отзывов полезно добавить метаполя — например, рейтинг или имя клиента. Для этого можно использовать плагин Advanced Custom Fields или написать свой код с использованием add_meta_box.
Оптимизация и лучшие практики при работе с CPT
При создании CPT важно учитывать:
- Уникальный slug — чтобы не конфликтовать с другими типами записей;
- Поддержка REST API — для совместимости с редактором Gutenberg и внешними приложениями;
- Использование префикса в названиях функций и типов, чтобы избежать конфликтов (например,
wptalk_); - Добавление поддержки необходимых возможностей через
supports; - Создание шаблонов в теме для правильного отображения CPT;
- Регулярное тестирование на конфликт плагинов и тем.
Использование WPGPT и других плагинов WPShop для CPT
Если вы хотите автоматизировать создание и наполнение CPT, обратите внимание на плагин WPGPT. Он позволяет генерировать контент с помощью GPT, что удобно для создания описаний или отзывов.
Также для управления отображением CPT можно использовать ABC Pagination для удобной постраничной навигации.
Вывод
Создание собственного типа записи — важный шаг для расширения функционала вашего WordPress-сайта. Используйте приведённые примеры кода и рекомендации, чтобы сделать это максимально эффективно и без ошибок. А при необходимости подключайте удобные плагины из каталога WPShop для ускорения разработки и улучшения функционала.