В WordPress стандартно используются типы записей — Посты и Страницы. Но для многих проектов этого недостаточно, особенно если нужно структурировать контент нестандартным образом. В таких случаях на помощь приходят пользовательские типы записей (Custom Post Types, CPT). Это мощный инструмент, который позволяет расширить возможности сайта и организовать данные так, как вам удобно.
Что такое пользовательские типы записей и зачем они нужны
Пользовательские типы записей — это объекты, похожие на стандартные посты, но созданные специально под ваши нужды. Например, если вы делаете сайт с каталогом книг, логично создать тип записи "Книга" с собственными полями и метаданными. Это упрощает управление контентом, позволяет легко фильтровать и выводить записи в шаблонах.
Без CPT часто приходится использовать категории или таксономии для разных типов контента, что не всегда удобно и логично. CPT же выделяют каждый тип контента в отдельную сущность с возможностью задать уникальные настройки.
Кроме того, CPT поддерживают собственные таксономии, шаблоны вывода и могут быть интегрированы с плагинами для расширения функционала.
Создание пользовательского типа записи через код
Самый надежный и гибкий способ — зарегистрировать CPT вручную в functions.php вашей темы или в отдельном плагине. Для регистрации используется функция register_post_type(). Рассмотрим пример создания CPT "Книга".
function wpcore_register_cpt_book() {
$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' => 'books'),
'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
'show_in_rest' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-book',
'taxonomies' => array('category', 'post_tag'),
);
register_post_type('wpcore_book', $args);
}
add_action('init', 'wpcore_register_cpt_book');В этом коде мы задаем основные метки для интерфейса, указываем, что тип записи публичный, поддерживает редактор, миниатюры и пользовательские поля, а также включает REST API. Это позволяет работать с CPT в новых редакторах и через внешние приложения.
Обратите внимание на префикс wpcore_ в названии функции и идентификаторе CPT — это хорошая практика для избегания конфликтов.
Добавление пользовательских полей к CPT
Для расширения возможностей типа записи полезно добавить метаполя. Самый простой способ — использовать плагин Advanced Custom Fields (ACF). Он позволяет создавать удобный интерфейс для ввода данных без кода.
Если же вы хотите сделать это вручную, можно использовать функции WordPress для работы с метаданными. Пример добавления поля "Автор" к CPT "Книга":
function wpcore_add_book_meta_box() {
add_meta_box('wpcore_book_author', 'Автор книги', 'wpcore_book_author_callback', 'wpcore_book', 'normal', 'high');
}
add_action('add_meta_boxes', 'wpcore_add_book_meta_box');
function wpcore_book_author_callback($post) {
$author = get_post_meta($post->ID, '_wpcore_book_author', true);
echo '<label for="wpcore_book_author">Имя автора:</label>';
echo '<input type="text" id="wpcore_book_author" name="wpcore_book_author" value="' . esc_attr($author) . '" size="25" />';
}
function wpcore_save_book_author_meta($post_id) {
if (array_key_exists('wpcore_book_author', $_POST)) {
update_post_meta($post_id, '_wpcore_book_author', sanitize_text_field($_POST['wpcore_book_author']));
}
}
add_action('save_post', 'wpcore_save_book_author_meta');Этот код добавляет метабокс в редактор записи типа "Книга", где можно указать имя автора, и сохраняет это значение при сохранении записи.
Вывод пользовательских типов записей на фронтенде
Для отображения CPT на сайте создайте шаблон archive-wpcore_book.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 $author = get_post_meta(get_the_ID(), '_wpcore_book_author', true); ?>
<p>Автор: <?php echo esc_html($author); ?></p>
</li>
<?php endwhile; ?>
</ul>
<?php else : ?>
<p>Книги не найдены.</p>
<?php endif; ?>
<?php get_footer(); ?>Такой подход обеспечивает удобную организацию и вывод контента, который отлично интегрируется в любую тему.
Использование плагинов для создания CPT
Если вы не хотите писать код, можно воспользоваться популярными плагинами:
- Custom Post Type UI — мощный и простой плагин для регистрации CPT и таксономий через удобный интерфейс.
- Pods Framework — расширенный инструмент для создания CPT, таксономий и пользовательских полей с гибкими настройками.
- Advanced Custom Fields — для создания метаполей и управления ими.
Плагины упрощают задачу, но при этом дают меньше контроля над кодом и производительностью.
Советы по работе с пользовательскими типами записей
При создании CPT важно придерживаться нескольких правил:
- Используйте уникальные и понятные имена — лучше с префиксом, чтобы избежать конфликтов.
- Регистрация CPT должна происходить на хуке
init, чтобы WordPress успел корректно обработать типы. - Обязательно добавляйте поддержку REST API (
'show_in_rest' => true) для совместимости с новым редактором Gutenberg и API. - Создавайте шаблоны вывода CPT в теме, чтобы контролировать внешний вид и функциональность.
- Если планируете использовать метаполя, продумайте структуру данных заранее.
Таким образом, пользовательские типы записей помогут вам создать удобный и мощный сайт на WordPress с четкой структурой и возможностями расширения.