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

В WordPress стандартно предусмотрены несколько типов записей: записи (posts), страницы (pages), вложения и некоторые другие. Однако зачастую для организации контента требуется создавать собственные типы записей — custom post types (CPT). Они позволяют расширить функциональность сайта, структурировать данные и сделать админку удобнее для пользователя.

Что такое custom post types и зачем они нужны в WordPress

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

Основные преимущества CPT:

  • Разделение контента по типам.
  • Возможность задать уникальные поля и таксономии.
  • Улучшение UX в админке — свои меню и фильтры.
  • Гибкость для тем и плагинов.

Давайте разберемся, как создать собственный тип записи на примере сайта с заказами — например, "Заказы" для сайта wporders.ru.

Регистрация custom post type: базовый пример кода

Для регистрации собственного типа записей используется функция register_post_type(). Лучше это делать через хук init, чтобы регистрация происходила при инициализации WordPress.

Вот пример функции, которую можно добавить в файл functions.php вашей темы или в плагин:

function wporders_register_post_type_orders() {
    $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'             => false, // делаем тип приватным, не отображается на сайте
        'publicly_queryable' => false,
        'show_ui'            => true,  // показывать в админке
        'show_in_menu'       => true,  // показывать в меню админки
        'query_var'          => true,
        'rewrite'            => array('slug' => 'orders'),
        'capability_type'    => 'post',
        'has_archive'        => false,
        'hierarchical'       => false,
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-cart',
        'supports'           => array('title', 'editor', 'custom-fields')
    );

    register_post_type('wporders_order', $args);
}
add_action('init', 'wporders_register_post_type_orders');

Этот код создаст в админке WordPress раздел "Заказы" с возможностью добавлять новые записи этого типа. Обратите внимание, что мы задаём public = false, так как заказы обычно не должны быть видны на публичной части сайта.

Добавление мета-полей для custom post type

Чтобы хранить дополнительные данные заказа, например, номер клиента, сумму, статус, нужно добавить мета-поля. Для этого можно использовать стандартный интерфейс WordPress — мета боксы (meta boxes) или плагины, например Advanced Custom Fields (ACF). Но для полноты примера рассмотрим, как добавить метабокс программно.

Пример добавления метабокса:

function wporders_add_meta_boxes() {
    add_meta_box(
        'wporders_order_details',
        'Детали заказа',
        'wporders_order_details_callback',
        'wporders_order',
        'normal',
        'high'
    );
}
add_action('add_meta_boxes', 'wporders_add_meta_boxes');

function wporders_order_details_callback($post) {
    wp_nonce_field('wporders_save_order_details', 'wporders_order_nonce');

    $customer_name = get_post_meta($post->ID, '_wporders_customer_name', true);
    $order_amount = get_post_meta($post->ID, '_wporders_order_amount', true);
    ?>
    <p><label for="wporders_customer_name">Имя клиента:</label><br />
    <input type="text" id="wporders_customer_name" name="wporders_customer_name" value="<?php echo esc_attr($customer_name); ?>" size="25" /></p>

    <p><label for="wporders_order_amount">Сумма заказа:</label><br />
    <input type="number" id="wporders_order_amount" name="wporders_order_amount" value="<?php echo esc_attr($order_amount); ?>" step="0.01" /></p>
    <?php
}

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

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

    if (isset($_POST['wporders_customer_name'])) {
        update_post_meta($post_id, '_wporders_customer_name', sanitize_text_field($_POST['wporders_customer_name']));
    }

    if (isset($_POST['wporders_order_amount'])) {
        update_post_meta($post_id, '_wporders_order_amount', floatval($_POST['wporders_order_amount']));
    }
}
add_action('save_post', 'wporders_save_order_details');

Этот код добавит в редактор заказа два поля: имя клиента и сумму заказа. Данные сохраняются в мета-полях при сохранении записи.

Фильтрация и вывод custom post type на сайте

Хотя тип заказа мы сделали приватным, иногда нужно вывести список заказов в админке или даже на публичной части сайта (например, для пользователя). Для выборки по типу записи можно использовать WP_Query:

$args = array(
    'post_type' => 'wporders_order',
    'posts_per_page' => 10,
    'meta_query' => array(
        array(
            'key' => '_wporders_customer_name',
            'value' => 'Иван',
            'compare' => 'LIKE'
        )
    )
);
$query = new WP_Query($args);

if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        echo '<h3>' . get_the_title() . '</h3>';
        echo '<p>Сумма: ' . get_post_meta(get_the_ID(), '_wporders_order_amount', true) . '</p>';
    }
    wp_reset_postdata();
} else {
    echo '<p>Заказы не найдены.</p>';
}

Таким образом вы можете выводить заказы, фильтруя их по нужным параметрам.

Полезные плагины для работы с custom post types

Если вы не хотите писать код вручную, можно использовать плагины:

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

Для сайта wporders.ru можно комбинировать ручной код и плагины, чтобы получить гибкую и удобную систему управления заказами.

Советы и лучшие практики при работе с custom post types

Работая с CPT в WordPress, учитывайте следующие моменты:

  • Используйте уникальные префиксы для названий функций и мета-ключей, чтобы избежать конфликтов (например, wporders_).
  • Если тип записи не предназначен для публичного просмотра, ставьте public = false и отключайте архивы.
  • Добавляйте поддержку нужных функций через параметр supports — например, 'title', 'editor', 'custom-fields'.
  • При добавлении мета-полей обязательно используйте nonce для защиты данных.
  • Для сложных проектов лучше использовать кастомные таксономии для категоризации CPT.

Следуя этим рекомендациям, вы создадите надежный и удобный функционал для работы с любым контентом в WordPress.

Как сделать автоматическое сохранение заказов в WordPress без WooCommerce
23.01.2026
Автоматизация управления заказами в WooCommerce с помощью hooks и фильтров
18.11.2025
Создание автоматических уведомлений о статусах заказов WooCommerce
24.12.2025
Как создать автоматический отчет по заказам WooCommerce с помощью PHP
05.02.2026
Автопродолжение заказов в WooCommerce: пошаговое руководство
07.11.2025