Как создать шаблон для произвольного типа записи в WordPress: Полное руководство

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

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

Зачем нужны шаблоны для произвольных типов записей?

Шаблоны для CPT определяют, как будет отображаться контент этого типа на сайте. Без специального шаблона WordPress будет использовать стандартный шаблон single.php, который, вероятно, не подходит для отображения уникальных полей и структуры вашего CPT. Шаблоны позволяют полностью контролировать внешний вид и поведение CPT, обеспечивая оптимальный пользовательский опыт.

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

Существует несколько способов создания шаблонов для CPT:

  1. Использование шаблона single-custom-post-type.php: Самый простой и рекомендуемый метод, если тип записи называется, например, product, то WordPress автоматически подхватит файл single-product.php.
  2. Использование фильтра template_include: Более гибкий подход, позволяющий программно определять, какой шаблон использовать для конкретного CPT.
  3. Создание шаблона страницы и его назначение произвольному типу записи: Подходит, если требуется использовать функциональность шаблонов страниц для CPT.

Создание произвольного типа записи

Регистрация произвольного типа записи с помощью плагина (например, Custom Post Type UI)

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

Регистрация произвольного типа записи программно (через functions.php или плагин)

Регистрация CPT кодом дает больше контроля над процессом. Вот пример регистрации CPT «Книги» в файле functions.php вашей темы или в отдельном плагине:

<?php
/**
 * Registers the 'book' custom post type.
 */
function register_book_post_type(): void {
    $labels = [
        'name'               => _x( 'Книги', 'Post Type General Name', 'textdomain' ),
        'singular_name'      => _x( 'Книга', 'Post Type Singular Name', 'textdomain' ),
        'menu_name'          => __( 'Книги', 'textdomain' ),
        'name_admin_bar'     => __( 'Книга', 'textdomain' ),
        'archives'           => __( 'Архив книг', 'textdomain' ),
        'attributes'         => __( 'Атрибуты книги', 'textdomain' ),
        'parent_item_colon'  => __( 'Родительская книга:', 'textdomain' ),
        'all_items'          => __( 'Все книги', 'textdomain' ),
        'add_new_item'       => __( 'Добавить новую книгу', 'textdomain' ),
        'add_new'            => __( 'Добавить новую', 'textdomain' ),
        'new_item'           => __( 'Новая книга', 'textdomain' ),
        'edit_item'          => __( 'Редактировать книгу', 'textdomain' ),
        'update_item'        => __( 'Обновить книгу', 'textdomain' ),
        'view_item'          => __( 'Просмотреть книгу', 'textdomain' ),
        'view_items'         => __( 'Просмотреть книги', 'textdomain' ),
        'search_items'       => __( 'Искать книги', 'textdomain' ),
        'not_found'          => __( 'Не найдено', 'textdomain' ),
        'not_found_in_trash' => __( 'Не найдено в корзине', 'textdomain' ),
        'featured_image'     => __( 'Обложка книги', 'textdomain' ),
        'set_featured_image' => __( 'Установить обложку', 'textdomain' ),
        'remove_featured_image' => __( 'Удалить обложку', 'textdomain' ),
        'use_featured_image' => __( 'Использовать как обложку', 'textdomain' ),
        'insert_into_item'   => __( 'Вставить в книгу', 'textdomain' ),
        'uploaded_to_this_item' => __( 'Загружено для этой книги', 'textdomain' ),
        'items_list'         => __( 'Список книг', 'textdomain' ),
        'items_list_navigation' => __( 'Навигация по списку книг', 'textdomain' ),
        'filter_items_list'  => __( 'Фильтровать список книг', 'textdomain' ),
    ];
    $args = [
        'labels'             => $labels,
        'public'             => true,
        'publicly_queryable' => true,
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => true,
        'rewrite'            => ['slug' => 'book'],
        'capability_type'    => 'post',
        'has_archive'        => true,
        'hierarchical'       => false,
        'menu_position'      => 5,
        'supports'           => ['title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions'],
        'taxonomies'         => ['genre'],
        'show_in_rest'       => true, // Enable Gutenberg editor
    ];
    register_post_type( 'book', $args );
}
add_action( 'init', 'register_book_post_type' );

// Register a taxonomy for the 'book' post type.
function register_book_genre_taxonomy(): void {
    $labels = [
        'name'              => _x( 'Жанры', 'taxonomy general name' ),
        'singular_name'     => _x( 'Жанр', 'taxonomy singular name' ),
        'search_items'      => __( 'Искать жанры' ),
        'all_items'         => __( 'Все жанры' ),
        'parent_item'       => __( 'Родительский жанр' ),
        'parent_item_colon' => __( 'Родительский жанр:' ),
        'edit_item'         => __( 'Редактировать жанр' ),
        'update_item'       => __( 'Обновить жанр' ),
        'add_new_item'      => __( 'Добавить новый жанр' ),
        'new_item_name'     => __( 'Новое имя жанра' ),
        'menu_name'         => __( 'Жанры' ),
    ];

    $args = [
        'hierarchical'      => true, // Make it hierarchical (like categories).
        'labels'            => $labels,
        'show_ui'           => true,
        'show_admin_column' => true,
        'query_var'         => true,
        'rewrite'           => [ 'slug' => 'genre' ],
    ];

    register_taxonomy( 'genre', [ 'book' ], $args );
}

add_action( 'init', 'register_book_genre_taxonomy', 0 );


?>
Реклама

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

При регистрации CPT важно правильно настроить параметры, такие как:

  • labels: Набор текстовых меток для интерфейса администратора.
  • public: Определяет, будет ли CPT доступен для публичного просмотра.
  • supports: Указывает, какие стандартные функции WordPress должны поддерживаться CPT (заголовок, редактор, миниатюра и т.д.).
  • rewrite: Настройки для URL-адресов CPT.

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

Метод 1: Использование шаблона single-custom-post-type.php (если тип записи называется ‘custom-post-type’)

Это самый простой способ. Создайте файл single-book.php в папке вашей темы (если ваш CPT называется «book»). WordPress автоматически будет использовать этот файл для отображения отдельных записей типа «book».

Метод 2: Использование template_include фильтра

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

<?php
/**
 * Filters the template include path to use a custom template for the 'book' post type.
 *
 * @param string $template The path to the template file to include.
 * @return string The modified path to the template file.
 */
function custom_post_type_template( string $template ): string {
    if ( is_singular( 'book' ) ) {
        $new_template = locate_template( array( 'single-book.php' ) );
        if ( '' !== $new_template ) {
            return $new_template;
        }
    }

    return $template;
}

add_filter( 'template_include', 'custom_post_type_template', 99 );
?>

Этот код проверяет, является ли текущая страница страницей отдельной записи типа «book», и если да, то пытается загрузить шаблон single-book.php. Если файл не найден, используется стандартный шаблон.

Метод 3: Создание шаблона страницы и его назначение произвольному типу записи

Этот метод подходит, если вы хотите использовать возможности шаблонов страниц (например, разные макеты). Создайте шаблон страницы (например, template-book.php) и добавьте следующий код в начало файла:

<?php
/**
 * Template Name: Шаблон Книги
 * Template Post Type: book
 */

get_header();

// ... ваш код шаблона ...

get_footer();
?>

Template Post Type: book указывает, что этот шаблон доступен для выбора при редактировании записей типа «book».

Детализация шаблона произвольного типа записи

Вывод контента произвольного типа записи (заголовок, контент, произвольные поля)

Внутри шаблона используйте стандартные функции WordPress для вывода контента:

  • the_title(): Выводит заголовок записи.
  • the_content(): Выводит основной контент записи.
  • the_excerpt(): Выводит краткое описание записи.
  • the_post_thumbnail(): Выводит миниатюру записи.

Работа с произвольными полями (Advanced Custom Fields, Meta Box)

Произвольные поля позволяют добавлять дополнительную информацию к записям CPT. Плагины, такие как Advanced Custom Fields (ACF) и Meta Box, упрощают управление произвольными полями. Чтобы вывести значение произвольного поля, используйте функции, предоставляемые этими плагинами. Например, для ACF:

<?php
$author = get_field('author'); // Get author name from custom field
if( $author ):
    echo '<p>Author: ' . esc_html($author) . '</p>';
endif;
?>

Добавление таксономий и отображение связанных терминов

Если для вашего CPT созданы таксономии (например, жанры для книг), вы можете вывести связанные термины с помощью функции get_the_terms():

<?php
$terms = get_the_terms( get_the_ID(), 'genre' );

if ( $terms && ! is_wp_error( $terms ) ) :
    $genres = array();

    foreach ( $terms as $term ) {
        $genres[] = '<a href="' . esc_url( get_term_link( $term ) ) . '">' . esc_html( $term->name ) . '</a>';
    }

    echo '<p>Жанры: ' . join( ", ", $genres ) . '</p>';

endif;
?>

Стилизация шаблона с помощью CSS

Используйте CSS для стилизации шаблона CPT, чтобы он соответствовал дизайну вашего сайта. Вы можете добавить собственные CSS-правила в файл style.css вашей темы или использовать дочернюю тему для безопасного обновления.

Расширенные возможности и оптимизация

Создание архивных страниц для произвольных типов записей (archive-custom-post-type.php)

Для отображения списка всех записей CPT создайте файл archive-book.php (если ваш CPT называется «book») в папке вашей темы. WordPress автоматически будет использовать этот файл для отображения архива записей типа «book».

Использование пользовательских запросов (WP_Query) для получения данных

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

<?php
$args = array(
    'post_type'      => 'book',
    'posts_per_page' => 5,
    'orderby'        => 'date',
    'order'          => 'DESC',
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {
        $query->the_post();
        // ... вывод данных записи ...
    }
    wp_reset_postdata();
}
?>

Кеширование шаблонов для повышения производительности

Кеширование шаблонов может значительно повысить производительность сайта, особенно если шаблоны CPT содержат сложные запросы к базе данных. Используйте плагины кеширования (например, WP Super Cache, W3 Total Cache) для кеширования страниц и фрагментов шаблонов.


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