WordPress по умолчанию предлагает стандартные типы записей: записи (posts) и страницы (pages). Однако для многих проектов этого недостаточно, и возникает необходимость создавать собственные типы записей — Custom Post Types (CPT). Это позволяет структурировать контент более гибко и удобно, адаптируя сайт под конкретные задачи.
Что такое собственные пост типы в WordPress и зачем они нужны
Custom Post Types — это способ расширить стандартный функционал WordPress, добавив новые типы контента, отличающиеся по смыслу и функционалу от обычных записей и страниц. К примеру, если вы делаете сайт агентства недвижимости, логично создать отдельный CPT для объектов недвижимости, а не смешивать всё в обычных записях.
Преимущества использования CPT:
- Чистая и логичная структура контента;
- Удобство управления и редактирования в админке;
- Возможность создания уникальных шаблонов для разных типов записей;
- Лучшая SEO-оптимизация за счёт разделения контента;
- Гибкость при разработке сложных проектов.
Без CPT часто приходится создавать сложные таксономии или использовать метаполя, что усложняет поддержку сайта.
Как создать собственный пост тип: базовый пример с использованием функции register_post_type
Для создания CPT в WordPress используется функция register_post_type(). Эту функцию нужно вызывать в хуке init. Рассмотрим пример создания типа записей «Отзывы».
function wpmark_register_post_type_reviews() {
$labels = array(
'name' => 'Отзывы',
'singular_name' => 'Отзыв',
'add_new' => 'Добавить отзыв',
'add_new_item' => 'Добавить новый отзыв',
'edit_item' => 'Редактировать отзыв',
'new_item' => 'Новый отзыв',
'all_items' => 'Все отзывы',
'view_item' => 'Просмотреть отзыв',
'search_items' => 'Искать отзывы',
'not_found' => 'Отзывы не найдены',
'not_found_in_trash' => 'В корзине отзывы не найдены',
'menu_name' => 'Отзывы'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'reviews'),
'supports' => array('title', 'editor', 'author', 'thumbnail', 'comments'),
'show_in_rest' => true, // поддержка Gutenberg
'menu_position' => 5,
'menu_icon' => 'dashicons-format-chat'
);
register_post_type('wpmark_review', $args);
}
add_action('init', 'wpmark_register_post_type_reviews');После добавления этого кода в файл functions.php вашей темы или в собственный плагин, в админке появится новый раздел «Отзывы» с полноценным функционалом.
Расширение функционала: добавляем пользовательские таксономии и метаполя
Для удобной категоризации и структурирования CPT можно добавить собственные таксономии — категории и метки, аналогичные стандартным для постов. Также часто требуется добавить метаполя для хранения дополнительной информации (например, рейтинг отзыва или дату события).
Создание таксономии «Тип отзыва»
function wpmark_register_taxonomy_review_type() {
$labels = array(
'name' => 'Типы отзывов',
'singular_name' => 'Тип отзыва',
'search_items' => 'Искать типы отзывов',
'all_items' => 'Все типы',
'edit_item' => 'Редактировать тип',
'update_item' => 'Обновить тип',
'add_new_item' => 'Добавить новый тип',
'new_item_name' => 'Название нового типа',
'menu_name' => 'Типы отзывов'
);
$args = array(
'labels' => $labels,
'hierarchical' => true,
'show_in_rest' => true
);
register_taxonomy('wpmark_review_type', 'wpmark_review', $args);
}
add_action('init', 'wpmark_register_taxonomy_review_type');Теперь при добавлении или редактировании отзывов можно выбирать тип отзыва, что значительно улучшает навигацию.
Добавление метаполя «Рейтинг» с помощью Meta Box API
Для простого добавления метаполей лучше использовать встроенные хуки WordPress. Вот пример добавления поля «Рейтинг» (число от 1 до 5):
function wpmark_add_meta_boxes() {
add_meta_box(
'wpmark_review_rating',
'Рейтинг отзыва',
'wpmark_render_rating_meta_box',
'wpmark_review',
'side',
'default'
);
}
add_action('add_meta_boxes', 'wpmark_add_meta_boxes');
function wpmark_render_rating_meta_box($post) {
$value = get_post_meta($post->ID, '_wpmark_review_rating', true);
echo '<label for="wpmark_review_rating">Рейтинг (1-5):</label><br>';
echo '<input type="number" id="wpmark_review_rating" name="wpmark_review_rating" value="' . esc_attr($value) . '" min="1" max="5" />';
}
function wpmark_save_postdata($post_id) {
if (array_key_exists('wpmark_review_rating', $_POST)) {
update_post_meta(
$post_id,
'_wpmark_review_rating',
intval($_POST['wpmark_review_rating'])
);
}
}
add_action('save_post', 'wpmark_save_postdata');Этот код добавит поле ввода рейтинга в сайдбар редактора отзывов и сохранит значение в метаданных.
Вывод собственных пост типах на фронтенд: создание шаблонов и WP_Query
Для отображения CPT на сайте нужно создать шаблоны и запросы, которые будут извлекать и выводить нужные записи.
Создание шаблона архива CPT
WordPress ищет файл archive-{post_type}.php для вывода архива CPT. Для нашего типа wpmark_review можно создать файл archive-wpmark_review.php в папке темы с примерным содержимым:
<?php get_header(); ?>
<h1>Отзывы</h1>
<?php if ( have_posts() ) : ?>
<ul>
<?php while ( have_posts() ) : the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> - Рейтинг: <?php echo get_post_meta(get_the_ID(), '_wpmark_review_rating', true); ?></li>
<?php endwhile; ?>
</ul>
<?php else : ?>
<p>Отзывы не найдены.</p>
<?php endif; ?>
<?php get_footer(); ?>Использование WP_Query для вывода отзывов на главной странице
Чтобы вывести последние 5 отзывов с рейтингом 5 на главной странице, используйте следующий код в шаблоне:
$args = array(
'post_type' => 'wpmark_review',
'posts_per_page' => 5,
'meta_key' => '_wpmark_review_rating',
'meta_value' => 5
);
$reviews_query = new WP_Query($args);
if ($reviews_query->have_posts()) {
echo '<ul>';
while ($reviews_query->have_posts()) {
$reviews_query->the_post();
echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
}
echo '</ul>';
wp_reset_postdata();
} else {
echo '<p>Отзывы с рейтингом 5 не найдены.</p>';
}Рекомендации по оптимизации и безопасности при работе с CPT
При создании собственных пост типах важно помнить про безопасность и производительность. Вот несколько советов:
- Всегда используйте префиксы в именах функций и метаполей, чтобы избежать конфликтов (например,
wpmark_register_post_type_reviews). - Проверяйте права пользователя перед сохранением метаданных (например, через
current_user_can). - Кэшируйте запросы и используйте пагинацию, чтобы не перегружать сервер.
- Используйте
show_in_rest => true, чтобы обеспечить совместимость с редактором Gutenberg. - При необходимости создавайте отдельные шаблоны для CPT, чтобы улучшить пользовательский опыт.
Следуя этим рекомендациям, вы создадите мощный и удобный инструмент для управления контентом на вашем сайте.