В этой статье мы подробно разберём, как добавить собственные типы постов (Custom Post Types, CPT) в WordPress. Это одна из самых востребованных и практичных возможностей CMS, которая помогает расширить функционал сайта, адаптируя его под задачи любого проекта — от портфолио до интернет-магазина.
Что такое собственные типы постов и зачем они нужны в WordPress
По умолчанию WordPress работает с несколькими типами контента: посты (записи), страницы, вложения, ревизии и т.п. Однако для сложных проектов этих стандартных типов часто недостаточно. Для этого и придуманы собственные типы постов — они позволяют создавать новые сущности с уникальной логикой, набором полей и отображением.
Например, если вы ведёте сайт с рецептами, можно создать тип поста recipe, в котором будут свои поля для ингредиентов, времени приготовления, калорийности и т.д. Или для сайта недвижимости — тип property с адресом, ценой и картой.
Добавление CPT улучшает структуру контента, повышает удобство управления и делает сайт более гибким.
Создание собственного типа поста через functions.php — пример кода
Самый базовый способ — зарегистрировать CPT через функцию register_post_type() в файле темы functions.php. Рассмотрим пример создания типа поста wpfaq_portfolio для портфолио.
function wpfaq_register_custom_post_type() {
$labels = array(
'name' => 'Портфолио',
'singular_name' => 'Портфолио',
'add_new' => 'Добавить работу',
'add_new_item' => 'Добавить новую работу',
'edit_item' => 'Редактировать работу',
'new_item' => 'Новая работа',
'all_items' => 'Все работы',
'view_item' => 'Просмотреть работу',
'search_items' => 'Поиск работ',
'not_found' => 'Работ не найдено',
'not_found_in_trash' => 'В корзине работ не найдено',
'menu_name' => 'Портфолио'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'portfolio'),
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'show_in_rest' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio',
);
register_post_type('wpfaq_portfolio', $args);
}
add_action('init', 'wpfaq_register_custom_post_type');Данный код создаёт новый тип поста с названием «Портфолио», который появится в админке WordPress в меню. Включена поддержка заголовка, редактора, миниатюр и отрывков, а также REST API для работы с блоковым редактором Gutenberg.
Пояснения к параметрам
- public — делает тип доступным для публичного отображения.
- has_archive — включает архивную страницу для CPT по адресу
/portfolio/. - rewrite — задаёт правила ЧПУ.
- supports — указывает, какие мета-блоки будут доступны для редактирования.
- show_in_rest — включает поддержку REST API, необходимую для Gutenberg и некоторых плагинов.
Использование плагинов для создания собственных типов постов
Если вы не хотите писать код вручную или нужны более сложные настройки с удобным интерфейсом, можно воспользоваться плагинами. Вот самые популярные и проверенные решения:
1. Custom Post Type UI
Очень популярный плагин с интуитивно понятным интерфейсом для создания CPT и таксономий. Позволяет создавать типы постов без кода, экспортировать и импортировать настройки.
Преимущества:
- Поддержка всех основных параметров
register_post_type() - Интеграция с таксономиями
- Совместимость с ACF и другими плагинами для мета-полей
2. Pods Framework
Pods — мощный инструмент для создания не только CPT, но и пользовательских таксономий и полей. Подходит для сложных проектов с большим количеством связанного контента.
3. Toolset Types
Платный плагин с расширенными возможностями по созданию и управлению типами контента, мета-полями и шаблонами вывода без программирования.
Добавление мета-полей к собственному типу поста
Для расширения функционала CPT часто нужно добавить кастомные поля. Для этого можно использовать:
- Плагин Advanced Custom Fields (ACF)
- Ручное создание мета-боксов через
add_meta_box()
Пример создания мета-бокса вручную
function wpfaq_add_custom_meta_box() {
add_meta_box(
'wpfaq_portfolio_details',
'Детали портфолио',
'wpfaq_display_portfolio_meta_box',
'wpfaq_portfolio',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'wpfaq_add_custom_meta_box');
function wpfaq_display_portfolio_meta_box($post) {
$client = get_post_meta($post->ID, '_wpfaq_client', true);
wp_nonce_field('wpfaq_save_portfolio_meta', 'wpfaq_portfolio_nonce');
echo '<label for="wpfaq_client">Клиент:</label>';
echo '<input type="text" id="wpfaq_client" name="wpfaq_client" value="'.esc_attr($client).'" size="25" />';
}
function wpfaq_save_portfolio_meta($post_id) {
if (!isset($_POST['wpfaq_portfolio_nonce']) || !wp_verify_nonce($_POST['wpfaq_portfolio_nonce'], 'wpfaq_save_portfolio_meta')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wpfaq_client'])) {
update_post_meta($post_id, '_wpfaq_client', sanitize_text_field($_POST['wpfaq_client']));
}
}
add_action('save_post', 'wpfaq_save_portfolio_meta');Этот код добавляет мета-бокс с полем «Клиент» в редактор портфолио, сохраняет и выводит данные.
Отображение собственных типов постов на фронтенде
Чтобы вывести CPT на сайте, можно создать шаблон архивной страницы archive-wpfaq_portfolio.php в теме или использовать WP_Query для выборки.
$args = array(
'post_type' => 'wpfaq_portfolio',
'posts_per_page' => 10
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
the_excerpt();
}
wp_reset_postdata();
} else {
echo 'Работы не найдены';
}Такой код можно разместить в любом шаблоне темы для вывода списка записей портфолио.
SEO и собственные типы постов — практические советы
Для лучшего SEO важно правильно настроить URL и индексацию CPT:
- Используйте ЧПУ (rewrite) с понятным слагом
- Подключите поддержку sitemap для CPT (например, в Yoast SEO)
- Настройте мета-теги и заголовки для CPT
- Избегайте дублирующего контента — используйте canonical и noindex для архивов, если нужно
Это повысит видимость ваших собственных типов постов в поисковых системах и улучшит пользовательский опыт.