Что такое Custom Post Types в WordPress и зачем они нужны
WordPress изначально предоставляет несколько типов записей: посты, страницы, вложения и несколько других. Однако для создания более сложного, структурированного и уникального контента часто нужно создавать собственные типы записей — Custom Post Types (CPT). Это позволяет организовать контент по категориям, отличающимся по смыслу и структуре от стандартных постов и страниц.
Например, если вы ведете сайт о фильмах, то фильмы могут быть отдельным CPT, а не просто постами. Это позволяет задать уникальные мета-поля, шаблоны отображения и логику обработки.
Использование CPT помогает улучшить навигацию по сайту, повысить удобство администрирования и расширить возможности для кастомизации.
Как зарегистрировать Custom Post Type в WordPress
Регистрация CPT происходит с помощью функции register_post_type(), которую нужно вызвать в хуке init. Рассмотрим пример, который создаст тип записи movie для сайта с фильмами.
function wpfinder_register_cpt_movie() {
$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' => 'movies'),
'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
'show_in_rest' => true, // для поддержки Gutenberg
'menu_position' => 5,
'menu_icon' => 'dashicons-video-alt2',
);
register_post_type('movie', $args);
}
add_action('init', 'wpfinder_register_cpt_movie');В этом коде мы определяем метки для админки, задаём основные параметры, включая поддержку миниатюр и кастомных полей, а также делаем CPT публичным и доступным для REST API.
Настройка пользовательских таксономий для Custom Post Types
Для удобной категоризации и фильтрации контента Custom Post Types часто дополняются пользовательскими таксономиями (например, жанры, режиссёры для фильмов). Создадим таксономию genre для нашего CPT movie.
function wpfinder_register_taxonomy_genre() {
$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' => 'genre'),
'show_in_rest' => true,
);
register_taxonomy('genre', array('movie'), $args);
}
add_action('init', 'wpfinder_register_taxonomy_genre');Теперь в админке для фильмов появится возможность указывать жанры, а на фронтенде можно выводить посты по жанрам.
Вывод Custom Post Types и таксономий на сайте: примеры и шаблоны
Для отображения списка фильмов с фильтрацией по жанру можно создать новый файл шаблона archive-movie.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>
<p><?php echo get_the_term_list( get_the_ID(), 'genre', 'Жанр: ', ', ' ); ?></p>
</li>
<?php endwhile; ?>
</ul>
<?php else : ?>
<p>Фильмы не найдены.</p>
<?php endif; ?>
<?php get_footer(); ?>Этот код выведет список всех фильмов с ссылками и жанрами. Чтобы отображать отдельные фильмы, можно создать single-movie.php с разметкой подробного просмотра.
Работа с мета-полями Custom Post Types: добавление и сохранение данных
Часто необходимо добавлять кастомные поля, например, дату выхода фильма или рейтинг. Можно использовать готовые плагины, например Advanced Custom Fields, но для понимания разберём, как добавить мета-поле вручную.
Добавим поле "Дата выхода" на страницу редактирования фильма.
function wpfinder_add_movie_metabox() {
add_meta_box(
'wpfinder_movie_release_date',
'Дата выхода',
'wpfinder_movie_release_date_callback',
'movie',
'side'
);
}
add_action('add_meta_boxes', 'wpfinder_add_movie_metabox');
function wpfinder_movie_release_date_callback($post) {
wp_nonce_field('wpfinder_save_movie_release_date', 'wpfinder_movie_nonce');
$value = get_post_meta($post->ID, '_wpfinder_release_date', true);
echo '<label for="wpfinder_release_date">Дата выхода: </label>';
echo '<input type="date" id="wpfinder_release_date" name="wpfinder_release_date" value="' . esc_attr($value) . '" />';
}
function wpfinder_save_movie_release_date($post_id) {
if (!isset($_POST['wpfinder_movie_nonce']) || !wp_verify_nonce($_POST['wpfinder_movie_nonce'], 'wpfinder_save_movie_release_date')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['wpfinder_release_date'])) {
update_post_meta($post_id, '_wpfinder_release_date', sanitize_text_field($_POST['wpfinder_release_date']));
}
}
add_action('save_post', 'wpfinder_save_movie_release_date');Теперь при редактировании фильма в админке можно указать дату выпуска, которая сохранится в мета-поле и будет доступна для вывода.
Лучшие плагины для работы с Custom Post Types и таксономиями
Если не хочется писать код вручную, существуют удобные плагины:
- Custom Post Type UI — простой интерфейс для создания CPT и таксономий без написания кода.
- Advanced Custom Fields (ACF) — мощный плагин для добавления и управления мета-полями любых типов.
- Pods — комплексное решение для создания и управления CPT, таксономиями и мета-данными.
Использование этих плагинов значительно ускорит разработку и позволит гибко настраивать структуру сайта.
Вывод и использование мета-полей и таксономий в шаблонах
Для вывода даты выхода фильма в шаблоне single-movie.php используйте:
$release_date = get_post_meta(get_the_ID(), '_wpfinder_release_date', true);
if ($release_date) {
echo '<p>Дата выхода: ' . esc_html($release_date) . '</p>';
}Для вывода жанров, как уже показано выше, воспользуйтесь get_the_term_list(). Такой подход позволяет вывести всю необходимую информацию о кастомном контенте в удобном виде.
Советы по оптимизации и SEO для Custom Post Types
Для улучшения SEO CPT стоит учитывать следующие моменты:
- Убедитесь, что для вашего CPT включены архивы (
has_archive => true), чтобы поисковики индексировали список записей. - Правильно настройте ЧПУ (человеко-понятные URL) через параметр
rewrite. - Добавьте поддержку мета-тегов SEO с помощью плагинов (например, Yoast SEO) — они обычно автоматически распознают CPT.
- Создайте уникальные шаблоны для CPT, чтобы повысить качество контента и удобство пользователя.
- Используйте внутренние ссылки и перелинковку между CPT и стандартными постами.
Такой подход обеспечит хорошую видимость ваших Custom Post Types в поисковых системах и улучшит пользовательский опыт.