В WordPress по умолчанию есть несколько типов записей: записи (posts), страницы (pages), вложения (attachments) и другие. Однако часто возникает необходимость создать собственный тип контента, например для портфолио, отзывов, продуктов или событий. Для этого используется механизм Custom Post Types (Кастомные типы записей).
Что такое Custom Post Type и зачем он нужен в WordPress
Custom Post Type — это собственный тип контента, отличающийся по структуре и функционалу от стандартных. Он позволяет разделять контент по смыслу, упрощая управление сайтом и улучшая пользовательский опыт. Например, если у вас сайт с каталогом фильмов, вы можете создать CPT «Фильмы», чтобы хранить их отдельно от обычных записей блога.
Использование кастомных типов записей позволяет:
- Четко структурировать контент;
- Создавать уникальные шаблоны отображения;
- Упростить работу с админкой для клиентов;
- Поддерживать разные типы контента без мешанины в стандартных записях.
Как создать Custom Post Type вручную через functions.php
Самый простой способ — зарегистрировать CPT в файле functions.php вашей активной темы. Для этого используется функция register_post_type(). Рассмотрим пример создания типа записей «Отзывы».
function wpcourse_register_reviews_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,
'has_archive' => true,
'rewrite' => array('slug' => 'otzyvy'),
'show_in_rest' => true, // поддержка Gutenberg
'supports' => array('title', 'editor', 'author', 'thumbnail', 'comments'),
'menu_icon' => 'dashicons-testimonial',
);
register_post_type('wpcourse_reviews', $args);
}
add_action('init', 'wpcourse_register_reviews_cpt');В этом коде мы задали метки, параметры видимости, поддержку блокового редактора и иконку в админке. После добавления и обновления страницы админки появится новый раздел «Отзывы».
Пояснения к основным параметрам
public— делает CPT доступным на фронтенде и в админке;has_archive— включает страницу архива типа записей;rewrite— настраивает ЧПУ для записей данного типа;show_in_rest— подключает поддержку Gutenberg и REST API;supports— перечисляет возможности редактора (заголовок, содержимое, миниатюра и др.).
Использование плагинов для создания Custom Post Type
Если вы не хотите писать код, можно использовать готовые плагины. Вот несколько популярных и удобных:
- Custom Post Type UI — простой и мощный плагин, который позволяет создавать CPT и таксономии через удобный интерфейс. Он не влияет на вывод, только регистрирует типы записей.
- Pods — Custom Content Types and Fields — расширенный плагин для создания CPT, таксономий и дополнительных полей с возможностью тонкой настройки.
- Toolset Types — комплексное решение для кастомизации контента с множеством возможностей.
Например, в Custom Post Type UI вы просто добавляете новый тип, задаёте ярлык, слаг, возможности и сохраняете. Плагин автоматически зарегистрирует CPT, и вы сможете использовать его в шаблонах.
Как использовать Custom Post Type в шаблонах темы
После создания CPT нужно вывести записи на сайте. Для этого создается отдельный файл шаблона архива, например, archive-wpcourse_reviews.php. В нем можно использовать стандартный Loop WordPress:
<?php get_header(); ?>
<div class="content-area">
<main class="site-main">
<h1>Отзывы</h1>
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<article id="post-<?php the_ID(); ?>">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="entry-content"><?php the_content(); ?></div>
</article>
<?php endwhile; ?>
<?php else : ?>
<p>Отзывы не найдены.</p>
<?php endif; ?>
</main>
</div>
<?php get_footer(); ?>Для одиночной записи можно создать файл single-wpcourse_reviews.php с аналогичной структурой.
Добавление дополнительных полей к Custom Post Type
Для расширения функционала кастомного типа часто нужны дополнительные мета-поля, например, рейтинг, дата события или контактные данные.
Самое простое решение — использовать плагин Advanced Custom Fields (ACF). Он позволяет создавать группы полей и привязывать их к нужному CPT.
Если хотите сделать вручную, можно добавить мета-боксы через хук add_meta_boxes и сохранить данные через save_post. Вот пример создания мета-поля "Рейтинг" для отзывов:
function wpcourse_add_reviews_metabox() {
add_meta_box(
'wpcourse_review_rating',
'Рейтинг',
'wpcourse_render_review_rating_metabox',
'wpcourse_reviews',
'side',
'default'
);
}
add_action('add_meta_boxes', 'wpcourse_add_reviews_metabox');
function wpcourse_render_review_rating_metabox($post) {
$value = get_post_meta($post->ID, '_wpcourse_review_rating', true);
echo '<label for="wpcourse_review_rating_field">Оценка (1-5):</label>';
echo '<input type="number" id="wpcourse_review_rating_field" name="wpcourse_review_rating_field" min="1" max="5" value="' . esc_attr($value) . '" />';
}
function wpcourse_save_review_rating($post_id) {
if (array_key_exists('wpcourse_review_rating_field', $_POST)) {
update_post_meta(
$post_id,
'_wpcourse_review_rating',
intval($_POST['wpcourse_review_rating_field'])
);
}
}
add_action('save_post', 'wpcourse_save_review_rating');Таким образом, в редакторе появится поле для ввода рейтинга, которое сохранится в мета-данных записи.
Вывод дополнительных полей в шаблонах Custom Post Type
Чтобы вывести рейтинг в шаблоне одиночной записи, используйте функцию:
<?php
$rating = get_post_meta(get_the_ID(), '_wpcourse_review_rating', true);
if ($rating) {
echo '<p>Рейтинг: ' . esc_html($rating) . ' из 5</p>';
}
?>Это позволит красиво показать дополнительную информацию посетителям сайта.
Резюме и рекомендации по работе с Custom Post Types
Custom Post Types — мощный инструмент для создания структурированного и удобного сайта на WordPress. Главное — внимательно подойти к планированию и реализации, чтобы не создавать хаос в админке.
Рекомендации:
- Используйте префиксы в названиях функций и CPT для избежания конфликтов (как
wpcourse_в примерах). - Для простых сайтов подойдет ручное создание CPT в
functions.php, для сложных — плагины. - Добавляйте дополнительные поля для расширения функционала, используя ACF или собственные мета-боксы.
- Создавайте отдельные шаблоны для CPT для удобного отображения и SEO.
Теперь вы можете создавать свои типы записей и расширять возможности сайта без ограничений стандартного функционала WordPress.