Кастомные типы записей (Custom Post Types, CPT) — важный инструмент для расширения возможностей WordPress. Они позволяют создавать новые виды контента, отличные от стандартных «Записей» и «Страниц». Например, если вы ведёте сайт с портфолио, каталогом товаров или отзывами, кастомные типы записей помогут структурировать данные и улучшить управление контентом.
Что такое кастомные типы записей и зачем они нужны в WordPress
WordPress изначально поддерживает несколько типов записей: записи, страницы, вложения, ревизии и навигационные меню. Однако для многих проектов этого недостаточно. Кастомные типы записей позволяют создавать собственные типы контента с уникальными параметрами, метаданными и таксономиями.
Основные преимущества CPT:
- Логическая структуризация контента.
- Удобство редактирования и отображения.
- Возможность отдельного управления правами доступа.
- Гибкая настройка отображения в админке и на сайте.
Например, для сайта с каталогом мероприятий вы можете создать тип записи «События», в котором будут свои поля даты, места проведения и описания.
Регистрация кастомного типа записи с помощью функции wpma_register_custom_post_type
Для добавления кастомного типа записи в WordPress без использования плагинов достаточно зарегистрировать его через хук init и функцию register_post_type(). Чтобы облегчить поддержку кода и избежать конфликтов, используем префикс wpma_ в названии нашей функции.
function wpma_register_custom_post_type() {
$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' => 'Искать проекты',
'parent_item_colon' => 'Родительский проект:',
'not_found' => 'Проекты не найдены.',
'not_found_in_trash' => 'В корзине проекты не найдены.'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'portfolio'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'comments')
);
register_post_type('wpma_portfolio', $args);
}
add_action('init', 'wpma_register_custom_post_type');
В этом примере мы создаём новый тип записи с ярлыком wpma_portfolio. В параметре supports указаны стандартные возможности, которые будут доступны для записей данного типа.
Пояснения к параметрам регистрационной функции
Параметр public отвечает за доступность типа записи на сайте и в админке.
rewrite задаёт ЧПУ для ссылок. В нашем случае адреса будут иметь вид /portfolio/название-записи/.
menu_icon — иконка в административном меню, для портфолио выбран стандартный Dashicons.
Если вы хотите, чтобы записи этого типа имели собственные таксономии (например, категории и теги), это нужно регистрировать отдельно.
Добавление кастомных таксономий для кастомного типа записи
Для удобной организации контента к типам записей часто добавляют таксономии. Создадим таксономию «Тип проекта» для нашего портфолио.
function wpma_register_custom_taxonomy() {
$labels = array(
'name' => 'Типы проектов',
'singular_name' => 'Тип проекта',
'search_items' => 'Искать типы',
'all_items' => 'Все типы',
'parent_item' => 'Родительский тип',
'parent_item_colon' => 'Родительский тип:',
'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' => 'project-type'),
);
register_taxonomy('wpma_project_type', array('wpma_portfolio'), $args);
}
add_action('init', 'wpma_register_custom_taxonomy');
Теперь в админке для записей портфолио появится возможность присваивать типы проектов, что упростит фильтрацию и вывод.
Вывод кастомного типа записей на сайте с помощью WP_Query
Чтобы отобразить записи нашего типа wpma_portfolio на сайте, используем класс WP_Query. Ниже пример, как вывести список 10 последних проектов с их заголовками и ссылками.
$args = array(
'post_type' => 'wpma_portfolio',
'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>';
}
echo '</ul>';
} else {
echo 'Проекты не найдены.';
}
wp_reset_postdata();
Такой код можно вставить в шаблон темы или в любой PHP-блок через функцию do_shortcode с собственным шорткодом.
Создание шорткода для вывода портфолио
Чтобы проще использовать вывод, создадим шорткод [wpma_portfolio] с параметром количества проектов.
function wpma_portfolio_shortcode($atts) {
$atts = shortcode_atts( array(
'count' => 5,
), $atts, 'wpma_portfolio' );
$args = array(
'post_type' => 'wpma_portfolio',
'posts_per_page' => intval($atts['count']),
);
$query = new WP_Query($args);
$output = '';
if ($query->have_posts()) {
$output .= '<ul class="wpma-portfolio-list">';
while ($query->have_posts()) {
$query->the_post();
$output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
$output .= '</ul>';
} else {
$output .= 'Проекты не найдены.';
}
wp_reset_postdata();
return $output;
}
add_shortcode('wpma_portfolio', 'wpma_portfolio_shortcode');
Используйте в редакторе: [wpma_portfolio count="10"] — и выведется список из 10 проектов.
Советы по поддержке и безопасности кастомных типов записей
При регистрации CPT и таксономий важно учитывать следующие моменты:
- Используйте префиксы в названиях функций и идентификаторов, чтобы избежать конфликтов.
- Обязательно вызывайте
flush_rewrite_rules()один раз после добавления CPT (например, при активации темы или плагина), чтобы обновить правила ЧПУ. - Следите за тем, чтобы права доступа соответствовали назначению типа записи — для публичного контента используйте
capability_type => 'post'. - Для сложных полей можно применять метабоксы или подключать ACF (Advanced Custom Fields), но это уже тема для отдельной статьи.
Полезные плагины для работы с кастомными типами записей
Хотя статья посвящена созданию CPT без плагинов, иногда удобнее использовать готовые решения для управления и расширения функционала:
- Clearfy Pro — оптимизация и расширение WordPress, в том числе улучшение управления CPT.
- WPCommunity — плагин для создания социальных сетей на базе CPT и таксономий.
Используйте их, если хотите добавить удобные интерфейсы и дополнительные возможности без написания кода.