WordPress по умолчанию предлагает стандартные типы записей: посты, страницы, вложения и т.д. Но зачастую для удобной организации и структурирования контента нужно создавать свои, кастомные типы записей (Custom Post Types, CPT). Это одна из главных возможностей WordPress, которая позволяет создавать сайты с уникальной логикой и структурой данных.
Что такое собственные типы записей и зачем они нужны
Собственные типы записей — это отдельные сущности, которые позволяют хранить и отображать контент, отличный от стандартных постов и страниц. Например, если вы создаёте сайт для кинотеатра, то логично завести CPT «Фильмы», где будут храниться все данные о фильмах. Или для сайта недвижимости — CPT «Объекты недвижимости».
Преимущества CPT:
- Гибкая организация контента;
- Отдельная админ-панель с нужными мета-полями;
- Упрощение работы с контентом для редакторов;
- Возможность применять уникальные шаблоны для вывода.
Используя CPT, вы расширяете возможности WordPress и делаете сайт более профессиональным.
Создание собственного типа записей с помощью кода
Для регистрации собственного типа записей используется функция register_post_type(). Лучше всего регистрировать CPT внутри хука init. Рассмотрим пример создания CPT «wppremium_movie» для сайта с фильмами.
function wppremium_register_cpt_movie() {
$labels = array(
'name' => 'Фильмы',
'singular_name' => 'Фильм',
'add_new' => 'Добавить фильм',
'add_new_item' => 'Добавить новый фильм',
'edit_item' => 'Редактировать фильм',
'new_item' => 'Новый фильм',
'view_item' => 'Просмотреть фильм',
'search_items' => 'Поиск фильмов',
'not_found' => 'Фильмы не найдены',
'not_found_in_trash' => 'В корзине фильмы не найдены',
'menu_name' => 'Фильмы'
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'movies'),
'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
'show_in_rest' => true,
);
register_post_type('wppremium_movie', $args);
}
add_action('init', 'wppremium_register_cpt_movie');В этом примере мы задаём метки для интерфейса, включаем поддержку заголовка, редактора, миниатюр и произвольных полей. Также включаем REST API поддержку через show_in_rest, что полезно для Gutenber и внешних API.
После добавления такого кода в файл functions.php вашей темы или в отдельный плагин, в админ-панели появится новый пункт меню «Фильмы».
Использование плагинов для создания Custom Post Types
Если вы не хотите писать код вручную, есть проверенные плагины, которые значительно упрощают создание и управление CPT:
- Custom Post Type UI — самый популярный плагин для создания и настройки кастомных типов записей и таксономий без единой строки кода;
- Pods — более мощный инструмент, который кроме CPT позволяет создавать сложные связи, поля и шаблоны данных;
- Toolset Types — платный плагин с расширенными возможностями для построения сложных сайтов.
Для примера рассмотрим Custom Post Type UI:
- Установите и активируйте плагин.
- Перейдите в меню «CPT UI» > «Add/Edit Post Types».
- Заполните поля: уникальный слаг, название, метки.
- Настройте поддержку заголовков, редактора, миниатюр и т.п.
- Сохраните и проверьте появление нового типа записей в админке.
Такой подход особенно удобен для тех, кто не хочет погружаться в тонкости кода.
Как добавить мета-поля для собственного типа записей
Часто одного типа записи недостаточно — нужно добавить дополнительные поля, например, дату выхода фильма, рейтинг, или ссылку на трейлер. Для этого можно использовать плагин Advanced Custom Fields (ACF) или писать код самостоятельно.
Пример создания мета-поля вручную с помощью метабоксов:
function wppremium_add_movie_metabox() {
add_meta_box(
'wppremium_movie_details',
'Детали фильма',
'wppremium_movie_metabox_callback',
'wppremium_movie',
'normal',
'default'
);
}
add_action('add_meta_boxes', 'wppremium_add_movie_metabox');
function wppremium_movie_metabox_callback($post) {
wp_nonce_field('wppremium_save_movie_metabox', 'wppremium_movie_nonce');
$release_date = get_post_meta($post->ID, '_wppremium_release_date', true);
echo '<label for="wppremium_release_date">Дата выхода:</label> ';
echo '<input type="date" id="wppremium_release_date" name="wppremium_release_date" value="'.esc_attr($release_date).'" />';
}
function wppremium_save_movie_metabox($post_id) {
if (!isset($_POST['wppremium_movie_nonce'])) return;
if (!wp_verify_nonce($_POST['wppremium_movie_nonce'], 'wppremium_save_movie_metabox')) return;
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!current_user_can('edit_post', $post_id)) return;
if (isset($_POST['wppremium_release_date'])) {
update_post_meta($post_id, '_wppremium_release_date', sanitize_text_field($_POST['wppremium_release_date']));
}
}
add_action('save_post', 'wppremium_save_movie_metabox');В данном примере создаётся метабокс с датой выхода фильма. При сохранении поста данные сохраняются в метаполе.
Вывод собственных типов записей на сайте
Чтобы выводить записи CPT на фронтенде, можно создать отдельный шаблон archive-wppremium_movie.php или использовать WP_Query внутри шаблонов.
Пример простого цикла для вывода фильмов:
$args = array(
'post_type' => 'wppremium_movie',
'posts_per_page' => 10
);
$movies = new WP_Query($args);
if ($movies->have_posts()) {
while ($movies->have_posts()) {
$movies->the_post();
echo '<h2>'.get_the_title().'</h2>';
echo '<div>'.get_the_content().'</div>';
$release_date = get_post_meta(get_the_ID(), '_wppremium_release_date', true);
if ($release_date) {
echo '<p>Дата выхода: '.esc_html($release_date).'</p>';
}
}
wp_reset_postdata();
} else {
echo 'Фильмы не найдены';
}Так вы сможете вывести кастомный контент в любом месте темы.
Советы по работе с собственными типами записей
Чтобы работа с CPT была комфортной и эффективной, рекомендуем придерживаться следующих правил:
- Используйте уникальный префикс для функций и идентификаторов, чтобы избежать конфликтов (например,
wppremium_). - Добавляйте поддержку REST API, чтобы иметь возможность управлять CPT из Gutenberg и внешних приложений.
- Создавайте отдельные шаблоны для CPT — archive, single, taxonomy.
- Не забывайте про безопасность и проверку nonce при сохранении пользовательских данных.
- Регулярно тестируйте работу CPT при обновлениях WordPress и плагинов.
Использование собственных типов записей — это мощный инструмент для создания профессиональных сайтов на WordPress, который позволит вам реализовать практически любые задачи по организации контента.