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

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

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

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

  • Структурировать контент по специфическим категориям.
  • Отделять разные виды контента друг от друга в админ-панели.
  • Настраивать отдельные шаблоны отображения для каждого типа.
  • Использовать различные таксономии, мета-поля и возможности для каждого типа.

Например, если вы создаёте сайт для агентства недвижимости, логично добавить кастомный тип записей property с уникальными полями — цена, адрес, площадь и т.д.

Создание кастомного типа записи с помощью кода

Для регистрации кастомного типа записи используется функция register_post_type(). Обычно её добавляют в файл functions.php темы или в отдельный плагин. Рассмотрим пример создания типа записи wpedu_portfolio для сайта wpshop.ru:

function wpedu_register_cpt_portfolio() {
    $labels = array(
        'name' => 'Портфолио',
        'singular_name' => 'Проект',
        'add_new' => 'Добавить проект',
        'add_new_item' => 'Добавить новый проект',
        'edit_item' => 'Редактировать проект',
        'new_item' => 'Новый проект',
        'view_item' => 'Просмотреть проект',
        'search_items' => 'Поиск проектов',
        'not_found' => 'Проекты не найдены',
        'not_found_in_trash' => 'В корзине проекты не найдены',
        'menu_name' => 'Портфолио',
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'has_archive' => true,
        'rewrite' => array('slug' => 'portfolio'),
        'supports' => array('title', 'editor', 'thumbnail', 'excerpt', 'comments'),
        'show_in_rest' => true, // для поддержки Gutenberg
        'menu_position' => 5,
        'menu_icon' => 'dashicons-portfolio',
    );

    register_post_type('wpedu_portfolio', $args);
}
add_action('init', 'wpedu_register_cpt_portfolio');

В этом коде:

  • labels — массив для удобства администрирования.
  • public — тип записи виден на фронтенде и в админке.
  • has_archive — включение архивной страницы.
  • rewrite — настройка ЧПУ.
  • supports — поддерживаемые возможности (заголовок, редактор, миниатюра, отрывок, комментарии).
  • show_in_rest — активация поддержки API и редактора Gutenberg.
  • menu_icon — иконка в меню админки.

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

Кастомные мета-поля расширяют содержимое каждой записи, позволяя хранить дополнительную информацию. Например, добавим поле "Дата проекта" для типа wpedu_portfolio. Самый простой способ — использовать хук add_meta_boxes и сохранить данные через save_post:

function wpedu_add_meta_box_portfolio_date() {
    add_meta_box(
        'wpedu_portfolio_date',
        'Дата проекта',
        'wpedu_render_portfolio_date_meta_box',
        'wpedu_portfolio',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'wpedu_add_meta_box_portfolio_date');

function wpedu_render_portfolio_date_meta_box($post) {
    wp_nonce_field('wpedu_portfolio_date_nonce', 'wpedu_portfolio_date_nonce_field');
    $value = get_post_meta($post->ID, '_wpedu_portfolio_date', true);
    echo '<input type="date" name="wpedu_portfolio_date" value="' . esc_attr($value) . '" />';
}

function wpedu_save_portfolio_date_meta_box($post_id) {
    if (!isset($_POST['wpedu_portfolio_date_nonce_field']) || !wp_verify_nonce($_POST['wpedu_portfolio_date_nonce_field'], 'wpedu_portfolio_date_nonce')) {
        return;
    }
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    if (isset($_POST['wpedu_portfolio_date'])) {
        update_post_meta($post_id, '_wpedu_portfolio_date', sanitize_text_field($_POST['wpedu_portfolio_date']));
    }
}
add_action('save_post', 'wpedu_save_portfolio_date_meta_box');

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

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

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

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

Например, с помощью Custom Post Type UI вы можете быстро настроить тип записи, а затем с ACF добавить мета-поля. Такой подход удобен, когда нужно быстро развернуть сайт без глубокого погружения в код.

Особенности настройки и интеграции

При работе с плагинами обратите внимание:

  • Регулярно обновляйте плагины и проверяйте совместимость с вашей версией WordPress.
  • Если планируете смену темы, убедитесь, что кастомные типы записей и мета-поля сохранятся — лучше делать это через плагин, а не функции темы.
  • Для SEO и отображения используйте специализированные шаблоны: создайте файлы single-wpedu_portfolio.php и archive-wpedu_portfolio.php в вашей теме.

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

Чтобы вывести записи кастомного типа на сайте, используют WP_Query с параметром post_type. Пример вывода последних 5 проектов портфолио:

$args = array(
    'post_type' => 'wpedu_portfolio',
    'posts_per_page' => 5,
);
$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> — ' . get_the_date() . '</li>';
    }
    echo '</ul>';
    wp_reset_postdata();
} else {
    echo 'Проекты не найдены.';
}

Если вы добавили мета-поля (например, дату проекта), их можно вывести так:

$portfolio_date = get_post_meta(get_the_ID(), '_wpedu_portfolio_date', true);
echo '<p>Дата проекта: ' . esc_html($portfolio_date) . '</p>';

Создание шаблонов для кастомного типа записи

Для полного контроля над выводом создайте файлы в теме:

  • single-wpedu_portfolio.php — шаблон для отдельной записи типа портфолио.
  • archive-wpedu_portfolio.php — шаблон для архивной страницы этого типа.

В этих файлах вы можете полностью настроить HTML, использовать циклы WordPress, выводить мета-поля и подключать дополнительные стили и скрипты.

Советы и лучшие практики по работе с кастомными типами записей

При добавлении кастомных типов записей учитывайте следующие моменты:

  • Уникальные имена: используйте префиксы для функций и названий, чтобы избежать конфликтов. В нашем случае префикс wpedu_.
  • Поддержка REST API: включайте show_in_rest => true для совместимости с Gutenberg и внешними сервисами.
  • Оптимизация запросов: не забывайте использовать wp_reset_postdata() после кастомных циклов, чтобы не нарушить глобальный запрос.
  • Безопасность: при работе с мета-полями используйте nonce и проверяйте права пользователя при сохранении данных.
  • Легкость управления: если проект большой, лучше использовать плагины для управления кастомными типами и мета-полями.

Пример использования кастомного типа записи и плагина Clearfy Pro

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

Также Clearfy Pro улучшает SEO и безопасность, что важно при работе с кастомным контентом.

⭐⭐⭐⭐⭐