Что такое Произвольный Тип Записи (Custom Post Type) в WordPress?
Произвольный тип записи (Custom Post Type, CPT) – это способ расширить функциональность WordPress, позволяющий создавать типы контента, отличные от стандартных записей и страниц. Представьте, что вам нужно управлять портфолио проектов, каталогом товаров или событиями. CPT позволяет организовать этот контент отдельно, предоставив гибкие инструменты для его структурирования и отображения.
Зачем создавать Шаблоны для Произвольных Типов Записей?
Стандартные шаблоны WordPress часто не подходят для отображения специфичного контента CPT. Создание собственных шаблонов дает вам полный контроль над внешним видом и представлением данных:
- Уникальный дизайн: Адаптируйте внешний вид под нужды конкретного типа контента.
- Пользовательские поля: Отображайте специфичные для CPT поля (например, цену товара, дату события).
- Улучшенная навигация: Создавайте собственные архивы и фильтры для удобного поиска контента.
Обзор основных методов создания шаблонов
Существует несколько способов создать шаблоны для CPT, от ручного кодирования до использования плагинов-конструкторов:
- Иерархия шаблонов WordPress: Создание файлов
single-{post_type}.phpиarchive-{post_type}.php. - Template Parts: Разделение шаблона на логические блоки для повторного использования.
- Плагины управления произвольными полями (например, ACF): для отображения произвольных данных.
- Конструкторы страниц: Визуальное создание шаблонов с помощью drag-and-drop интерфейса.
Регистрация Произвольного Типа Записи
Использование плагина (например, Custom Post Type UI)
Custom Post Type UI (CPT UI) – популярный плагин, позволяющий регистрировать CPT и таксономии через удобный интерфейс. Он упрощает процесс регистрации, особенно для тех, кто не хочет писать код.
Регистрация типа записи программно (functions.php или плагин)
Более продвинутый способ – регистрация CPT с помощью кода. Этот метод дает больше гибкости и контроля над процессом.
<?php
/**
* Регистрирует произвольный тип записи 'book'.
*
* @return void
*/
function register_book_post_type(): void {
$labels = array(
'name' => _x( 'Книги', 'post type general name', 'textdomain' ),
'singular_name' => _x( 'Книга', 'post type singular name', 'textdomain' ),
'menu_name' => _x( 'Книги', 'admin menu', 'textdomain' ),
'name_admin_bar' => _x( 'Книга', 'add new on admin bar', 'textdomain' ),
'add_new' => _x( 'Добавить новую', 'book', 'textdomain' ),
'add_new_item' => __( 'Добавить новую книгу', 'textdomain' ),
'new_item' => __( 'Новая книга', 'textdomain' ),
'edit_item' => __( 'Редактировать книгу', 'textdomain' ),
'view_item' => __( 'Просмотреть книгу', 'textdomain' ),
'all_items' => __( 'Все книги', 'textdomain' ),
'search_items' => __( 'Искать книги', 'textdomain' ),
'parent_item_colon' => __( 'Родительская книга:', 'textdomain' ),
'not_found' => __( 'Книги не найдены.', 'textdomain' ),
'not_found_in_trash' => __( 'Книги не найдены в корзине.', 'textdomain' )
);
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'book' ),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => null,
'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ),
'taxonomies' => array( 'category', 'post_tag' ),
'show_in_rest' => true // Для Gutenberg
);
register_post_type( 'book', $args );
}
add_action( 'init', 'register_book_post_type' );
Этот код необходимо поместить в functions.php вашей темы (рекомендуется использовать дочернюю тему) или в отдельный плагин.
Основные параметры при регистрации типа записи: slug, labels, supports
slug: Идентификатор CPT в URL.labels: Массив текстовых меток для админ-панели.supports: Возможности, поддерживаемые типом записи (заголовок, редактор, миниатюра и т.д.).
Создание Базового Шаблона для Произвольного Типа Записи
Использование template hierarchy WordPress (single-{post_type}.php)
WordPress использует иерархию шаблонов для определения, какой файл использовать для отображения конкретной страницы. Для одиночной записи CPT WordPress будет искать файл single-{post_type}.php.
Создание файла single-{post_type}.php в теме
Создайте файл single-book.php в папке вашей темы (или дочерней темы, если вы используете дочернюю тему). Если у вас тип записи называется, например, product, то файл будет называться single-product.php.
Отображение контента записи: заголовок, содержимое, произвольные поля
Внутри single-book.php можно использовать стандартные функции WordPress для отображения контента:
<?php
get_header();
?>
<main id="primary" class="site-main">
<?php
while ( have_posts() ) : the_post();
?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
<div class="entry-meta">
<?php // Здесь можно добавить метаданные (автор, дата публикации и т.д.) ?>
</div>
</header><!-- .entry-header -->
<div class="entry-content">
<?php the_content(); ?>
</div><!-- .entry-content -->
<footer class="entry-footer">
<?php // Здесь можно добавить теги, категории и т.д. ?>
</footer><!-- .entry-footer -->
</article><!-- #post-<?php the_ID(); ?> -->
<?php
// If comments are open or we have at least one comment, load up the comment template.
if ( comments_open() || get_comments_number() ) :
comments_template();
endif;
endwhile; // End of the loop.
?>
</main><!-- #main -->
<?php
get_sidebar();
get_footer();
Этот код отображает заголовок и содержимое записи. Метаданные (автор, дата публикации и т.д.), теги и категории можно добавить в соответствующие блоки.
Расширенные Возможности Шаблонов: Произвольные Поля и Таксономии
Использование плагинов для управления произвольными полями (например, Advanced Custom Fields)
Advanced Custom Fields (ACF) – мощный плагин, позволяющий добавлять произвольные поля к записям, страницам и CPT. Он предоставляет простой интерфейс для создания и управления полями, а также функции для их отображения в шаблонах.
Отображение произвольных полей в шаблоне
После создания полей в ACF, их можно отобразить в шаблоне с помощью функции get_field():
<?php
$author = get_field('book_author');
$publisher = get_field('book_publisher');
if( $author ): ?>
<p>Автор: <?php echo esc_html( $author ); ?></p>
<?php endif; ?>
<?php if( $publisher ): ?>
<p>Издатель: <?php echo esc_html( $publisher ); ?></p>
<?php endif; ?>
В этом примере, book_author и book_publisher – имена полей, созданных в ACF. Функция get_field() возвращает значение поля, которое затем отображается в шаблоне. Функция esc_html() используется для экранирования HTML-тегов в значении поля, что предотвращает XSS-атаки.
Работа с произвольными таксономиями (категории и теги для типа записи)
Вы можете создать произвольные таксономии (категории и теги) для вашего CPT. Это позволяет классифицировать и фильтровать записи CPT.
Альтернативные Методы Создания Шаблонов
Использование Template Parts (gettemplatepart())
Template Parts позволяют разбить шаблон на небольшие, переиспользуемые фрагменты. Например, можно создать Template Part для отображения метаданных записи и использовать его в нескольких шаблонах.
<?php get_template_part( 'template-parts/content', 'book-meta' ); ?>
Создание шаблонов страниц для отображения архивов произвольного типа записи
Для отображения архива CPT (списка всех записей CPT) можно использовать файл archive-{post_type}.php. Если он отсутствует, будет использован archive.php или index.php.
Использование плагинов-конструкторов страниц (page builders) для создания шаблонов
Плагины-конструкторы страниц (например, Elementor, Beaver Builder) позволяют создавать шаблоны визуально, с помощью drag-and-drop интерфейса. Это упрощает процесс создания шаблонов, особенно для тех, кто не знаком с кодированием.