В WordPress стандартными типами записей являются записи (posts) и страницы (pages). Однако для многих проектов требуется создавать специальные типы контента, которые отличаются по структуре и назначению. В этой статье мы подробно разберём, как создать собственный тип записей (Custom Post Type, CPT) в WordPress, настроить его, вывести на фронтенде и улучшить пользовательский опыт с помощью дополнительных функций.
Что такое собственный тип записей и зачем он нужен
Собственный тип записей позволяет организовать контент более гибко и понятно. Например, если вы ведёте сайт с обзорами фильмов, то тип записи review будет удобнее, чем просто использовать обычные записи, потому что можно добавить уникальные метаполя, таксономии и шаблоны отображения.
Custom Post Type — это не просто категория или тег, а отдельный структурированный тип данных, который WordPress понимает и обрабатывает отдельно.
Основные преимущества CPT:
- Отдельное управление контентом в админке
- Возможность создавать отдельные таксономии (категории, метки)
- Уникальные шаблоны вывода на сайте
- Улучшенная организация и фильтрация контента
Регистрация собственного типа записей: функция wpzoom_register_custom_post_type
Для создания CPT в WordPress используется функция register_post_type(). Чтобы сделать код удобным и модульным, создадим функцию с префиксом wpzoom_, которая будет регистрировать наш тип записей.
Ниже пример создания типа записей portfolio для сайта с портфолио проектов:
function wpzoom_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' => 'Поиск проектов',
'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('portfolio', $args);
}
add_action('init', 'wpzoom_register_custom_post_type');Этот код добавит новый пункт меню «Портфолио» в админке WordPress, где можно добавлять проекты с заголовком, описанием, миниатюрой и комментариями.
Объяснение ключевых параметров
labels— набор названий для разных частей интерфейсаpublic— делает тип доступным на сайте и в админкеrewrite— позволяет задать ЧПУ ссылкиsupports— перечисляет функции, которые поддерживает тип записи (например, редактор, миниатюры)menu_icon— иконка в меню админки (используются dashicons)
Добавление пользовательских таксономий для собственного типа записей
Чтобы классифицировать записи CPT, стоит добавить свои таксономии. Например, для портфолио можно создать таксономию «Тип проекта».
Для регистрации таксономий используется функция register_taxonomy(). Добавим функцию wpzoom_register_custom_taxonomy для создания таксономии project_type:
function wpzoom_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('project_type', array('portfolio'), $args);
}
add_action('init', 'wpzoom_register_custom_taxonomy');Теперь в админке у портфолио появится дополнительный фильтр по типам проектов.
Вывод собственного типа записей на фронтенде
После создания CPT важно правильно выводить записи на сайте. Для этого можно создать шаблон архива и отдельной записи.
Если в теме нет файлов archive-portfolio.php и single-portfolio.php, WordPress по умолчанию будет использовать archive.php и single.php. Но лучше создать отдельные шаблоны, чтобы настроить вывод именно для портфолио.
Пример базового шаблона архива (archive-portfolio.php)
<?php get_header(); ?>
<section class="portfolio-archive">
<h1>Портфолио</h1>
<div class="portfolio-items">
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="portfolio-excerpt"><?php the_excerpt(); ?></div>
</article>
<?php endwhile; ?>
<?php else : ?>
<p>Проекты не найдены.</p>
<?php endif; ?>
</div>
</section>
<?php get_footer(); ?>Такой шаблон выведет список всех проектов портфолио с заголовками и краткими описаниями.
Добавление метаполей для собственного типа записей
Для расширения информации о записи можно добавить метаполя — дополнительные данные, например, URL проекта, дату выполнения, бюджет и т.п.
Для этого обычно используют плагины Advanced Custom Fields (ACF) или пишут собственный код с использованием хуков add_meta_box и save_post.
Пример добавления метабокса с полем URL проекта
function wpzoom_add_portfolio_metabox() {
add_meta_box(
'wpzoom_portfolio_url',
'URL проекта',
'wpzoom_portfolio_url_callback',
'portfolio',
'normal',
'default'
);
}
add_action('add_meta_boxes', 'wpzoom_add_portfolio_metabox');
function wpzoom_portfolio_url_callback($post) {
wp_nonce_field('wpzoom_save_portfolio_url', 'wpzoom_portfolio_url_nonce');
$value = get_post_meta($post->ID, '_portfolio_url', true);
echo '<label for="wpzoom_portfolio_url_field">Введите URL:</label> ';
echo '<input type="url" id="wpzoom_portfolio_url_field" name="wpzoom_portfolio_url_field" value="' . esc_attr($value) . '" size="25" />';
}
function wpzoom_save_portfolio_url($post_id) {
if (!isset($_POST['wpzoom_portfolio_url_nonce'])) {
return;
}
if (!wp_verify_nonce($_POST['wpzoom_portfolio_url_nonce'], 'wpzoom_save_portfolio_url')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['post_type']) && 'portfolio' == $_POST['post_type']) {
if (!current_user_can('edit_post', $post_id)) {
return;
}
}
if (!isset($_POST['wpzoom_portfolio_url_field'])) {
return;
}
$my_data = sanitize_text_field($_POST['wpzoom_portfolio_url_field']);
update_post_meta($post_id, '_portfolio_url', $my_data);
}
add_action('save_post', 'wpzoom_save_portfolio_url');После добавления этого кода на странице редактирования проекта появится поле для ввода URL, которое сохранится и будет доступно для вывода.
Вывод метаполя в шаблоне single-portfolio.php
Чтобы показать URL проекта на странице отдельной записи, добавьте следующий код в шаблон:
<?php
$project_url = get_post_meta(get_the_ID(), '_portfolio_url', true);
if ($project_url) {
echo '<p>Сайт проекта: <a href="' . esc_url($project_url) . '" target="_blank" rel="noopener">' . esc_html($project_url) . '</a></p>';
}
?>Полезные плагины для работы с собственными типами записей
Хотя многое можно сделать вручную, для удобства и расширенных функций рекомендуем несколько плагинов:
- Custom Post Type UI — удобный интерфейс для создания CPT и таксономий без кода.
- Advanced Custom Fields (ACF) — добавление любых метаполей с визуальным редактором.
- Pods — мощный фреймворк для создания и управления CPT и полями.
- Toolset Types — комплексное решение для построения структурированных сайтов.
Итоги и рекомендации по созданию собственных типов записей
Создание собственного типа записей — один из ключевых инструментов для расширения возможностей WordPress и кастомизации сайта под любые задачи. Главное — продуманно подойти к структуре, названиям и функционалу, чтобы потом легко было управлять и выводить контент.
Рекомендуется всегда использовать префиксы (например, wpzoom_) для своих функций и метаполей, чтобы избежать конфликтов с другими плагинами и темами.
Начинайте с простого, постепенно добавляя новые возможности: таксономии, метаполя, шаблоны, фильтры и сортировки. Это позволит создать удобный и масштабируемый сайт на базе WordPress.