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

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

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

Custom Post Types — это способ расширить стандартный функционал WordPress, добавив новые типы контента, отличающиеся по смыслу и функционалу от обычных записей и страниц. К примеру, если вы делаете сайт агентства недвижимости, логично создать отдельный CPT для объектов недвижимости, а не смешивать всё в обычных записях.

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

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

Без CPT часто приходится создавать сложные таксономии или использовать метаполя, что усложняет поддержку сайта.

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

Для создания CPT в WordPress используется функция register_post_type(). Эту функцию нужно вызывать в хуке init. Рассмотрим пример создания типа записей «Отзывы».

function wpmark_register_post_type_reviews() {
    $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' => 'В корзине отзывы не найдены',
        'menu_name'          => 'Отзывы'
    );

    $args = array(
        'labels'             => $labels,
        'public'             => true,
        'has_archive'        => true,
        'rewrite'            => array('slug' => 'reviews'),
        'supports'           => array('title', 'editor', 'author', 'thumbnail', 'comments'),
        'show_in_rest'       => true, // поддержка Gutenberg
        'menu_position'      => 5,
        'menu_icon'          => 'dashicons-format-chat'
    );

    register_post_type('wpmark_review', $args);
}
add_action('init', 'wpmark_register_post_type_reviews');

После добавления этого кода в файл functions.php вашей темы или в собственный плагин, в админке появится новый раздел «Отзывы» с полноценным функционалом.

Расширение функционала: добавляем пользовательские таксономии и метаполя

Для удобной категоризации и структурирования CPT можно добавить собственные таксономии — категории и метки, аналогичные стандартным для постов. Также часто требуется добавить метаполя для хранения дополнительной информации (например, рейтинг отзыва или дату события).

Создание таксономии «Тип отзыва»

function wpmark_register_taxonomy_review_type() {
    $labels = array(
        'name'              => 'Типы отзывов',
        'singular_name'     => 'Тип отзыва',
        'search_items'      => 'Искать типы отзывов',
        'all_items'         => 'Все типы',
        'edit_item'         => 'Редактировать тип',
        'update_item'       => 'Обновить тип',
        'add_new_item'      => 'Добавить новый тип',
        'new_item_name'     => 'Название нового типа',
        'menu_name'         => 'Типы отзывов'
    );

    $args = array(
        'labels'            => $labels,
        'hierarchical'      => true,
        'show_in_rest'      => true
    );

    register_taxonomy('wpmark_review_type', 'wpmark_review', $args);
}
add_action('init', 'wpmark_register_taxonomy_review_type');

Теперь при добавлении или редактировании отзывов можно выбирать тип отзыва, что значительно улучшает навигацию.

Добавление метаполя «Рейтинг» с помощью Meta Box API

Для простого добавления метаполей лучше использовать встроенные хуки WordPress. Вот пример добавления поля «Рейтинг» (число от 1 до 5):

function wpmark_add_meta_boxes() {
    add_meta_box(
        'wpmark_review_rating',
        'Рейтинг отзыва',
        'wpmark_render_rating_meta_box',
        'wpmark_review',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wpmark_add_meta_boxes');

function wpmark_render_rating_meta_box($post) {
    $value = get_post_meta($post->ID, '_wpmark_review_rating', true);
    echo '<label for="wpmark_review_rating">Рейтинг (1-5):</label><br>';
    echo '<input type="number" id="wpmark_review_rating" name="wpmark_review_rating" value="' . esc_attr($value) . '" min="1" max="5" />';
}

function wpmark_save_postdata($post_id) {
    if (array_key_exists('wpmark_review_rating', $_POST)) {
        update_post_meta(
            $post_id,
            '_wpmark_review_rating',
            intval($_POST['wpmark_review_rating'])
        );
    }
}
add_action('save_post', 'wpmark_save_postdata');

Этот код добавит поле ввода рейтинга в сайдбар редактора отзывов и сохранит значение в метаданных.

Вывод собственных пост типах на фронтенд: создание шаблонов и WP_Query

Для отображения CPT на сайте нужно создать шаблоны и запросы, которые будут извлекать и выводить нужные записи.

Создание шаблона архива CPT

WordPress ищет файл archive-{post_type}.php для вывода архива CPT. Для нашего типа wpmark_review можно создать файл archive-wpmark_review.php в папке темы с примерным содержимым:

<?php get_header(); ?>

<h1>Отзывы</h1>

<?php if ( have_posts() ) : ?>
    <ul>
    <?php while ( have_posts() ) : the_post(); ?>
        <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a> - Рейтинг: <?php echo get_post_meta(get_the_ID(), '_wpmark_review_rating', true); ?></li>
    <?php endwhile; ?>
    </ul>
<?php else : ?>
    <p>Отзывы не найдены.</p>
<?php endif; ?>

<?php get_footer(); ?>

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

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

$args = array(
    'post_type'      => 'wpmark_review',
    'posts_per_page' => 5,
    'meta_key'       => '_wpmark_review_rating',
    'meta_value'     => 5
);

$reviews_query = new WP_Query($args);

if ($reviews_query->have_posts()) {
    echo '<ul>';
    while ($reviews_query->have_posts()) {
        $reviews_query->the_post();
        echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
    }
    echo '</ul>';
    wp_reset_postdata();
} else {
    echo '<p>Отзывы с рейтингом 5 не найдены.</p>';
}

Рекомендации по оптимизации и безопасности при работе с CPT

При создании собственных пост типах важно помнить про безопасность и производительность. Вот несколько советов:

  • Всегда используйте префиксы в именах функций и метаполей, чтобы избежать конфликтов (например, wpmark_register_post_type_reviews).
  • Проверяйте права пользователя перед сохранением метаданных (например, через current_user_can).
  • Кэшируйте запросы и используйте пагинацию, чтобы не перегружать сервер.
  • Используйте show_in_rest => true, чтобы обеспечить совместимость с редактором Gutenberg.
  • При необходимости создавайте отдельные шаблоны для CPT, чтобы улучшить пользовательский опыт.

Следуя этим рекомендациям, вы создадите мощный и удобный инструмент для управления контентом на вашем сайте.

Как использовать хуки для автоматизации в WordPress
17.12.2025
Как создать автоматический импорт изображений в WordPress с помощью кода
30.03.2026
Как создать автоматический резервный копии в WordPress без плагинов
27.02.2026
Как удалить и заблокировать спам комментарии в WordPress
11.01.2026
Как автоматизировать создание резервных копий WordPress без плагинов
18.01.2026