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

Кастомные типы записей (Custom Post Types, CPT) — важный инструмент для расширения возможностей WordPress. Они позволяют создавать новые виды контента, отличные от стандартных «Записей» и «Страниц». Например, если вы ведёте сайт с портфолио, каталогом товаров или отзывами, кастомные типы записей помогут структурировать данные и улучшить управление контентом.

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

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

Основные преимущества CPT:

  • Логическая структуризация контента.
  • Удобство редактирования и отображения.
  • Возможность отдельного управления правами доступа.
  • Гибкая настройка отображения в админке и на сайте.

Например, для сайта с каталогом мероприятий вы можете создать тип записи «События», в котором будут свои поля даты, места проведения и описания.

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

Для добавления кастомного типа записи в WordPress без использования плагинов достаточно зарегистрировать его через хук init и функцию register_post_type(). Чтобы облегчить поддержку кода и избежать конфликтов, используем префикс wpma_ в названии нашей функции.

function wpma_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'       => 'Искать проекты',
        'parent_item_colon'  => 'Родительский проект:',
        '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,
        'menu_icon'          => 'dashicons-portfolio',
        'supports'           => array('title', 'editor', 'thumbnail', 'excerpt', 'comments')
    );

    register_post_type('wpma_portfolio', $args);
}
add_action('init', 'wpma_register_custom_post_type');

В этом примере мы создаём новый тип записи с ярлыком wpma_portfolio. В параметре supports указаны стандартные возможности, которые будут доступны для записей данного типа.

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

Параметр public отвечает за доступность типа записи на сайте и в админке.

rewrite задаёт ЧПУ для ссылок. В нашем случае адреса будут иметь вид /portfolio/название-записи/.

menu_icon — иконка в административном меню, для портфолио выбран стандартный Dashicons.

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

Добавление кастомных таксономий для кастомного типа записи

Для удобной организации контента к типам записей часто добавляют таксономии. Создадим таксономию «Тип проекта» для нашего портфолио.

function wpma_register_custom_taxonomy() {
    $labels = array(
        'name'              => 'Типы проектов',
        'singular_name'     => 'Тип проекта',
        'search_items'      => 'Искать типы',
        'all_items'         => 'Все типы',
        'parent_item'       => 'Родительский тип',
        'parent_item_colon' => 'Родительский тип:',
        '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' => 'project-type'),
    );

    register_taxonomy('wpma_project_type', array('wpma_portfolio'), $args);
}
add_action('init', 'wpma_register_custom_taxonomy');

Теперь в админке для записей портфолио появится возможность присваивать типы проектов, что упростит фильтрацию и вывод.

Вывод кастомного типа записей на сайте с помощью WP_Query

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

$args = array(
    'post_type'      => 'wpma_portfolio',
    'posts_per_page' => 10,
);

$query = new WP_Query($args);

if ( $query->have_posts() ) {
    echo '<ul>';
    while ( $query->have_posts() ) {
        $query->the_post();
        echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
    }
    echo '</ul>';
} else {
    echo 'Проекты не найдены.';
}
wp_reset_postdata();

Такой код можно вставить в шаблон темы или в любой PHP-блок через функцию do_shortcode с собственным шорткодом.

Создание шорткода для вывода портфолио

Чтобы проще использовать вывод, создадим шорткод [wpma_portfolio] с параметром количества проектов.

function wpma_portfolio_shortcode($atts) {
    $atts = shortcode_atts( array(
        'count' => 5,
    ), $atts, 'wpma_portfolio' );

    $args = array(
        'post_type' => 'wpma_portfolio',
        'posts_per_page' => intval($atts['count']),
    );

    $query = new WP_Query($args);
    $output = '';

    if ($query->have_posts()) {
        $output .= '<ul class="wpma-portfolio-list">';
        while ($query->have_posts()) {
            $query->the_post();
            $output .= '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
        }
        $output .= '</ul>';
    } else {
        $output .= 'Проекты не найдены.';
    }

    wp_reset_postdata();
    return $output;
}
add_shortcode('wpma_portfolio', 'wpma_portfolio_shortcode');

Используйте в редакторе: [wpma_portfolio count="10"] — и выведется список из 10 проектов.

Советы по поддержке и безопасности кастомных типов записей

При регистрации CPT и таксономий важно учитывать следующие моменты:

  • Используйте префиксы в названиях функций и идентификаторов, чтобы избежать конфликтов.
  • Обязательно вызывайте flush_rewrite_rules() один раз после добавления CPT (например, при активации темы или плагина), чтобы обновить правила ЧПУ.
  • Следите за тем, чтобы права доступа соответствовали назначению типа записи — для публичного контента используйте capability_type => 'post'.
  • Для сложных полей можно применять метабоксы или подключать ACF (Advanced Custom Fields), но это уже тема для отдельной статьи.

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

Хотя статья посвящена созданию CPT без плагинов, иногда удобнее использовать готовые решения для управления и расширения функционала:

  • Clearfy Pro — оптимизация и расширение WordPress, в том числе улучшение управления CPT.
  • WPCommunity — плагин для создания социальных сетей на базе CPT и таксономий.

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

WooCommerce: решение проблемы с отображением способов доставки
07.05.2026
Как удалить или скрыть категории из публикаций WordPress
02.02.2026
Как добавить автоматическое подключение к контейнеру Redis в WordPress
30.03.2026
Как создать защищённый формуляр обработки данных в WordPress
03.12.2025
Как автоматизировать удаление неиспользуемых шорткодов в WordPress
23.03.2026