Что такое собственный тип записей (Custom Post Type) в WordPress и зачем он нужен
WordPress изначально работает с двумя основными типами контента — записями (posts) и страницами (pages). Однако для многих проектов этого недостаточно, особенно если сайт сложный и содержит разные виды контента, например, портфолио, отзывы, товары, события и многое другое. Собственный тип записей (Custom Post Type, CPT) позволяет создать отдельный тип контента с уникальным набором полей, отображением и функционалом.
Использование CPT помогает структурировать информацию, улучшить удобство управления сайтом и повысить гибкость темы. Например, если вы ведёте сайт с каталогом книг, лучше создать отдельный тип записи «Книга», а не использовать обычные записи с категориями.
В WordPress есть множество плагинов, которые позволяют создавать CPT через интерфейс, например, Custom Post Type UI или Pods. Но если хотите полный контроль и оптимизацию, лучше добавить CPT программно, описав его в файле functions.php вашей темы или подключив отдельный файл.
Как добавить собственный тип записей в WordPress программно: регистрируем CPT
Для регистрации собственного типа записей в WordPress используется функция register_post_type(). Рассмотрим на примере создания типа записи «portfolio» для портфолио.
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wp_theme_register_portfolio_cpt() {
$labels = array(
'name' => 'Портфолио',
'singular_name' => 'Проект',
'menu_name' => 'Портфолио',
'name_admin_bar' => 'Проект',
'add_new' => 'Добавить проект',
'add_new_item' => 'Добавить новый проект',
'edit_item' => 'Редактировать проект',
'new_item' => 'Новый проект',
'view_item' => 'Просмотреть проект',
'search_items' => 'Искать проекты',
'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', 'custom-fields')
);
register_post_type('portfolio', $args);
}
add_action('init', 'wp_theme_register_portfolio_cpt');Этот код создаёт новый тип записей «Портфолио» с поддержкой заголовка, редактора, миниатюры и кастомных полей. Обратите внимание на параметр 'rewrite' — он задаёт URL для записей CPT.
Настройка мета-полей для собственного типа записей
Чтобы расширить функционал CPT, часто нужно добавить дополнительные поля — например, дату завершения проекта, ссылку на сайт, описание технологий и т.п. Для этого можно использовать плагин Advanced Custom Fields (ACF), который позволяет создавать мета-поля через визуальный интерфейс без кода.
Если же хотите сделать это программно, добавьте мета-боксы вручную. Вот пример создания мета-бокса с полем «Ссылка на проект» для CPT «portfolio»:
function wp_theme_add_portfolio_metabox() {
add_meta_box(
'wp_theme_portfolio_link',
'Ссылка на проект',
'wp_theme_portfolio_link_callback',
'portfolio',
'normal',
'default'
);
}
add_action('add_meta_boxes', 'wp_theme_add_portfolio_metabox');
function wp_theme_portfolio_link_callback($post) {
wp_nonce_field('wp_theme_save_portfolio_link', 'wp_theme_portfolio_link_nonce');
$value = get_post_meta($post->ID, '_wp_theme_portfolio_link', true);
echo ' ';
echo '';
}
function wp_theme_save_portfolio_link($post_id) {
if (!isset($_POST['wp_theme_portfolio_link_nonce'])) {
return;
}
if (!wp_verify_nonce($_POST['wp_theme_portfolio_link_nonce'], 'wp_theme_save_portfolio_link')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wp_theme_portfolio_link_field'])) {
update_post_meta($post_id, '_wp_theme_portfolio_link', esc_url_raw($_POST['wp_theme_portfolio_link_field']));
}
}
add_action('save_post', 'wp_theme_save_portfolio_link');Этот код добавляет поле для ввода URL проекта в редактирование записи портфолио и сохраняет его в метаданных.
Вывод собственного типа записей в теме: шаблоны и WP_Query
Чтобы отображать записи CPT на фронтенде, нужно создать шаблон архива и отдельной записи либо доработать существующие. Для архива создайте файл archive-portfolio.php в папке темы, для отдельной записи — single-portfolio.php.
Пример простого цикла вывода записей CPT в файле архива:
if (have_posts()) :
while (have_posts()) : the_post();
echo '<h2>' . get_the_title() . '</h2>';
the_excerpt();
$link = get_post_meta(get_the_ID(), '_wp_theme_portfolio_link', true);
if ($link) {
echo '<p><a href="' . esc_url($link) . '" target="_blank">Ссылка на проект</a></p>';
}
endwhile;
else :
echo '<p>Проекты не найдены.</p>';
endif;Если нужно вывести записи CPT в произвольном месте сайта, используйте класс WP_Query:
$args = array(
'post_type' => 'portfolio',
'posts_per_page' => 5,
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<h3>' . get_the_title() . '</h3>';
the_excerpt();
}
wp_reset_postdata();
} else {
echo '<p>Проекты не найдены.</p>';
}Плагины для удобной работы с собственными типами записей
Хотя программный подход даёт максимальный контроль, есть ситуации, когда проще использовать плагины. Вот несколько популярных и удобных:
- Custom Post Type UI — интуитивный интерфейс для создания CPT и таксономий без кода.
- Pods — расширенный инструмент, позволяющий создавать CPT, таксономии и метаполя с гибкой настройкой.
- Advanced Custom Fields (ACF) — для создания красивых и удобных мета-полей с поддержкой разных типов данных.
Эти плагины отлично подходят для быстрого старта и экономии времени, но для оптимизации и кастомизации лучше дополнять их программными решениями.
Советы по оптимизации и безопасности при работе с собственными типами записей
При добавлении CPT важно помнить о следующих моментах:
- Используйте префиксы в названиях функций и метаполей, чтобы избежать конфликтов с другими плагинами и темами (как в примерах выше — префикс
wp_theme_). - Обязательно проверяйте nonce и права пользователя при сохранении метаданных, чтобы предотвратить CSRF-атаки и несанкционированное изменение данных.
- Планируйте структуру URL, чтобы избежать конфликтов с существующими страницами и типами записей, используйте параметр
rewriteвregister_post_type(). - Для сложных проектов рекомендуется создавать CPT в виде отдельного плагина, чтобы не привязывать функционал к теме.