В этой статье мы рассмотрим, как создать собственный тип записи (Custom Post Type, CPT) в WordPress, который позволит организовать контент более гибко и удобно. Кроме того, покажем, как добавить поддержку кастомных шаблонов для этих записей и как работать с метаданными — важным инструментом для хранения дополнительной информации.
Что такое собственный тип записи и зачем он нужен в WordPress
Стандартно WordPress использует несколько типов записей: посты, страницы, вложения и т. д. Однако для многих проектов этого недостаточно — например, если вы создаёте сайт с каталогом товаров, портфолио, событиями или отзывами, удобнее выделить эти сущности отдельными типами записей. Это позволяет:
- Чётко структурировать контент;
- Использовать отдельные шаблоны отображения;
- Добавлять специфичные метаданные и таксономии;
- Упрощать управление контентом в админке.
Для регистрации собственного типа записи в WordPress используется функция register_post_type. Рассмотрим её на примере.
Регистрация своего типа записи в WordPress с помощью register_post_type
Создадим CPT для "Отзывы". Добавим код в файл functions.php вашей темы или в отдельный плагин:
function wp7_register_post_type_reviews() {
$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,
'has_archive' => true,
'rewrite' => array('slug' => 'reviews'),
'show_in_rest' => true,
'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
'menu_position' => 20,
'menu_icon' => 'dashicons-testimonial',
);
register_post_type('wp7_review', $args);
}
add_action('init', 'wp7_register_post_type_reviews');Объяснение параметров:
labels— набор названий для интерфейса;public— видимость для пользователей и фронтенда;has_archive— наличие архивной страницы;rewrite— настройка ЧПУ;show_in_rest— поддержка Gutenberg и REST API;supports— функциональность (заголовок, редактор, миниатюра, произвольные поля);menu_icon— иконка в админке.
Добавление кастомных шаблонов для собственного типа записи
По умолчанию WordPress пытается подгрузить шаблон single-{post_type}.php для одиночных записей и archive-{post_type}.php для архивов. Например, для нашего типа записи wp7_review можно создать файлы:
single-wp7_review.php— шаблон одиночного отзыва;archive-wp7_review.php— шаблон страницы архива отзывов.
Если этих файлов нет, WordPress отдаст fallback на single.php и archive.php соответственно.
Пример простого шаблона одиночной записи (файл single-wp7_review.php):
<?php get_header(); ?>
<?php if(have_posts()): while(have_posts()): the_post(); ?>
<h1><?php the_title(); ?></h1>
<div class="review-content"><?php the_content(); ?></div>
<?php if(has_post_thumbnail()): ?>
<div class="review-thumbnail"><?php the_post_thumbnail('medium'); ?></div>
<?php endif; ?>
<?php endwhile; endif; ?>
<?php get_footer(); ?>Работа с метаданными: добавление и вывод произвольных полей
Метаданные позволяют хранить дополнительную информацию, связанную с записью, например, рейтинг, дату события, контактные данные и т. д. Для удобства можно создать метабокс в админке, где пользователь сможет вводить эти данные.
Добавим метабокс с рейтингом отзыва (от 1 до 5):
function wp7_add_meta_box_review_rating() {
add_meta_box(
'wp7_review_rating',
'Рейтинг отзыва',
'wp7_meta_box_review_rating_callback',
'wp7_review',
'side',
'default'
);
}
add_action('add_meta_boxes', 'wp7_add_meta_box_review_rating');
function wp7_meta_box_review_rating_callback($post) {
wp_nonce_field('wp7_save_review_rating', 'wp7_review_rating_nonce');
$value = get_post_meta($post->ID, '_wp7_review_rating', true);
echo '<label for="wp7_review_rating_field">Рейтинг (1-5):</label> ';
echo '<input type="number" id="wp7_review_rating_field" name="wp7_review_rating_field" min="1" max="5" value="' . esc_attr($value) . '" />';
}
function wp7_save_review_rating_meta($post_id) {
if (!isset($_POST['wp7_review_rating_nonce']) || !wp_verify_nonce($_POST['wp7_review_rating_nonce'], 'wp7_save_review_rating')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wp7_review_rating_field'])) {
$rating = intval($_POST['wp7_review_rating_field']);
if ($rating >= 1 && $rating <= 5) {
update_post_meta($post_id, '_wp7_review_rating', $rating);
} else {
delete_post_meta($post_id, '_wp7_review_rating');
}
}
}
add_action('save_post', 'wp7_save_review_rating_meta');Теперь при создании или редактировании отзыва в боковой панели будет поле для ввода рейтинга, который сохранится в метаданных записи.
Для вывода рейтинга в шаблоне используйте:
$rating = get_post_meta(get_the_ID(), '_wp7_review_rating', true);
echo '<p>Рейтинг: ' . esc_html($rating) . ' из 5</p>';Использование плагина Clearfy Pro для оптимизации и управления CPT
Если вы хотите расширить возможности управления собственными типами записей, рекомендую обратить внимание на плагин Clearfy Pro. Он позволяет:
- Автоматически создавать CPT и таксономии без кода;
- Оптимизировать загрузку и работу CPT;
- Управлять правами доступа к типам записей;
- Интегрироваться с SEO и кешированием.
Использование готовых решений значительно экономит время и снижает вероятность ошибок.
Как использовать шаблоны для архивов и фильтрация записей CPT
Архивный шаблон archive-wp7_review.php может содержать логику для вывода списка отзывов с пагинацией и фильтрами. Пример простого кода для архива:
<?php get_header(); ?>
<h1>Отзывы</h1>
<?php if(have_posts()): ?>
<div class="reviews-list">
<?php while(have_posts()): the_post(); ?>
<article id="post-<?php the_ID(); ?>" class="review-item">
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div class="excerpt"><?php the_excerpt(); ?></div>
</article>
<?php endwhile; ?>
</div>
<?php the_posts_pagination(); ?>
<?php else: ?>
<p>Отзывов пока нет.</p>
<?php endif; ?>
<?php get_footer(); ?><Для реализации фильтрации можно использовать WP_Query с параметрами, например, по рейтингу:
$args = array(
'post_type' => 'wp7_review',
'meta_key' => '_wp7_review_rating',
'meta_value' => 4,
'meta_compare' => '>='
);
$query = new WP_Query($args);Заключение: преимущества использования собственных типов записей с метаданными
Создание собственного типа записи с поддержкой шаблонов и метаданных позволяет сделать сайт на WordPress более функциональным и адаптированным под конкретные задачи. Такой подход упрощает работу с контентом, улучшает интерфейс и расширяет возможности кастомизации.
Для ускорения разработки и оптимизации управления рекомендуем использовать Clearfy Pro, который интегрируется с WordPress и помогает управлять CPT без лишнего кода.
Используйте описанные методы и примеры в ваших проектах на wp7.ru, чтобы создавать мощные и легко расширяемые сайты на WordPress.