WordPress: Как Создать Шаблон для Произвольного Типа Записи?

Что такое Произвольный Тип Записи (Custom Post Type) в WordPress?

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

Зачем создавать Шаблоны для Произвольных Типов Записей?

Стандартные шаблоны WordPress часто не подходят для отображения специфичного контента CPT. Создание собственных шаблонов дает вам полный контроль над внешним видом и представлением данных:

  • Уникальный дизайн: Адаптируйте внешний вид под нужды конкретного типа контента.
  • Пользовательские поля: Отображайте специфичные для CPT поля (например, цену товара, дату события).
  • Улучшенная навигация: Создавайте собственные архивы и фильтры для удобного поиска контента.

Обзор основных методов создания шаблонов

Существует несколько способов создать шаблоны для CPT, от ручного кодирования до использования плагинов-конструкторов:

  1. Иерархия шаблонов WordPress: Создание файлов single-{post_type}.php и archive-{post_type}.php.
  2. Template Parts: Разделение шаблона на логические блоки для повторного использования.
  3. Плагины управления произвольными полями (например, ACF): для отображения произвольных данных.
  4. Конструкторы страниц: Визуальное создание шаблонов с помощью 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 интерфейса. Это упрощает процесс создания шаблонов, особенно для тех, кто не знаком с кодированием.


Добавить комментарий