В WordPress по умолчанию есть стандартные типы записей: посты, страницы, вложения и т.д. Но часто в проектах требуется создавать собственные типы записей (Custom Post Types, CPT), чтобы удобно структурировать контент. Например, портфолио, отзывы, товары, мероприятия. В этой статье подробно разберём, как создать собственный тип записей с нуля, настроить его отображение и добавить поддержку мета-полей.
Что такое Custom Post Type и зачем он нужен
Custom Post Type — это расширение стандартной функциональности WordPress, позволяющее создавать и управлять уникальными типами контента, отличными от обычных постов и страниц. Это улучшает организацию сайта, SEO и удобство для пользователей.
Например, если у вас сайт с отзывами, то логично создать тип записей review, отдельно от обычных постов. Или для каталога товаров — тип product.
Создавая собственный тип записей, вы получаете отдельный раздел в админке, возможность настраивать шаблоны вывода, таксономии и мета-поля.
Регистрация собственного типа записей в WordPress
Основной способ — использовать функцию register_post_type(). Лучше всего регистрировать тип записей в хукe init. Рассмотрим пример для типа portfolio — портфолио.
function wpstock_register_portfolio_cpt() {
$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' => 20,
'menu_icon' => 'dashicons-portfolio',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
);
register_post_type('portfolio', $args);
}
add_action('init', 'wpstock_register_portfolio_cpt');
В этом коде:
$labels— подписи для админки;public— тип будет публичным и доступным в фронтенде;supports— какие стандартные поля будут поддерживаться (заголовок, редактор, миниатюра и т.д.);menu_icon— иконка в меню админки;rewrite— правила формирования URL.
Советы по настройке параметров
Если тип записей нужен только для админки, установите 'public' => false и 'show_ui' => true. Для SEO и отображения на сайте важно иметь 'public' => true и корректные правила rewrite.
Параметр 'has_archive' позволяет иметь архивную страницу, например, site.ru/portfolio/, выводящую все записи этого типа.
Добавление мета-полей к Custom Post Type
Часто для своего типа записей нужно хранить дополнительные данные — например, ссылку, дату события, рейтинг. Самый простой способ — добавить мета-поля через пользовательский интерфейс, но для разработчиков лучше использовать код.
Пример добавления мета-поля "URL проекта"
Добавим поле в редактор записи портфолио с помощью метабокса.
function wpstock_add_portfolio_metabox() {
add_meta_box(
'wpstock_portfolio_url',
'URL проекта',
'wpstock_portfolio_url_callback',
'portfolio',
'normal',
'default'
);
}
add_action('add_meta_boxes', 'wpstock_add_portfolio_metabox');
function wpstock_portfolio_url_callback($post) {
wp_nonce_field('wpstock_save_portfolio_url', 'wpstock_portfolio_url_nonce');
$value = get_post_meta($post->ID, '_wpstock_portfolio_url', true);
echo '<label for="wpstock_portfolio_url_field">Ссылка на проект: </label>';
echo '<input type="url" id="wpstock_portfolio_url_field" name="wpstock_portfolio_url_field" value="' . esc_attr($value) . '" size="25" />';
}
function wpstock_save_portfolio_url($post_id) {
if (!isset($_POST['wpstock_portfolio_url_nonce']) || !wp_verify_nonce($_POST['wpstock_portfolio_url_nonce'], 'wpstock_save_portfolio_url')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wpstock_portfolio_url_field'])) {
$url = sanitize_text_field($_POST['wpstock_portfolio_url_field']);
update_post_meta($post_id, '_wpstock_portfolio_url', $url);
}
}
add_action('save_post', 'wpstock_save_portfolio_url');
Этот код:
- Добавляет метабокс с полем URL;
- Сохраняет данные при сохранении записи;
- Использует nonce для безопасности.
Отображение кастомного типа записей на фронтенде
Чтобы вывести записи типа portfolio, можно создать шаблон архива archive-portfolio.php в теме или использовать WP_Query.
Пример WP_Query для вывода 5 проектов
$args = array(
'post_type' => 'portfolio',
'posts_per_page' => 5,
);
$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>';
wp_reset_postdata();
} else {
echo 'Проекты не найдены';
}
Так можно гибко выводить записи CPT в любом месте сайта, настраивая параметры запроса.
Подключение таксономий к Custom Post Type
Для удобной фильтрации контента создайте таксономии (например, категории и метки) для вашего CPT.
Пример регистрации таксономии "Тип проекта" для портфолио
function wpstock_register_portfolio_taxonomy() {
$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' => 'project-type'),
);
register_taxonomy('project_type', array('portfolio'), $args);
}
add_action('init', 'wpstock_register_portfolio_taxonomy');
Теперь в редакторе портфолио появится возможность назначать типы проектов, а на фронтенде можно фильтровать записи по таксономии.
Полезные плагины для работы с Custom Post Type
Хотя регистрация CPT в коде даёт максимум контроля, иногда удобнее использовать плагины:
- Custom Post Type UI — простой интерфейс для создания CPT и таксономий без кода.
- Meta Box — мощный плагин для создания мета-полей и метабоксов.
- Advanced Custom Fields Pro — удобный способ добавлять и выводить кастомные поля.
Используйте эти инструменты, если не хотите писать код вручную или хотите расширить функционал.