В WordPress нестандартные типы постов (custom post types, CPT) позволяют создавать уникальные структуры данных, выходящие за рамки обычных записей и страниц. При этом аксессуары (custom fields, метаполя) дают возможность расширять эти типы постов дополнительными свойствами, что очень важно для создания удобного и функционального сайта. В этой статье мы подробно рассмотрим, как создать CPT с аксессуарами, приводя конкретные примеры кода и рекомендации по использованию плагинов.
Что такое нестандартные типы постов и зачем они нужны
Стандартный WordPress предлагает два основных типа контента — «Записи» и «Страницы». Однако для многих проектов этого недостаточно. Например, если вы хотите создать сайт с каталогом товаров, портфолио, отзывами или событиями, вам нужны отдельные типы постов с уникальными полями и логикой.
Нестандартные типы постов позволяют организовать контент по тематикам, которые не вписываются в стандартные записи, облегчая управление и улучшая структуру сайта.
Для создания нестандартных типов постов WordPress предлагает функцию register_post_type(). С помощью неё можно определить название типа, метки, параметры отображения и многое другое.
Пример создания простого CPT «Книги»
function wplancer_register_post_type_books() {
$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' => 'Книг нет в корзине',
);
$args = array(
'labels' => $labels,
'public' => true,
'has_archive' => true,
'supports' => array('title', 'editor', 'thumbnail'),
'menu_position' => 5,
'menu_icon' => 'dashicons-book-alt',
);
register_post_type('wplancer_book', $args);
}
add_action('init', 'wplancer_register_post_type_books');
Этот код добавит в админку WordPress новый раздел «Книги» с базовыми функциями.
Как добавить аксессуары (метаполя) к кастомным типам постов
После создания CPT возникает задача добавить к ним дополнительные поля — «аксессуары». Это могут быть ISBN книги, автор, год издания и другие данные.
Есть два основных способа: с помощью плагинов и программно.
Использование плагина Advanced Custom Fields (ACF)
ACF — это мощный и удобный плагин для создания любых метаполей. Его плюс в визуальном редакторе и большом наборе типов полей.
Для CPT «Книги» можно создать группу полей с именами «Автор», «Год издания», «ISBN» и привязать их к типу поста.
Для вывода полей в шаблоне используйте функцию get_field():
<?php
$author = get_field('author');
echo '<p>Автор: ' . esc_html($author) . '</p>';
?>
Подробнее про ACF и его возможности читайте на https://wpshop.ru/plugins/advanced-custom-fields.
Программное добавление метабоксов и сохранение данных
Если хотите сделать всё самостоятельно без плагинов, можно создать метабоксы вручную и сохранить данные через хуки.
Создание метабокса
function wplancer_add_meta_box_book_details() {
add_meta_box(
'wplancer_book_details',
'Детали книги',
'wplancer_book_details_callback',
'wplancer_book',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'wplancer_add_meta_box_book_details');
function wplancer_book_details_callback($post) {
wp_nonce_field('wplancer_save_book_details', 'wplancer_book_nonce');
$author = get_post_meta($post->ID, '_wplancer_book_author', true);
$year = get_post_meta($post->ID, '_wplancer_book_year', true);
$isbn = get_post_meta($post->ID, '_wplancer_book_isbn', true);
echo '<p><label>Автор:</label> ';
echo '<input type="text" name="wplancer_book_author" value="' . esc_attr($author) . '" /></p>';
echo '<p><label>Год издания:</label> ';
echo '<input type="number" name="wplancer_book_year" value="' . esc_attr($year) . '" /></p>';
echo '<p><label>ISBN:</label> ';
echo '<input type="text" name="wplancer_book_isbn" value="' . esc_attr($isbn) . '" /></p>';
}
Сохранение данных метаполей
function wplancer_save_book_details($post_id) {
if (!isset($_POST['wplancer_book_nonce']) || !wp_verify_nonce($_POST['wplancer_book_nonce'], 'wplancer_save_book_details')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wplancer_book_author'])) {
update_post_meta($post_id, '_wplancer_book_author', sanitize_text_field($_POST['wplancer_book_author']));
}
if (isset($_POST['wplancer_book_year'])) {
update_post_meta($post_id, '_wplancer_book_year', intval($_POST['wplancer_book_year']));
}
if (isset($_POST['wplancer_book_isbn'])) {
update_post_meta($post_id, '_wplancer_book_isbn', sanitize_text_field($_POST['wplancer_book_isbn']));
}
}
add_action('save_post', 'wplancer_save_book_details');
Такой подход даёт полный контроль над функционалом и не требует сторонних плагинов.
Вывод нестандартных типов постов с аксессуарами на фронтенде
После создания CPT и добавления аксессуаров нужно корректно вывести данные на сайте. Для этого создают шаблоны single-wplancer_book.php и archive-wplancer_book.php в теме.
Пример вывода данных в шаблоне single-wplancer_book.php
<?php get_header(); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h1><?php the_title(); ?></h1>
<div class="book-details">
<p>Автор: <?php echo esc_html(get_post_meta(get_the_ID(), '_wplancer_book_author', true)); ?></p>
<p>Год издания: <?php echo esc_html(get_post_meta(get_the_ID(), '_wplancer_book_year', true)); ?></p>
<p>ISBN: <?php echo esc_html(get_post_meta(get_the_ID(), '_wplancer_book_isbn', true)); ?></p>
</div>
<div class="content"><?php the_content(); ?></div>
<?php endwhile; endif; ?>
<?php get_footer(); ?>
Использование WP_Query для вывода архива с фильтрацией
Для создания фильтра по автору или году издания можно использовать мета-запросы WP_Query.
$args = array(
'post_type' => 'wplancer_book',
'meta_query' => array(
array(
'key' => '_wplancer_book_author',
'value' => 'Иван Иванов',
'compare' => 'LIKE'
),
),
);
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
echo '<h2>' . get_the_title() . '</h2>';
// Другой вывод
}
} else {
echo 'Книги не найдены';
}
wp_reset_postdata();
Рекомендации по производительности и совместимости
При добавлении большого количества нестандартных типов постов и аксессуаров важно следить за производительностью сайта. Метаполя хранятся в таблице wp_postmeta, и тяжелые запросы по ней могут замедлить сайт.
Для оптимизации используйте кэширование, индексацию метаполей в базе данных и минимизируйте количество запросов.
Плагин Clearfy Pro может помочь с оптимизацией и отключением ненужных функций в WordPress, что положительно скажется на быстродействии.
Заключение
Создание нестандартных типов постов с аксессуарами — мощный инструмент для расширения функционала WordPress. Выбор между плагинами и программной реализацией зависит от задач и навыков разработчика. В любом случае, грамотная организация CPT и метаполей улучшает структуру сайта и упрощает управление контентом.
Подробнее про полезные инструменты и плагины для работы с кастомными типами постов и оптимизацией читайте на wpshop.ru.