Как создать собственный тип поста с уникальными полями в WordPress

В 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, добавление метабокса, сохранение данных и вывод на фронтенд.

Как удалить пустые категории в WordPress
17.01.2026
Как создать автoобновляемый отпуск для постов в WordPress
28.11.2025
WooCommerce: как автоматически обновлять статус заказа после успешной оплаты
03.06.2026
Как удалить автоматические повторяющиеся посты в WordPress
27.03.2026
Как создать подписку на новости WordPress с помощью AJAX
15.12.2025