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

Что такое собственный тип записей (Custom Post Type) в WordPress и зачем он нужен

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

Использование CPT помогает структурировать информацию, улучшить удобство управления сайтом и повысить гибкость темы. Например, если вы ведёте сайт с каталогом книг, лучше создать отдельный тип записи «Книга», а не использовать обычные записи с категориями.

В WordPress есть множество плагинов, которые позволяют создавать CPT через интерфейс, например, Custom Post Type UI или Pods. Но если хотите полный контроль и оптимизацию, лучше добавить CPT программно, описав его в файле functions.php вашей темы или подключив отдельный файл.

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

Для регистрации собственного типа записей в WordPress используется функция register_post_type(). Рассмотрим на примере создания типа записи «portfolio» для портфолио.

Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:

function wp_theme_register_portfolio_cpt() {
  $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' => 'portfolio'),
    'capability_type'    => 'post',
    'has_archive'        => true,
    'hierarchical'       => false,
    'menu_position'      => 5,
    'menu_icon'          => 'dashicons-portfolio',
    'supports'           => array('title', 'editor', 'thumbnail', 'excerpt', 'custom-fields')
  );

  register_post_type('portfolio', $args);
}
add_action('init', 'wp_theme_register_portfolio_cpt');

Этот код создаёт новый тип записей «Портфолио» с поддержкой заголовка, редактора, миниатюры и кастомных полей. Обратите внимание на параметр 'rewrite' — он задаёт URL для записей CPT.

Настройка мета-полей для собственного типа записей

Чтобы расширить функционал CPT, часто нужно добавить дополнительные поля — например, дату завершения проекта, ссылку на сайт, описание технологий и т.п. Для этого можно использовать плагин Advanced Custom Fields (ACF), который позволяет создавать мета-поля через визуальный интерфейс без кода.

Если же хотите сделать это программно, добавьте мета-боксы вручную. Вот пример создания мета-бокса с полем «Ссылка на проект» для CPT «portfolio»:

function wp_theme_add_portfolio_metabox() {
  add_meta_box(
    'wp_theme_portfolio_link',
    'Ссылка на проект',
    'wp_theme_portfolio_link_callback',
    'portfolio',
    'normal',
    'default'
  );
}
add_action('add_meta_boxes', 'wp_theme_add_portfolio_metabox');

function wp_theme_portfolio_link_callback($post) {
  wp_nonce_field('wp_theme_save_portfolio_link', 'wp_theme_portfolio_link_nonce');
  $value = get_post_meta($post->ID, '_wp_theme_portfolio_link', true);
  echo ' ';
  echo '';
}

function wp_theme_save_portfolio_link($post_id) {
  if (!isset($_POST['wp_theme_portfolio_link_nonce'])) {
    return;
  }
  if (!wp_verify_nonce($_POST['wp_theme_portfolio_link_nonce'], 'wp_theme_save_portfolio_link')) {
    return;
  }
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
    return;
  }
  if (isset($_POST['wp_theme_portfolio_link_field'])) {
    update_post_meta($post_id, '_wp_theme_portfolio_link', esc_url_raw($_POST['wp_theme_portfolio_link_field']));
  }
}
add_action('save_post', 'wp_theme_save_portfolio_link');

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

Вывод собственного типа записей в теме: шаблоны и WP_Query

Чтобы отображать записи CPT на фронтенде, нужно создать шаблон архива и отдельной записи либо доработать существующие. Для архива создайте файл archive-portfolio.php в папке темы, для отдельной записи — single-portfolio.php.

Пример простого цикла вывода записей CPT в файле архива:

if (have_posts()) :
  while (have_posts()) : the_post();
    echo '<h2>' . get_the_title() . '</h2>';
    the_excerpt();
    $link = get_post_meta(get_the_ID(), '_wp_theme_portfolio_link', true);
    if ($link) {
      echo '<p><a href="' . esc_url($link) . '" target="_blank">Ссылка на проект</a></p>';
    }
  endwhile;
else :
  echo '<p>Проекты не найдены.</p>';
endif;

Если нужно вывести записи CPT в произвольном месте сайта, используйте класс WP_Query:

$args = array(
  'post_type' => 'portfolio',
  'posts_per_page' => 5,
);
$query = new WP_Query($args);

if ($query->have_posts()) {
  while ($query->have_posts()) {
    $query->the_post();
    echo '<h3>' . get_the_title() . '</h3>';
    the_excerpt();
  }
  wp_reset_postdata();
} else {
  echo '<p>Проекты не найдены.</p>';
}

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

Хотя программный подход даёт максимальный контроль, есть ситуации, когда проще использовать плагины. Вот несколько популярных и удобных:

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

Эти плагины отлично подходят для быстрого старта и экономии времени, но для оптимизации и кастомизации лучше дополнять их программными решениями.

Советы по оптимизации и безопасности при работе с собственными типами записей

При добавлении CPT важно помнить о следующих моментах:

  • Используйте префиксы в названиях функций и метаполей, чтобы избежать конфликтов с другими плагинами и темами (как в примерах выше — префикс wp_theme_).
  • Обязательно проверяйте nonce и права пользователя при сохранении метаданных, чтобы предотвратить CSRF-атаки и несанкционированное изменение данных.
  • Планируйте структуру URL, чтобы избежать конфликтов с существующими страницами и типами записей, используйте параметр rewrite в register_post_type().
  • Для сложных проектов рекомендуется создавать CPT в виде отдельного плагина, чтобы не привязывать функционал к теме.
Как создать динамический журнал в WordPress с помощью REST API
23.11.2025
Как отображать динамические данные в теме WordPress без плагинов
10.12.2025
Как добавить поддержку Gutenberg в своей WordPress теме
27.11.2025
Как создать свою WordPress тему с нуля: пошаговое руководство
04.11.2025
Как добавить поддержку мультиязычности в тему WordPress: практическое руководство
06.12.2025