Как создать собственный тип записи (Custom Post Type) в WordPress: подробное руководство

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

Что такое Custom Post Type и зачем он нужен

Custom Post Type — это пользовательский тип контента, который вы регистрируете в WordPress для хранения специфичных данных. CPT помогает разграничить контент, улучшить навигацию и сделать админку более удобной. Вместо того чтобы хранить все в обычных записях, вы можете создать, например, тип «Отзывы» или «Мероприятия» с собственными полями и таксономиями.

Ключевые преимущества использования CPT:

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

Как зарегистрировать Custom Post Type в WordPress

Для регистрации CPT используется функция register_post_type(). Регистрировать тип записи лучше в хуке init. Ниже пример регистрации CPT «Отзывы» с базовыми настройками:

add_action('init', 'wpvip_register_custom_post_type_reviews');
function wpvip_register_custom_post_type_reviews() {
    $labels = array(
        'name'               => 'Отзывы',
        'singular_name'      => 'Отзыв',
        'menu_name'          => 'Отзывы',
        'name_admin_bar'     => 'Отзыв',
        'add_new'            => 'Добавить отзыв',
        'add_new_item'       => 'Добавить новый отзыв',
        'edit_item'          => 'Редактировать отзыв',
        'new_item'           => 'Новый отзыв',
        'view_item'          => 'Просмотреть отзыв',
        'search_items'       => 'Искать отзывы',
        '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' => 'reviews'),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 5,
        'supports'           => array('title', 'editor', 'author', 'thumbnail', 'comments'),
    );

    register_post_type('wpvip_reviews', $args);
}

Этот код добавит новый раздел в админке с названием «Отзывы», где можно создавать и редактировать записи этого типа.

Настройка поддержки метаданных и таксономий

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

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

Регистрация таксономии «Категории отзывов» для типа отзывов:

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

    $args = array(
        'hierarchical'      => true,
        'labels'            => $labels,
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => array('slug' => 'review-category'),
    );

    register_taxonomy('wpvip_review_category', array('wpvip_reviews'), $args);
}

Добавление пользовательских полей (мета-полей) с помощью плагина Advanced Custom Fields

Плагин Advanced Custom Fields (ACF) позволяет легко добавить мета-поля без кодинга. Для рейтинга можно создать поле "Оценка" типа "Число" с ограничением от 1 до 5.

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

add_action('add_meta_boxes', 'wpvip_add_reviews_meta_box');
function wpvip_add_reviews_meta_box() {
    add_meta_box('wpvip_reviews_rating', 'Рейтинг отзыва', 'wpvip_reviews_rating_meta_box_callback', 'wpvip_reviews', 'side', 'default');
}

function wpvip_reviews_rating_meta_box_callback($post) {
    wp_nonce_field('wpvip_save_reviews_rating', 'wpvip_reviews_rating_nonce');
    $value = get_post_meta($post->ID, '_wpvip_reviews_rating', true);
    echo '<label for="wpvip_reviews_rating_field">Оценка (1-5):</label> ';
    echo '<input type="number" id="wpvip_reviews_rating_field" name="wpvip_reviews_rating_field" value="' . esc_attr($value) . '" min="1" max="5" />';
}

add_action('save_post', 'wpvip_save_reviews_rating_meta_box_data');
function wpvip_save_reviews_rating_meta_box_data($post_id) {
    if (!isset($_POST['wpvip_reviews_rating_nonce'])) {
        return;
    }
    if (!wp_verify_nonce($_POST['wpvip_reviews_rating_nonce'], 'wpvip_save_reviews_rating')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }
    if (!isset($_POST['wpvip_reviews_rating_field'])) {
        return;
    }
    $rating = intval($_POST['wpvip_reviews_rating_field']);
    if ($rating < 1) $rating = 1;
    if ($rating > 5) $rating = 5;
    update_post_meta($post_id, '_wpvip_reviews_rating', $rating);
}

Вывод Custom Post Type на сайте: примеры кода

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

$args = array(
    'post_type' => 'wpvip_reviews',
    'posts_per_page' => 10,
    'orderby' => 'date',
    'order' => 'DESC',
);
$reviews_query = new WP_Query($args);

if ($reviews_query->have_posts()) {
    echo '<ul class="wpvip-reviews-list">';
    while ($reviews_query->have_posts()) {
        $reviews_query->the_post();
        $rating = get_post_meta(get_the_ID(), '_wpvip_reviews_rating', true);
        echo '<li><h3>' . get_the_title() . '</h3>';
        echo '<div class="review-rating">Рейтинг: ' . esc_html($rating) . '/5</div>';
        echo '<div class="review-content">' . get_the_content() . '</div></li>';
    }
    echo '</ul>';
    wp_reset_postdata();
} else {
    echo '<p>Отзывы не найдены.</p>';
}

Использование шорткода для вывода отзывов

Чтобы удобно вставлять отзывы в статьи и страницы, создадим шорткод:

add_shortcode('wpvip_reviews_list', 'wpvip_reviews_list_shortcode');
function wpvip_reviews_list_shortcode($atts) {
    $atts = shortcode_atts(array(
        'count' => 5,
    ), $atts, 'wpvip_reviews_list');

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

    $reviews_query = new WP_Query($args);
    ob_start();

    if ($reviews_query->have_posts()) {
        echo '<ul class="wpvip-reviews-list">';
        while ($reviews_query->have_posts()) {
            $reviews_query->the_post();
            $rating = get_post_meta(get_the_ID(), '_wpvip_reviews_rating', true);
            echo '<li><h3>' . get_the_title() . '</h3>';
            echo '<div class="review-rating">Рейтинг: ' . esc_html($rating) . '/5</div>';
            echo '<div class="review-content">' . get_the_content() . '</div></li>';
        }
        echo '</ul>';
        wp_reset_postdata();
    } else {
        echo '<p>Отзывы не найдены.</p>';
    }

    return ob_get_clean();
}

Рекомендации по SEO и производительности для Custom Post Type

При создании CPT важно правильно настроить пермалинки (ЧПУ). В параметре rewrite укажите понятный slug. Для лучшего SEO используйте отдельные таксономии для фильтрации и категоризации.

Для повышения производительности избегайте избыточных запросов к базе, используйте кэширование (например, Transients API или внешние плагины кэширования). Если у вас большой объем CPT, рассмотрите добавление пагинации и индексации метаданных.

Также помните о правах доступа — если CPT предназначен для публичного просмотра, устанавливайте 'public' => true. Для приватного контента используйте соответствующие настройки.

Полезные плагины для работы с Custom Post Type

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

Использование этих плагинов значительно упрощает создание и поддержку сложного контента в WordPress.

Как избежать проблем с разрешениями файлов в WordPress
30.03.2026
Отладка выполнения AJAX-запросов в WordPress
04.12.2025
Как удалить или изменить URL адрес постов в WordPress без потери SEO
20.02.2026
Как создать эффективный кеш в WordPress для быстрой загрузки
29.12.2025
Как добавить собственные поля в WordPress REST API
19.11.2025