В WordPress создание собственных типов записей (Custom Post Types, CPT) позволяет расширять возможности сайта и структурировать контент по своим потребностям. В этой статье мы подробно разберём, как создать уникальный тип записи с поддержкой метаданных (кастомных полей), чтобы хранить дополнительную информацию и удобно работать с ней в админ-панели.
Что такое тип записи и зачем создавать собственный
Тип записи — это категория контента в WordPress. По умолчанию есть несколько типов, например, post (записи блога), page (страницы), attachment (медиафайлы). Но часто на проектах нужны свои типы, например, портфолио, отзывы, события и т.д.
Создание собственного типа записи упрощает работу с контентом, позволяет задать удобные метаданные, шаблоны отображения и фильтры. Это гораздо лучше, чем использовать стандартные записи и пытаться различать их вручную.
Регистрация уникального типа записи в WordPress
Для регистрации CPT в WordPress существует функция register_post_type(). Рассмотрим пример создания типа записи project для портфолио.
function wpdesk_register_post_type_project() {
$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,
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio',
'supports' => array('title', 'editor', 'thumbnail', 'excerpt'),
'show_in_rest' => true // Для поддержки Gutenberg
);
register_post_type('project', $args);
}
add_action('init', 'wpdesk_register_post_type_project');
Этот код регистрирует новый тип записи 'project' с поддержкой заголовка, контента, миниатюры и выдержки.
Добавление метаданных к типу записи
Метаданные позволяют хранить дополнительную информацию, например, дату завершения проекта, ссылку на репозиторий, описание технологии и т.д. Для этого нужно создать мета-боксы в админке и сохранять данные.
Создание мета-бокса
Используем хук add_meta_boxes для добавления своего поля.
function wpdesk_add_meta_boxes_project() {
add_meta_box(
'wpdesk_project_info',
'Информация о проекте',
'wpdesk_render_meta_box_project_info',
'project',
'normal',
'default'
);
}
add_action('add_meta_boxes', 'wpdesk_add_meta_boxes_project');
function wpdesk_render_meta_box_project_info($post) {
// Безопасность
wp_nonce_field('wpdesk_save_project_info', 'wpdesk_project_nonce');
// Получаем сохранённые значения
$project_date = get_post_meta($post->ID, '_wpdesk_project_date', true);
$project_github = get_post_meta($post->ID, '_wpdesk_project_github', true);
echo '<p><label for="wpdesk_project_date">Дата завершения проекта:</label><br>';
echo '<input type="date" id="wpdesk_project_date" name="wpdesk_project_date" value="' . esc_attr($project_date) . '" /></p>';
echo '<p><label for="wpdesk_project_github">Ссылка на GitHub:</label><br>';
echo '<input type="url" id="wpdesk_project_github" name="wpdesk_project_github" value="' . esc_attr($project_github) . '" size="50" /></p>';
}
Сохранение метаданных
Для сохранения используем хук save_post. Важно проверять nonce и права пользователя.
function wpdesk_save_project_info($post_id) {
if (!isset($_POST['wpdesk_project_nonce']) || !wp_verify_nonce($_POST['wpdesk_project_nonce'], 'wpdesk_save_project_info')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (!current_user_can('edit_post', $post_id)) {
return;
}
if (isset($_POST['wpdesk_project_date'])) {
update_post_meta($post_id, '_wpdesk_project_date', sanitize_text_field($_POST['wpdesk_project_date']));
}
if (isset($_POST['wpdesk_project_github'])) {
update_post_meta($post_id, '_wpdesk_project_github', esc_url_raw($_POST['wpdesk_project_github']));
}
}
add_action('save_post', 'wpdesk_save_project_info');
Вывод метаданных на фронтенде
Для отображения информации о проекте на сайте используйте стандартные шаблонные теги и функции.
<?php
$project_date = get_post_meta(get_the_ID(), '_wpdesk_project_date', true);
$project_github = get_post_meta(get_the_ID(), '_wpdesk_project_github', true);
?>
<div class="project-info">
<p><strong>Дата завершения:</strong> <?php echo esc_html($project_date); ?></p>
<p><strong>GitHub:</strong> <a href="<?php echo esc_url($project_github); ?>" target="_blank" rel="nofollow">Ссылка на репозиторий</a></p>
</div>
Полезные плагины для работы с типами записей и метаданными
Если хочется упростить создание CPT и метаполей, можно использовать плагины:
- Clearfy Pro — плагин с функциями оптимизации и расширения WordPress, включая удобные инструменты для CPT и мета.
- WPRemark — расширенный редактор и менеджер метаданных для типов записей.
Использование этих плагинов поможет сэкономить время и избежать ошибок при создании сложных структур данных.
Особенности и рекомендации при работе с CPT и метаданными
Создавая собственные типы записей, помните:
- Всегда регистрируйте CPT на хуке
init, чтобы быть уверенным, что все функции WordPress загружены. - Используйте префиксы в названиях функций и метаполей, например,
wpdesk_, чтобы избежать конфликтов с другими плагинами. - Обязательно проверяйте права пользователя и nonce при сохранении метаданных для безопасности.
- Для удобства работы с Gutenberg добавляйте параметр
show_in_rest = true. - При необходимости создавайте отдельные шаблоны для отображения CPT, например,
single-project.php.
Выводы
Создание уникального типа записи с метаданными — мощный инструмент для кастомизации сайта на WordPress. Такой подход поможет структурировать сложный контент, улучшить работу редакторов и создать удобный интерфейс для пользователей. Код в статье — базовый шаблон, который вы можете адаптировать под свои задачи.