WordPress: как создать собственный тип записи (custom post type)

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

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

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

Создавая custom post type, вы расширяете возможности сайта и делаете его более гибким под конкретные задачи.

Для работы с custom post type вы можете использовать плагины, но для полного контроля лучше создавать их через код.

Как создать собственный тип записи через functions.php (пример для wptest.ru)

Чтобы создать custom post type, нужно зарегистрировать его с помощью функции register_post_type(). Лучше делать это в файле functions.php вашей темы или в собственном плагине.

Пример создания типа записи wptest_portfolio для портфолио:

function wptest_register_custom_post_type() {
    $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'       => 'Поиск работ',
        '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' => 'portfolio'),
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 5,
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt', 'comments')
    );

    register_post_type('wptest_portfolio', $args);
}
add_action('init', 'wptest_register_custom_post_type');

Этот код создаст новый пункт меню «Портфолио» в админке, где можно будет добавлять записи с поддержкой заголовка, текста, миниатюры и других стандартных возможностей.

Добавление таксономий и метаполей к custom post type

Для удобной организации записей custom post type часто дополняют собственными таксономиями — категориями и тегами.

Пример регистрации таксономии «Тип работы» для портфолио:

function wptest_register_taxonomy() {
    $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' => 'work-type')
    );

    register_taxonomy('wptest_work_type', array('wptest_portfolio'), $args);
}
add_action('init', 'wptest_register_taxonomy');

Такие таксономии позволяют фильтровать записи и выводить их группами.

Для расширения данных записей можно добавить метаполя через плагин Advanced Custom Fields или вручную с помощью функции add_meta_box. Пример простого метаполя для URL проекта:

function wptest_add_meta_box() {
    add_meta_box('wptest_project_url', 'URL проекта', 'wptest_project_url_callback', 'wptest_portfolio', 'normal', 'default');
}
add_action('add_meta_boxes', 'wptest_add_meta_box');

function wptest_project_url_callback($post) {
    wp_nonce_field('wptest_save_project_url', 'wptest_project_url_nonce');
    $value = get_post_meta($post->ID, '_wptest_project_url', true);
    echo '<label for="wptest_project_url_field">Введите URL проекта:</label> ';
    echo '<input type="text" id="wptest_project_url_field" name="wptest_project_url_field" value="' . esc_attr($value) . '" size="25" />';
}

function wptest_save_meta_box_data($post_id) {
    if (!isset($_POST['wptest_project_url_nonce'])) {
        return;
    }
    if (!wp_verify_nonce($_POST['wptest_project_url_nonce'], 'wptest_save_project_url')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (isset($_POST['wptest_project_url_field'])) {
        $url = sanitize_text_field($_POST['wptest_project_url_field']);
        update_post_meta($post_id, '_wptest_project_url', $url);
    }
}
add_action('save_post', 'wptest_save_meta_box_data');

Вывод custom post type на сайте: примеры шаблонов и WP_Query

Чтобы вывести записи типа wptest_portfolio на сайте, можно создать файл шаблона archive-wptest_portfolio.php в папке темы. В нем используется стандартный цикл WordPress.

Пример простого вывода записей:

<?php get_header(); ?>
<h1>Портфолио</h1>
<div class="portfolio-list">
    <?php if (have_posts()) : ?>
        <?php while (have_posts()) : the_post(); ?>
            <div class="portfolio-item">
                <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
                <div class="thumbnail"><?php the_post_thumbnail('medium'); ?></div>
                <p><?php the_excerpt(); ?></p>
            </div>
        <?php endwhile; ?>
    <?php else : ?>
        <p>Записей пока нет.</p>
    <?php endif; ?>
</div>
<?php get_footer(); ?>

Для более сложных запросов можно использовать класс WP_Query, например, вывести только записи с определенной таксономией:

$args = array(
    'post_type' => 'wptest_portfolio',
    'tax_query' => array(
        array(
            'taxonomy' => 'wptest_work_type',
            'field'    => 'slug',
            'terms'    => 'web-design'
        ),
    ),
);
$query = new WP_Query($args);
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();
        the_title('<h2>', '</h2>');
        the_excerpt();
    }
    wp_reset_postdata();
} else {
    echo '<p>Работ не найдено.</p>';
}

Плагины для работы с custom post type

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

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

Однако изучение создания custom post type через код даёт больше контроля и понимания работы WordPress.

Как избежать конфликтов между похожими плагинами в WordPress
03.02.2026
Автоматический импорт постов в WordPress: плагины и кастомные решения
05.01.2026
Как избежать конфликтов между плагинами WordPress: практические советы и примеры
22.12.2025
Как автоматизировать удаление старого контента в WordPress
28.01.2026
WordPress: как создать собственный тип записи (custom post type)
23.11.2025