В WordPress стандартно используются посты, страницы и несколько других типов содержимого, но часто возникает необходимость создать собственный тип данных (Custom Post Type, CPT) для более точной организации и управления контентом. В этой статье мы подробно рассмотрим, как создать и эффективно использовать собственный тип данных в WordPress, а также как работать с метаданными и таксономиями для расширения возможностей.
Что такое собственный тип данных и зачем он нужен
Собственный тип данных — это способ добавить в WordPress новый тип контента, который отличается от стандартных постов и страниц. Например, если у вас сайт с каталогом книг, событиями, отзывами или портфолио, создание CPT позволяет структурировать данные логично и удобно.
Использование CPT упрощает управление данными, улучшает пользовательский интерфейс в админке и повышает качество SEO за счет правильной организации контента.
Основные преимущества кастомных типов данных
- Разделение контента по типам для удобства управления;
- Возможность назначать уникальные метаданные и таксономии;
- Гибкость в отображении и фильтрации информации;
- Улучшение структуры сайта и навигации.
Создание собственного типа данных через функцию register_post_type
Для создания кастомного типа данных в WordPress используется функция register_post_type. Рекомендуется регистрировать CPT в хуке init для корректной работы.
function wpdata_register_custom_post_type() {
$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' => 'Искать книги',
'parent_item_colon' => 'Родительская книга:',
'not_found' => 'Книги не найдены.',
'not_found_in_trash' => 'В корзине книги не найдены.'
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'books'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'supports' => array('title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments'),
'show_in_rest' => true // Включаем поддержку Gutenberg и REST API
);
register_post_type('wpdata_book', $args);
}
add_action('init', 'wpdata_register_custom_post_type');В этом примере создается тип данных «Книги» с поддержкой основных возможностей, включая редактор, миниатюры и комментарии. Важно правильно выбрать slug и имя типа, чтобы избежать конфликтов.
Добавление пользовательских метаданных к собственному типу данных
Чтобы расширить CPT дополнительными данными (например, автор книги, год издания, ISBN), нужно добавить пользовательские поля (метаданные). Для этого удобно использовать функцию add_meta_box и сохранить данные через хуки.
Создание мета-бокса для CPT
function wpdata_add_custom_meta_box() {
add_meta_box(
'wpdata_book_details',
'Детали книги',
'wpdata_book_meta_box_callback',
'wpdata_book',
'normal',
'high'
);
}
add_action('add_meta_boxes', 'wpdata_add_custom_meta_box');
function wpdata_book_meta_box_callback($post) {
wp_nonce_field('wpdata_save_book_details', 'wpdata_book_nonce');
$author = get_post_meta($post->ID, '_wpdata_book_author', true);
$year = get_post_meta($post->ID, '_wpdata_book_year', true);
$isbn = get_post_meta($post->ID, '_wpdata_book_isbn', true);
echo '<label for="wpdata_book_author">Автор:</label>';
echo '<input type="text" id="wpdata_book_author" name="wpdata_book_author" value="' . esc_attr($author) . '" size="25" />';
echo '<br/><br/><label for="wpdata_book_year">Год издания:</label>';
echo '<input type="number" id="wpdata_book_year" name="wpdata_book_year" value="' . esc_attr($year) . '" size="4" />';
echo '<br/><br/><label for="wpdata_book_isbn">ISBN:</label>';
echo '<input type="text" id="wpdata_book_isbn" name="wpdata_book_isbn" value="' . esc_attr($isbn) . '" size="20" />';
}Сохранение метаданных при сохранении записи
function wpdata_save_book_details($post_id) {
if (!isset($_POST['wpdata_book_nonce']) || !wp_verify_nonce($_POST['wpdata_book_nonce'], 'wpdata_save_book_details')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wpdata_book_author'])) {
update_post_meta($post_id, '_wpdata_book_author', sanitize_text_field($_POST['wpdata_book_author']));
}
if (isset($_POST['wpdata_book_year'])) {
update_post_meta($post_id, '_wpdata_book_year', intval($_POST['wpdata_book_year']));
}
if (isset($_POST['wpdata_book_isbn'])) {
update_post_meta($post_id, '_wpdata_book_isbn', sanitize_text_field($_POST['wpdata_book_isbn']));
}
}
add_action('save_post', 'wpdata_save_book_details');Создание и использование таксономий для собственного типа данных
Таксономии помогают группировать записи CPT по категориям, тегам или другим параметрам. Вы можете создавать собственные таксономии или использовать встроенные.
Регистрация пользовательской таксономии
function wpdata_register_book_taxonomies() {
$labels = array(
'name' => 'Жанры',
'singular_name' => 'Жанр',
'search_items' => 'Искать жанры',
'all_items' => 'Все жанры',
'parent_item' => 'Родительский жанр',
'parent_item_colon' => 'Родительский жанр:',
'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('wpdata_genre', array('wpdata_book'), $args);
}
add_action('init', 'wpdata_register_book_taxonomies');Теперь для записей типа «Книга» доступна таксономия «Жанры» с древовидной структурой, что удобно для классификации.
Вывод записей собственного типа данных на сайте с фильтрацией и пагинацией
Для отображения записей CPT на фронтенде обычно используется WP_Query с необходимыми параметрами. Рассмотрим пример вывода списка книг с фильтром по жанру и пагинацией.
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
'post_type' => 'wpdata_book',
'posts_per_page' => 10,
'paged' => $paged,
);
if (!empty($_GET['genre'])) {
$args['tax_query'] = array(
array(
'taxonomy' => 'wpdata_genre',
'field' => 'slug',
'terms' => sanitize_text_field($_GET['genre']),
),
);
}
$wpdata_query = new WP_Query($args);
if ($wpdata_query->have_posts()) {
while ($wpdata_query->have_posts()) {
$wpdata_query->the_post();
echo '<h2><a href="' . get_permalink() . '">' . get_the_title() . '</a></h2>';
echo '<div>' . get_the_excerpt() . '</div>';
}
// Пагинация
echo paginate_links(array(
'total' => $wpdata_query->max_num_pages
));
} else {
echo '<p>Книги не найдены.</p>';
}
wp_reset_postdata();Такой подход позволяет динамически выводить только нужные записи с удобной навигацией.
Рекомендуемые плагины для работы с собственными типами данных и метаданными
Хотя создание CPT и мета-полей вручную даёт полный контроль, иногда полезно использовать готовые решения:
- Clearfy Pro — помогает оптимизировать сайт и добавить расширенные возможности для кастомных типов;
- WPRemark — плагин для расширенного управления комментариями, который можно адаптировать под собственные типы записей;
- Advanced Custom Fields (ACF) — популярный плагин для удобного создания и управления пользовательскими полями, совместим с CPT.
Использование этих инструментов поможет сэкономить время и упростить разработку.
Советы по оптимизации и безопасности при работе с кастомными типами данных
При создании CPT и метаданных важно не забывать про безопасность и производительность:
- Используйте
wp_nonce_fieldи проверяйте nonce при сохранении данных, чтобы предотвратить CSRF-атаки; - Обрабатывайте данные с помощью
sanitize_text_field,intvalи других функций очистки; - Не регистрируйте CPT и таксономии без необходимости — это влияет на нагрузку;
- Для больших объемов данных используйте индексы по метаданным и оптимизируйте запросы;
- Кешируйте результаты запросов и используйте REST API для асинхронного взаимодействия.
Соблюдение этих рекомендаций поможет создать стабильный и быстрый сайт.