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

В WordPress нестандартные типы постов (custom post types, CPT) позволяют создавать уникальные структуры данных, выходящие за рамки обычных записей и страниц. При этом аксессуары (custom fields, метаполя) дают возможность расширять эти типы постов дополнительными свойствами, что очень важно для создания удобного и функционального сайта. В этой статье мы подробно рассмотрим, как создать CPT с аксессуарами, приводя конкретные примеры кода и рекомендации по использованию плагинов.

Что такое нестандартные типы постов и зачем они нужны

Стандартный WordPress предлагает два основных типа контента — «Записи» и «Страницы». Однако для многих проектов этого недостаточно. Например, если вы хотите создать сайт с каталогом товаров, портфолио, отзывами или событиями, вам нужны отдельные типы постов с уникальными полями и логикой.

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

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

Пример создания простого CPT «Книги»

function wplancer_register_post_type_books() {
    $labels = array(
        'name' => 'Книги',
        'singular_name' => 'Книга',
        'add_new' => 'Добавить книгу',
        'add_new_item' => 'Добавить новую книгу',
        'edit_item' => 'Редактировать книгу',
        'new_item' => 'Новая книга',
        'all_items' => 'Все книги',
        'view_item' => 'Просмотреть книгу',
        'search_items' => 'Поиск книг',
        'not_found' => 'Книг не найдено',
        'not_found_in_trash' => 'Книг нет в корзине',
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'supports' => array('title', 'editor', 'thumbnail'),
        'menu_position' => 5,
        'menu_icon' => 'dashicons-book-alt',
    );

    register_post_type('wplancer_book', $args);
}
add_action('init', 'wplancer_register_post_type_books');

Этот код добавит в админку WordPress новый раздел «Книги» с базовыми функциями.

Как добавить аксессуары (метаполя) к кастомным типам постов

После создания CPT возникает задача добавить к ним дополнительные поля — «аксессуары». Это могут быть ISBN книги, автор, год издания и другие данные.

Есть два основных способа: с помощью плагинов и программно.

Использование плагина Advanced Custom Fields (ACF)

ACF — это мощный и удобный плагин для создания любых метаполей. Его плюс в визуальном редакторе и большом наборе типов полей.

Для CPT «Книги» можно создать группу полей с именами «Автор», «Год издания», «ISBN» и привязать их к типу поста.

Для вывода полей в шаблоне используйте функцию get_field():

<?php
$author = get_field('author');
echo '<p>Автор: ' . esc_html($author) . '</p>';
?>

Подробнее про ACF и его возможности читайте на https://wpshop.ru/plugins/advanced-custom-fields.

Программное добавление метабоксов и сохранение данных

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

Создание метабокса

function wplancer_add_meta_box_book_details() {
    add_meta_box(
        'wplancer_book_details',
        'Детали книги',
        'wplancer_book_details_callback',
        'wplancer_book',
        'normal',
        'high'
    );
}
add_action('add_meta_boxes', 'wplancer_add_meta_box_book_details');

function wplancer_book_details_callback($post) {
    wp_nonce_field('wplancer_save_book_details', 'wplancer_book_nonce');

    $author = get_post_meta($post->ID, '_wplancer_book_author', true);
    $year = get_post_meta($post->ID, '_wplancer_book_year', true);
    $isbn = get_post_meta($post->ID, '_wplancer_book_isbn', true);

    echo '<p><label>Автор:</label> ';
    echo '<input type="text" name="wplancer_book_author" value="' . esc_attr($author) . '" /></p>';

    echo '<p><label>Год издания:</label> ';
    echo '<input type="number" name="wplancer_book_year" value="' . esc_attr($year) . '" /></p>';

    echo '<p><label>ISBN:</label> ';
    echo '<input type="text" name="wplancer_book_isbn" value="' . esc_attr($isbn) . '" /></p>';
}

Сохранение данных метаполей

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

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

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

    if (isset($_POST['wplancer_book_author'])) {
        update_post_meta($post_id, '_wplancer_book_author', sanitize_text_field($_POST['wplancer_book_author']));
    }
    if (isset($_POST['wplancer_book_year'])) {
        update_post_meta($post_id, '_wplancer_book_year', intval($_POST['wplancer_book_year']));
    }
    if (isset($_POST['wplancer_book_isbn'])) {
        update_post_meta($post_id, '_wplancer_book_isbn', sanitize_text_field($_POST['wplancer_book_isbn']));
    }
}
add_action('save_post', 'wplancer_save_book_details');

Такой подход даёт полный контроль над функционалом и не требует сторонних плагинов.

Вывод нестандартных типов постов с аксессуарами на фронтенде

После создания CPT и добавления аксессуаров нужно корректно вывести данные на сайте. Для этого создают шаблоны single-wplancer_book.php и archive-wplancer_book.php в теме.

Пример вывода данных в шаблоне single-wplancer_book.php

<?php get_header(); ?>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
    <h1><?php the_title(); ?></h1>

    <div class="book-details">
        <p>Автор: <?php echo esc_html(get_post_meta(get_the_ID(), '_wplancer_book_author', true)); ?></p>
        <p>Год издания: <?php echo esc_html(get_post_meta(get_the_ID(), '_wplancer_book_year', true)); ?></p>
        <p>ISBN: <?php echo esc_html(get_post_meta(get_the_ID(), '_wplancer_book_isbn', true)); ?></p>
    </div>

    <div class="content"><?php the_content(); ?></div>
<?php endwhile; endif; ?>

<?php get_footer(); ?>

Использование WP_Query для вывода архива с фильтрацией

Для создания фильтра по автору или году издания можно использовать мета-запросы WP_Query.

$args = array(
    'post_type' => 'wplancer_book',
    'meta_query' => array(
        array(
            'key' => '_wplancer_book_author',
            'value' => 'Иван Иванов',
            'compare' => 'LIKE'
        ),
    ),
);

$query = new WP_Query($args);

if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        echo '<h2>' . get_the_title() . '</h2>';
        // Другой вывод
    }
} else {
    echo 'Книги не найдены';
}
wp_reset_postdata();

Рекомендации по производительности и совместимости

При добавлении большого количества нестандартных типов постов и аксессуаров важно следить за производительностью сайта. Метаполя хранятся в таблице wp_postmeta, и тяжелые запросы по ней могут замедлить сайт.

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

Плагин Clearfy Pro может помочь с оптимизацией и отключением ненужных функций в WordPress, что положительно скажется на быстродействии.

Заключение

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

Подробнее про полезные инструменты и плагины для работы с кастомными типами постов и оптимизацией читайте на wpshop.ru.

Автоматическое удаление товара из корзины WooCommerce при установке количества в 0 через AJAX
25.05.2026
Как автоматизировать управление пользовательскими ролями в WordPress
15.04.2026
Как создать многоуровневую навигацию в WordPress: подробное руководство
10.01.2026
Как создать выбор позиции для товара в WooCommerce с пользовательским полем
10.03.2026
Как создать комплексный фильтрованный список на WordPress
22.12.2025