Как создать собственный тип записи в WordPress: пошаговое руководство

WordPress изначально предоставляет всего несколько типов записей: посты, страницы и вложения. Но часто для конкретных проектов требуется более гибкая структура контента. В таких случаях на помощь приходят собственные типы записей, или Custom Post Types (CPT). Они позволяют создавать отдельные разделы сайта с уникальными настройками и отображением. В этой статье мы подробно разберём, как создать собственный тип записи в WordPress, настроить его и использовать на практике.

Что такое собственный тип записи в WordPress и зачем он нужен

Собственный тип записи — это расширение стандартных возможностей WordPress. Если вам нужно добавить на сайт, например, каталог товаров, портфолио, отзывы или события, можно создать отдельный тип записи с нужными метаданными и шаблонами. Это гораздо удобней, чем хранить всю информацию в обычных постах или страницах, поскольку CPT позволяет:

  • Разделять контент по смыслу и функционалу.
  • Настраивать отдельные метабоксы, поля и таксономии.
  • Создавать уникальные шаблоны для вывода.
  • Упрощать администрирование сайта.

Например, если у вас сайт с каталогом автомобилей, можно создать тип записи «Автомобиль» с полями для марки, модели, года выпуска, цены и т.д.

Как зарегистрировать собственный тип записи в WordPress (функция register_post_type)

Для создания CPT используется функция register_post_type. Регистрировать тип записи нужно в хуке init, чтобы он был доступен при инициализации WordPress.

Пример создания типа записи «Автомобиль» с базовыми настройками:

function wpsell_register_post_type_car() {
    $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' => 'car'),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 5,
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt')
    );

    register_post_type('car', $args);
}
add_action('init', 'wpsell_register_post_type_car');

В этом примере создан тип записи «car» с понятными метками и базовыми поддерживаемыми функциями: заголовок, редактор, миниатюра и отрывок. Этот код можно добавить в файл functions.php вашей темы или в свой плагин.

Разбор параметров функции register_post_type

Важнейшие параметры в аргументах $args:

  • public — делает тип записи публичным для вывода на сайте и в админке.
  • rewrite — отвечает за ЧПУ (человеко-понятные URL). В нашем случае slug будет /car/название-записи.
  • supports — указывает, какие стандартные возможности будут доступны (например, миниатюра, комментарии и т.д.).
  • has_archive — включает архивную страницу для типа записей.
  • menu_position — место в меню админки.

Добавление пользовательских полей и метабоксов для типа записи

Сам по себе тип записи — это только контейнер. Чтобы хранить дополнительные данные, например, характеристики автомобиля, нужно добавить пользовательские поля (метаполя). WordPress по умолчанию позволяет использовать произвольные поля, но для удобства лучше создавать собственные метабоксы.

Пример создания метабокса с полями модели, года выпуска и цены:

function wpsell_add_car_metabox() {
    add_meta_box(
        'wpsell_car_details',
        'Детали автомобиля',
        'wpsell_car_metabox_callback',
        'car',
        'normal',
        'high'
    );
}
add_action('add_meta_boxes', 'wpsell_add_car_metabox');

function wpsell_car_metabox_callback($post) {
    wp_nonce_field('wpsell_save_car_details', 'wpsell_car_nonce');

    $model = get_post_meta($post->ID, '_wpsell_car_model', true);
    $year = get_post_meta($post->ID, '_wpsell_car_year', true);
    $price = get_post_meta($post->ID, '_wpsell_car_price', true);

    echo '<p><label for="wpsell_car_model">Модель:</label><br />';
    echo '<input type="text" id="wpsell_car_model" name="wpsell_car_model" value="'.esc_attr($model).'" size="25" /></p>';

    echo '<p><label for="wpsell_car_year">Год выпуска:</label><br />';
    echo '<input type="number" id="wpsell_car_year" name="wpsell_car_year" value="'.esc_attr($year).'" size="4" /></p>';

    echo '<p><label for="wpsell_car_price">Цена (руб):</label><br />';
    echo '<input type="number" id="wpsell_car_price" name="wpsell_car_price" value="'.esc_attr($price).'" size="10" /></p>';
}

function wpsell_save_car_details($post_id) {
    if (!isset($_POST['wpsell_car_nonce']) || !wp_verify_nonce($_POST['wpsell_car_nonce'], 'wpsell_save_car_details')) {
        return;
    }

    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }

    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    if (isset($_POST['wpsell_car_model'])) {
        update_post_meta($post_id, '_wpsell_car_model', sanitize_text_field($_POST['wpsell_car_model']));
    }
    if (isset($_POST['wpsell_car_year'])) {
        update_post_meta($post_id, '_wpsell_car_year', intval($_POST['wpsell_car_year']));
    }
    if (isset($_POST['wpsell_car_price'])) {
        update_post_meta($post_id, '_wpsell_car_price', floatval($_POST['wpsell_car_price']));
    }
}
add_action('save_post', 'wpsell_save_car_details');

Так мы добавили в админке для типа записи «Автомобиль» отдельный блок с полями для ввода основных характеристик. После сохранения данные попадают в метаполя записи.

Вывод собственного типа записи на сайте: примеры шаблонов и запросов WP_Query

Чтобы вывести список автомобилей на фронтенде, можно использовать класс WP_Query. Пример простого запроса и вывода:

$args = array(
    'post_type' => 'car',
    'posts_per_page' => 10,
    'orderby' => 'date',
    'order' => 'DESC'
);

$query = new WP_Query($args);

if ($query->have_posts()) {
    echo '<ul class="wpsell-car-list">';
    while ($query->have_posts()) {
        $query->the_post();
        $model = get_post_meta(get_the_ID(), '_wpsell_car_model', true);
        $year = get_post_meta(get_the_ID(), '_wpsell_car_year', true);
        $price = get_post_meta(get_the_ID(), '_wpsell_car_price', true);

        echo '<li><h2><a href="'.get_permalink().'">'.get_the_title().'</a></h2>';
        echo '<p>Модель: '.esc_html($model).'</p>';
        echo '<p>Год выпуска: '.esc_html($year).'</p>';
        echo '<p>Цена: '.number_format($price, 0, '', ' ').' руб.</p></li>';
    }
    echo '</ul>';
    wp_reset_postdata();
} else {
    echo '<p>Автомобили не найдены.</p>';
}

Этот код можно разместить в любом шаблоне темы, например, в custom-page.php, или вывести через шорткод.

Создание шорткода для вывода списка автомобилей

Чтобы легко вставить список автомобилей в любой пост или страницу, создадим шорткод:

function wpsell_car_list_shortcode($atts) {
    $atts = shortcode_atts(array(
        'count' => 5
    ), $atts, 'car_list');

    $args = array(
        'post_type' => 'car',
        'posts_per_page' => intval($atts['count']),
        'orderby' => 'date',
        'order' => 'DESC'
    );

    $query = new WP_Query($args);
    $output = '';

    if ($query->have_posts()) {
        $output .= '<ul class="wpsell-car-list">';
        while ($query->have_posts()) {
            $query->the_post();
            $model = get_post_meta(get_the_ID(), '_wpsell_car_model', true);
            $year = get_post_meta(get_the_ID(), '_wpsell_car_year', true);
            $price = get_post_meta(get_the_ID(), '_wpsell_car_price', true);

            $output .= '<li><h2><a href="'.get_permalink().'">'.get_the_title().'</a></h2>';
            $output .= '<p>Модель: '.esc_html($model).'</p>';
            $output .= '<p>Год выпуска: '.esc_html($year).'</p>';
            $output .= '<p>Цена: '.number_format($price, 0, '', ' ').' руб.</p></li>';
        }
        $output .= '</ul>';
        wp_reset_postdata();
    } else {
        $output .= '<p>Автомобили не найдены.</p>';
    }

    return $output;
}
add_shortcode('car_list', 'wpsell_car_list_shortcode');

Теперь достаточно вставить в контент [car_list count="10"], и на странице появится список из 10 последних автомобилей.

Полезные плагины для работы с собственными типами записей

Хотя создание CPT вручную — классика, есть плагины, которые упрощают и ускоряют задачу:

  • Custom Post Type UI — самый популярный плагин для создания и управления CPT и таксономиями через удобный интерфейс. Позволяет быстро создавать типы записей без кода.
  • Advanced Custom Fields (ACF) — мощный инструмент для создания кастомных полей и метабоксов с множеством типов данных, условий и интерфейсов. Идеально сочетается с CPT.
  • Pods — комплексный фреймворк для создания и управления CPT, таксономиями и кастомными полями с расширенными возможностями.

Использование этих плагинов особенно полезно, если вы не хотите писать код вручную или нужно быстро прототипировать сложные структуры.

Советы и лучшие практики по созданию и использованию собственных типов записей

При создании CPT важно учитывать следующие моменты:

  • Выбирайте уникальный и понятный slug — это поможет избежать конфликтов с другими типами записей и плагинами.
  • Используйте префиксы в названиях функций и метаполей (как в нашем примере с wpsell_), чтобы избежать коллизий.
  • Продумывайте, какие поля действительно нужны, чтобы не перегружать админку.
  • Создавайте отдельные шаблоны для отображения CPT (например, single-car.php, archive-car.php) для лучшей кастомизации вывода.
  • Используйте возможности таксономий (категории, метки или свои), чтобы структурировать записи.

В итоге собственные типы записей дают вам гибкий инструмент для расширения функционала WordPress и создания удобных и логичных сайтов.

WooCommerce: автоматическое изменение цен товаров по акциям с помощью кода
01.07.2026
Как добавить атрибуты для оптимизации изображений в WordPress
27.01.2026
Как добавить вывод стоимости отсутствующих товаров в корзине WooCommerce
01.05.2026
Как сделать точное управление ролями в WordPress с примерами
22.12.2025
Как автоматизировать обновление плагинов WordPress без рисков
15.01.2026

Совсем скоро здесь заработает сайт о вордпресс. И будет он связан с продажами, магазинами или чем-то таким.