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

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

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

Уникальные типы записей — это расширение стандартной модели контента WordPress. Они позволяют создавать отдельные категории контента, которые не смешиваются с обычными постами или страницами. Например, если у вас сайт с каталогом книг, вы можете создать тип записи "Книги", чтобы удобно управлять таким контентом.

Преимущества использования CPT:

  • Четкая организация и разделение контента;
  • Удобство для администраторов и редакторов;
  • Возможность создавать отдельные шаблоны отображения для разных типов;
  • Улучшение SEO за счет семантической структуры.

На wp-kit.ru мы часто рекомендуем использовать уникальные типы записей для сложных проектов, чтобы избежать путаницы и облегчить управление сайтом.

Регистрация уникального типа записи с помощью функции wp_kit_register_custom_post_type()

Для добавления собственного типа записи в WordPress используется функция register_post_type(). Мы создадим на базе её простой обертку wp_kit_register_custom_post_type(), чтобы упрощать повторное использование кода и стандартизировать регистрацию CPT.

function wp_kit_register_custom_post_type($slug, $singular_name, $plural_name, $args = array()) {
    $labels = array(
        'name'                  => $plural_name,
        'singular_name'         => $singular_name,
        'menu_name'             => $plural_name,
        'name_admin_bar'        => $singular_name,
        'add_new'               => 'Добавить новый',
        'add_new_item'          => 'Добавить новый ' . $singular_name,
        'new_item'              => 'Новый ' . $singular_name,
        'edit_item'             => 'Редактировать ' . $singular_name,
        'view_item'             => 'Просмотреть ' . $singular_name,
        'all_items'             => 'Все ' . $plural_name,
        'search_items'          => 'Поиск ' . $plural_name,
        'parent_item_colon'     => 'Родительский ' . $plural_name,
        'not_found'             => 'Не найдено',
        'not_found_in_trash'    => 'Не найдено в корзине',
    );

    $default_args = array(
        'labels'             => $labels,
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => array('slug' => $slug),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 20,
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields'),
    );

    $args = array_merge($default_args, $args);

    register_post_type($slug, $args);
}

add_action('init', function() {
    wp_kit_register_custom_post_type('book', 'Книга', 'Книги');
});

В этом примере мы создали тип записи "Книга" с базовыми параметрами. Функция позволяет легко добавлять новые CPT, переопределяя или дополняя аргументы.

Пояснения по аргументам регистрации

Обратите внимание на ключевые параметры:

  • public — определяет, доступен ли тип на фронтенде;
  • rewrite — настраивает ЧПУ для типа записи;
  • supports — какие возможности редактора поддерживаются (заголовок, редактор, миниатюры и т.п.);
  • has_archive — включить ли архивную страницу для типа записи.

Настройка этих параметров позволяет максимально подстроить CPT под ваши задачи.

Добавление мета-полей к уникальным типам записей

Для расширенной структуры данных часто требуется добавить собственные мета-поля к CPT. Рассмотрим пример добавления мета-поля "Год издания" для типа "Книга".

function wp_kit_add_book_year_meta_box() {
    add_meta_box(
        'wp_kit_book_year',
        'Год издания',
        'wp_kit_book_year_meta_box_callback',
        'book',
        'side'
    );
}

function wp_kit_book_year_meta_box_callback($post) {
    wp_nonce_field('wp_kit_save_book_year', 'wp_kit_book_year_nonce');
    $value = get_post_meta($post->ID, '_wp_kit_book_year', true);
    echo '<label for="wp_kit_book_year_field">Введите год издания:</label> ';
    echo '<input type="number" id="wp_kit_book_year_field" name="wp_kit_book_year_field" value="' . esc_attr($value) . '" min="1500" max="2100" style="width:100%;" />';
}

function wp_kit_save_book_year_meta_box_data($post_id) {
    if (!isset($_POST['wp_kit_book_year_nonce'])) {
        return;
    }
    if (!wp_verify_nonce($_POST['wp_kit_book_year_nonce'], 'wp_kit_save_book_year')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    if (!isset($_POST['wp_kit_book_year_field'])) {
        return;
    }

    $year = intval($_POST['wp_kit_book_year_field']);
    if ($year < 1500 || $year > 2100) {
        // Некорректный год, игнорируем
        return;
    }

    update_post_meta($post_id, '_wp_kit_book_year', $year);
}

add_action('add_meta_boxes', 'wp_kit_add_book_year_meta_box');
add_action('save_post', 'wp_kit_save_book_year_meta_box_data');

Этот код добавляет удобное поле в админке для ввода года издания книги, сохраняет данные корректно и защищает их от подделок с помощью nonce.

Вывод уникальных типов записей на фронтенде с кастомным шаблоном

После создания CPT и добавления мета-полей важно правильно вывести контент на сайте. Рассмотрим пример вывода списка книг с их годом издания.

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

$books = new WP_Query($args);

if ($books->have_posts()) :
    echo '<ul class="wp-kit-book-list">';
    while ($books->have_posts()) : $books->the_post();
        $year = get_post_meta(get_the_ID(), '_wp_kit_book_year', true);
        echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a>';
        if ($year) {
            echo ' (' . esc_html($year) . ')';
        }
        echo '</li>';
    endwhile;
    echo '</ul>';
    wp_reset_postdata();
else :
    echo '<p>Книги не найдены.</p>';
endif;

Такой код можно вставить в шаблон темы или в кастомный плагин. Он выведет список с названием книги и годом издания, если он указан.

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

Хотя регистрация CPT кодом дает максимальный контроль, иногда удобнее использовать плагины для визуального создания и управления. Вот несколько проверенных вариантов:

  • Custom Post Type UI — популярный плагин для создания и управления CPT и таксономиями без кода;
  • Advanced Custom Fields (ACF) — мощный инструмент для добавления мета-полей и удобного управления ими;
  • Clearfy Pro — комплексный плагин оптимизации и настройки, поддерживает работу с CPT.

Используйте эти плагины, если хотите ускорить разработку или добавить расширенный функционал без глубокого программирования.

Подводные камни и рекомендации при работе с CPT

Несколько важных моментов, которые стоит учитывать:

  • Всегда используйте уникальные префиксы в названиях функций и мета-полей, чтобы избежать конфликтов. В нашем примере это префикс wp_kit_.
  • После регистрации CPT проверьте работу ЧПУ — иногда необходимо обновить настройки постоянных ссылок (Настройки > Постоянные ссылки) для корректной работы URL.
  • Для сложных проектов продумывайте архитектуру CPT и таксономий заранее, чтобы избежать дублирования и избыточности.
  • Если планируете создавать много кастомных типов, рассмотрите использование классов и более структурированного подхода к коду.

Таким образом, уникальные типы записей — мощный инструмент для расширения функционала WordPress. Они позволяют создавать удобные, структурированные и масштабируемые решения для любого сайта.

Как исправить ошибку недоступности WooCommerce AJAX корзины после обновления
20.06.2026
Не работает корзина WooCommerce после обновления: как быстро исправить
23.06.2026
Как избежать проблем с кешированием в WooCommerce при использовании Varnish
06.05.2026
Как изменить URL адреса типа permalink в WordPress без потери трафика
13.12.2025
Как автоматически удалять неиспользуемые медиа-файлы в WordPress
23.05.2026