В WordPress возможность создавать собственные типы записей (Custom Post Types, CPT) даёт огромный простор для организации контента. Особенно когда нужно добавить уникальные поля, которые не подходят в стандартную структуру постов или страниц. В этой статье подробно разберём, как создать собственный тип поста с уникальными метаполями, используя нативные функции WordPress и минимальное количество кода.
Почему стоит использовать собственные типы постов и метаполя
Стандартный тип поста «Запись» подходит для блогов и новостей, а «Страница» — для статического контента. Но когда у вас, например, сайт с каталогом товаров, портфолио или мероприятиями, удобнее выделить отдельный тип записи. Это упрощает фильтрацию, отображение и редактирование.
Уникальные поля (метаполя) позволяют хранить дополнительную информацию — например, даты, цены, характеристики и т. п. Они не входят в стандартный набор полей WordPress, поэтому требуют отдельной реализации.
На практике для добавления метаполей можно использовать плагины, например, Clearfy Pro или Advanced Custom Fields, но здесь разберём, как сделать это вручную — так вы лучше поймёте механизм.
Регистрация собственного типа поста в WordPress
Для создания CPT нам понадобится функция register_post_type(). Пропишем её в файле functions.php вашей темы или в отдельном плагине.
function wpcodex_register_portfolio_cpt() {
$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' => 'portfolio'),
'supports' => array('title', 'editor', 'thumbnail'),
'show_in_rest' => true,
'menu_position' => 5,
'menu_icon' => 'dashicons-portfolio',
);
register_post_type('wpcodex_portfolio', $args);
}
add_action('init', 'wpcodex_register_portfolio_cpt');В этом коде мы описали тип поста «Портфолио» с поддержкой заголовка, редактора и миниатюры. Также он будет доступен в REST API, что полезно для современных интерфейсов.
Добавление уникальных метаполей к типу поста
Следующий шаг — добавить уникальные поля. В примере добавим два поля: «Год разработки» и «Ссылка на проект».
Создание метабокса с полями
Для отображения полей на экране редактирования используем метабоксы. Ниже пример добавления собственного метабокса:
function wpcodex_add_portfolio_metabox() {
add_meta_box(
'wpcodex_portfolio_details',
'Детали проекта',
'wpcodex_portfolio_metabox_callback',
'wpcodex_portfolio',
'normal',
'default'
);
}
add_action('add_meta_boxes', 'wpcodex_add_portfolio_metabox');
function wpcodex_portfolio_metabox_callback($post) {
wp_nonce_field('wpcodex_save_portfolio_metabox', 'wpcodex_portfolio_nonce');
$year = get_post_meta($post->ID, '_wpcodex_portfolio_year', true);
$url = get_post_meta($post->ID, '_wpcodex_portfolio_url', true);
echo '<p><label for="wpcodex_portfolio_year">Год разработки:</label><br/>';
echo '<input type="number" id="wpcodex_portfolio_year" name="wpcodex_portfolio_year" value="'.esc_attr($year).'" style="width:100px;" /></p>';
echo '<p><label for="wpcodex_portfolio_url">Ссылка на проект:</label><br/>';
echo '<input type="url" id="wpcodex_portfolio_url" name="wpcodex_portfolio_url" value="'.esc_attr($url).'" style="width:100%;" /></p>';
}Здесь мы добавили два поля с сохранением nonce для безопасности. Далее осталось обработать сохранение этих данных.
Сохранение данных метаполей
Для сохранения значений используем хук save_post:
function wpcodex_save_portfolio_metabox_data($post_id) {
if (!isset($_POST['wpcodex_portfolio_nonce']) || !wp_verify_nonce($_POST['wpcodex_portfolio_nonce'], 'wpcodex_save_portfolio_metabox')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
if (isset($_POST['post_type']) && 'wpcodex_portfolio' === $_POST['post_type']) {
if (!current_user_can('edit_post', $post_id)) {
return;
}
}
if (isset($_POST['wpcodex_portfolio_year'])) {
$year = intval($_POST['wpcodex_portfolio_year']);
update_post_meta($post_id, '_wpcodex_portfolio_year', $year);
}
if (isset($_POST['wpcodex_portfolio_url'])) {
$url = esc_url_raw($_POST['wpcodex_portfolio_url']);
update_post_meta($post_id, '_wpcodex_portfolio_url', $url);
}
}
add_action('save_post', 'wpcodex_save_portfolio_metabox_data');Теперь при сохранении записи метаполя будут надёжно сохраняться в базе данных.
Вывод данных уникальных полей на сайте
Чтобы вывести уникальные поля на фронтенде, достаточно использовать функцию get_post_meta(). Например, в шаблоне single-wpcodex_portfolio.php:
if (have_posts()) {
while (have_posts()) {
the_post();
$year = get_post_meta(get_the_ID(), '_wpcodex_portfolio_year', true);
$url = get_post_meta(get_the_ID(), '_wpcodex_portfolio_url', true);
?>
<h1><?php the_title(); ?></h1>
<div><?php the_content(); ?></div>
<p><strong>Год разработки:</strong> <?php echo esc_html($year); ?></p>
<p><strong>Ссылка на проект:</strong> <a href="<?php echo esc_url($url); ?>" target="_blank" rel="noopener"><?php echo esc_html($url); ?></a></p>
<?php
}
}Так вы легко выведете дополнительные данные вместе с основным содержимым.
Дополнительные советы и полезные плагины
Если не хотите писать код вручную, можно использовать плагин Clearfy Pro, который позволяет создавать и управлять CPT и метаполями через удобный интерфейс, а также оптимизировать сайт.
Ещё один вариант — WPCommunity — если ваше портфолио связано с сообществом или проектами пользователей.
Для расширенного управления метаполями подойдут WPRemark или Expert Review.
Итог: создание собственного типа поста с уникальными полями
Создание собственного типа поста с уникальными метаполями — практичное решение для структурирования контента в WordPress. Это повышает удобство редактирования и позволяет создавать гибкие, точечно настроенные сайты без избыточных плагинов.
Вышеприведённый пример — базовый, но его можно расширять: добавлять валидацию, кастомные контролы, интегрировать с REST API и многое другое. Главное — понимать основные шаги: регистрация CPT, добавление метабокса, сохранение данных и вывод на фронтенд.