В WordPress по умолчанию есть несколько типов контента: записи, страницы, вложения и другие. Но часто для удобства работы с контентом нужно создавать собственные типы постов (Custom Post Types, CPT), которые позволят структурировать данные и выводить их на сайте более гибко. Кроме того, для каждого типа поста полезно добавить метаполя — дополнительные поля с информацией, например, цена, дата, рейтинг и так далее.
Что такое индивидуальные типы постов и зачем они нужны
Индивидуальные типы постов — это структуры данных, которые можно создавать в WordPress для хранения и организации контента, отличного от стандартных записей и страниц. Например, если у вас сайт с каталогом книг, то логично создать тип поста "Книга" с уникальными полями вроде автора, года издания и жанра.
Использование CPT позволяет:
- Разделять разные виды контента для удобства управления.
- Настраивать отдельные шаблоны вывода.
- Добавлять метаполя для хранения специфичных данных.
- Использовать отдельные таксономии (категории и теги).
Регистрация собственного типа поста в WordPress
Для регистрации CPT в WordPress используется функция register_post_type(). Рассмотрим пример создания типа поста "Книга".
function wpkit_register_post_type_book() {
$labels = array(
'name' => 'Книги',
'singular_name' => 'Книга',
'menu_name' => 'Книги',
'name_admin_bar' => 'Книга',
'add_new' => 'Добавить новую',
'add_new_item' => 'Добавить новую книгу',
'edit_item' => 'Редактировать книгу',
'new_item' => 'Новая книга',
'view_item' => 'Просмотреть книгу',
'search_items' => 'Поиск книг',
'not_found' => 'Книги не найдены',
'not_found_in_trash' => 'В корзине книг не найдено',
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'rewrite' => array('slug' => 'books'),
'show_in_rest' => true, // поддержка Gutenberg
'supports' => array('title', 'editor', 'thumbnail'),
'menu_position' => 5,
'menu_icon' => 'dashicons-book',
);
register_post_type('wpkit_book', $args);
}
add_action('init', 'wpkit_register_post_type_book');
Этот код создаст новый тип поста "Книга", который будет доступен в админке WordPress с поддержкой основного редактора и миниатюр.
Добавление метаполей к индивидуальному типу поста
Чтобы расширить тип поста дополнительными полями, можно использовать add_meta_box() для добавления метабоксов в админку, а затем сохранить данные с помощью хука save_post. Рассмотрим, как добавить поле "Автор книги" и "Год издания" для нашего типа "Книга".
Создание метабокса
function wpkit_add_book_meta_boxes() {
add_meta_box(
'wpkit_book_details', // ID метабокса
'Детали книги', // Заголовок
'wpkit_render_book_meta_box', // Callback выводящий HTML
'wpkit_book', // Тип поста
'normal',
'default'
);
}
add_action('add_meta_boxes', 'wpkit_add_book_meta_boxes');
function wpkit_render_book_meta_box($post) {
// Безопасность
wp_nonce_field('wpkit_save_book_meta', 'wpkit_book_meta_nonce');
$author = get_post_meta($post->ID, '_wpkit_book_author', true);
$year = get_post_meta($post->ID, '_wpkit_book_year', true);
echo '<p><label for="wpkit_book_author">Автор книги:</label><br />';
echo '<input type="text" id="wpkit_book_author" name="wpkit_book_author" value="' . esc_attr($author) . '" size="25" /></p>';
echo '<p><label for="wpkit_book_year">Год издания:</label><br />';
echo '<input type="number" id="wpkit_book_year" name="wpkit_book_year" value="' . esc_attr($year) . '" size="4" /></p>';
}
Сохранение метаданных
function wpkit_save_book_meta($post_id) {
if (!isset($_POST['wpkit_book_meta_nonce']) || !wp_verify_nonce($_POST['wpkit_book_meta_nonce'], 'wpkit_save_book_meta')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wpkit_book_author'])) {
update_post_meta($post_id, '_wpkit_book_author', sanitize_text_field($_POST['wpkit_book_author']));
}
if (isset($_POST['wpkit_book_year'])) {
update_post_meta($post_id, '_wpkit_book_year', intval($_POST['wpkit_book_year']));
}
}
add_action('save_post', 'wpkit_save_book_meta');
Вывод индивидуальных типов постов с метаполями на фронтенде
Для вывода кастомных типов постов с метаполями в шаблонах используйте WP_Query и функции получения метаданных.
$args = array(
'post_type' => 'wpkit_book',
'posts_per_page' => 10
);
$query = new WP_Query($args);
if ($query->have_posts()) {
echo '<div class="book-list">';
while ($query->have_posts()) {
$query->the_post();
$author = get_post_meta(get_the_ID(), '_wpkit_book_author', true);
$year = get_post_meta(get_the_ID(), '_wpkit_book_year', true);
echo '<div class="book-item">';
echo '<h2>' . get_the_title() . '</h2>';
echo '<p>Автор: ' . esc_html($author) . '</p>';
echo '<p>Год издания: ' . esc_html($year) . '</p>';
echo '<div class="content">' . get_the_content() . '</div>';
echo '</div>';
}
echo '</div>';
wp_reset_postdata();
} else {
echo '<p>Книги не найдены.</p>';
}
Полезные плагины для работы с CPT и метаполями
Если не хочется писать код, можно использовать плагины, которые помогут создавать и управлять CPT и метаполями:
- Custom Post Type UI — удобный интерфейс регистрации типов постов и таксономий.
- Advanced Custom Fields Pro — мощный инструмент для создания метаполей с разными типами данных.
- Clearfy Pro — оптимизация и настройка WordPress, в том числе управление CPT.
Заключение по теме создания CPT с метаполями
Регистрация индивидуальных типов постов с метаполями — это отличный способ структурировать контент и расширить функциональность сайта на WordPress. Ручная реализация через код даёт максимальный контроль и гибкость, а использование специализированных плагинов ускоряет процесс без необходимости программирования. Выбирайте подходящий метод в зависимости от задач и опыта.