wp-lessons.ru wordpress WP-Lessons

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

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

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

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

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

Кроме того, CPT хорошо интегрируется с таксономиями (категории, метки), поддерживает архивы и может иметь собственные шаблоны отображения на фронтенде.

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

Регистрация CPT реализуется через функцию register_post_type(). Обычно этот код добавляют в файл functions.php вашей темы или в отдельный плагин.

Рассмотрим пример регистрации типа записи «Книги» (books):

function wp_lessons_register_cpt_books() {
  $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,
    'has_archive'        => true,
    'rewrite'            => array('slug' => 'books'),
    'supports'           => array('title', 'editor', 'thumbnail', 'custom-fields'),
    'show_in_rest'       => true,
  );

  register_post_type('wp_lessons_books', $args);
}
add_action('init', 'wp_lessons_register_cpt_books');

В этом примере мы создаём CPT с названием wp_lessons_books, указываем метки для интерфейса администратора, делаем тип публичным и включаем поддержку редактора, миниатюр и кастомных полей.

Параметр show_in_rest включён для поддержки редактора Gutenberg и REST API.

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

Чтобы структурировать контент CPT, часто создают собственные таксономии (категории, метки). Например, для «Книг» можно добавить таксономию «Жанры».

Пример регистрации таксономии:

function wp_lessons_register_taxonomy_genres() {
  $labels = array(
    'name'              => 'Жанры',
    'singular_name'     => 'Жанр',
    'search_items'      => 'Поиск жанров',
    'all_items'         => 'Все жанры',
    'edit_item'         => 'Редактировать жанр',
    'add_new_item'      => 'Добавить новый жанр',
    'menu_name'         => 'Жанры',
  );

  $args = array(
    'hierarchical'      => true, // работает как категории
    'labels'            => $labels,
    'show_ui'           => true,
    'show_in_rest'      => true,
    'show_admin_column' => true,
    'query_var'         => true,
    'rewrite'           => array('slug' => 'genre'),
  );

  register_taxonomy('wp_lessons_genre', array('wp_lessons_books'), $args);
}
add_action('init', 'wp_lessons_register_taxonomy_genres');

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

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

Для отображения CPT на сайте нужно создать шаблоны в вашей теме. WordPress автоматически ищет файлы с именами archive-{post_type}.php для архивов и single-{post_type}.php для одиночных записей.

В нашем случае это будут archive-wp_lessons_books.php и single-wp_lessons_books.php.

Пример простого шаблона архива (archive-wp_lessons_books.php):

<?php get_header(); ?>
<main>
<h1>Каталог книг</h1>
<?php if ( have_posts() ) : ?>
  <ul>
  <?php while ( have_posts() ) : the_post(); ?>
    <li>
      <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
    </li>
  <?php endwhile; ?>
  </ul>
<?php else : ?>
  <p>Книги не найдены.</p>
<?php endif; ?>
</main>
<?php get_footer(); ?>

Для одиночной страницы можно вывести дополнительные метаданные и таксономии.

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

Часто для собственного типа записи нужны дополнительные данные, например, автор книги, год издания, рейтинг и т. д. Для этого используют кастомные поля и мета-боксы.

Рассмотрим пример добавления мета-бокса с полем «Год издания» для CPT «Книги»:

function wp_lessons_add_books_meta_box() {
  add_meta_box(
    'wp_lessons_books_year',
    'Год издания',
    'wp_lessons_books_year_meta_box_callback',
    'wp_lessons_books',
    'side'
  );
}
add_action('add_meta_boxes', 'wp_lessons_add_books_meta_box');

function wp_lessons_books_year_meta_box_callback($post) {
  wp_nonce_field('wp_lessons_save_books_year_data', 'wp_lessons_books_year_nonce');
  $value = get_post_meta($post->ID, '_wp_lessons_books_year', true);
  echo '<label for="wp_lessons_books_year_field">Введите год:</label> ';
  echo '<input type="number" id="wp_lessons_books_year_field" name="wp_lessons_books_year_field" value="' . esc_attr($value) . '" size="4" />';
}

function wp_lessons_save_books_year_data($post_id) {
  if (!isset($_POST['wp_lessons_books_year_nonce'])) {
    return;
  }
  if (!wp_verify_nonce($_POST['wp_lessons_books_year_nonce'], 'wp_lessons_save_books_year_data')) {
    return;
  }
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
    return;
  }
  if (isset($_POST['wp_lessons_books_year_field'])) {
    $year = sanitize_text_field($_POST['wp_lessons_books_year_field']);
    update_post_meta($post_id, '_wp_lessons_books_year', $year);
  }
}
add_action('save_post', 'wp_lessons_save_books_year_data');

После добавления этого кода в админке при редактировании книги появится поле для ввода года издания. Данные сохраняются и могут быть выведены на сайте.

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

Чтобы вывести дополнительное поле в шаблоне одиночной записи, используйте функцию get_post_meta():

<?php
  $year = get_post_meta(get_the_ID(), '_wp_lessons_books_year', true);
  if ($year) {
    echo '<p><strong>Год издания:</strong> ' . esc_html($year) . '</p>';
  }
?>

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

Рекомендации и полезные плагины для работы с CPT

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

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

Однако, знание базового подхода с кодом всегда пригодится для тонкой настройки и оптимизации проекта.

Заключение

Создание собственного типа записи в WordPress – это эффективный способ структурировать и расширить функциональность сайта. Благодаря CPT можно реализовать практически любой тип контента с удобным управлением и гибкой настройкой отображения. Используя приведённые примеры и рекомендации, вы сможете создавать качественные и удобные решения под свои задачи.