wp-lessons.ru wordpress WP-Lessons

Как создать строго отображаемый общий шаблон в WordPress для кастомных типов записей

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

Почему нужен общий шаблон для кастомных типов записей в WordPress

Когда вы регистрируете несколько кастомных типов записей, например, 'portfolio', 'news' и 'reviews', логично, что их внешний вид может быть схожим или идентичным. Вместо того, чтобы создавать отдельный шаблон для каждого типа (single-portfolio.php, single-news.php, single-reviews.php), можно написать один универсальный шаблон, который будет строго отображать все эти записи, снижая дублирование кода и упрощая поддержку.

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

Регистрация кастомных типов с единым шаблоном: как правильно указать template

Первый шаг — зарегистрировать кастомные типы записей с параметрами, которые позволят использовать общий шаблон. При регистрации CPT можно использовать параметр template для блоков, но для шаблонов страниц важно правильно настроить rewrite и supports.

Пример регистрации двух кастомных типов с помощью функции wp_lessons_register_custom_post_types():

function wp_lessons_register_custom_post_types() {
    $args = array(
        'public' => true,
        'label'  => 'Портфолио',
        'supports' => array('title', 'editor', 'thumbnail', 'custom-fields'),
        'rewrite' => array('slug' => 'portfolio'),
        'has_archive' => true,
        'show_in_rest' => true,
    );
    register_post_type('portfolio', $args);

    $args['label'] = 'Новости';
    $args['rewrite']['slug'] = 'news';
    register_post_type('news', $args);
}
add_action('init', 'wp_lessons_register_custom_post_types');

Здесь мы создаём два типа записей — 'portfolio' и 'news'. Обратите внимание, что они имеют разные слаги, но поддерживают одинаковые возможности.

Подключение единого шаблона через фильтр template_include

Чтобы заставить WordPress использовать один шаблон для нескольких CPT, можно воспользоваться фильтром template_include. Это позволит строго указать, какой файл шаблона загружать для определённых типов записей.

Пример функции, которая подключает шаблон single-custom.php для CPT 'portfolio' и 'news':

function wp_lessons_single_template_include( $template ) {
    if ( is_singular( array('portfolio', 'news') ) ) {
        $custom_template = locate_template( 'single-custom.php' );
        if ( $custom_template ) {
            return $custom_template;
        }
    }
    return $template;
}
add_filter( 'template_include', 'wp_lessons_single_template_include' );

В этом коде мы проверяем, является ли текущая страница записью одного из указанных типов, и если да — подгружаем шаблон single-custom.php из папки темы.

Создание шаблона single-custom.php с универсальной разметкой

В файле single-custom.php удобно использовать логику, которая подстраивается под тип записи, например, выводит метаданные или специальные поля в зависимости от CPT.

Пример базового шаблона:

<?php get_header(); ?>

<div class="content-area">
    <main class="site-main" role="main">
        <?php
        while ( have_posts() ) : the_post();
            ?>
            <article id="post-<?php the_ID(); ?>" class="post-<?php post_type(); ?>">
                <h1><?php the_title(); ?></h1>

                <?php if ( has_post_thumbnail() ) : ?>
                    <div class="post-thumbnail"><?php the_post_thumbnail('large'); ?></div>
                <?php endif; ?>

                <div class="post-content">
                    <?php the_content(); ?>
                </div>

                <?php
                // Выводим дополнительные метаданные в зависимости от типа записи
                $post_type = get_post_type();
                if ( $post_type === 'portfolio' ) {
                    echo '<div class="portfolio-details">';
                    echo '<strong>Клиент:</strong> ' . esc_html( get_post_meta( get_the_ID(), 'client_name', true ) );
                    echo '</div>';
                } elseif ( $post_type === 'news' ) {
                    echo '<div class="news-details">';
                    echo '<strong>Дата новости:</strong> ' . get_the_date();
                    echo '</div>';
                }
                ?>

            </article>
        <?php endwhile; ?>
    </main>
</div>

<?php get_footer(); ?>

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

Подключение и оптимизация CSS и JS для общего шаблона

Чтобы стилизовать все записи с одним шаблоном, лучше создать отдельный CSS-файл и подключать его только на страницах CPT 'portfolio' и 'news'. Это ускорит загрузку и облегчит поддержку.

Пример подключения стилей через функцию wp_lessons_enqueue_scripts():

function wp_lessons_enqueue_scripts() {
    if ( is_singular( array('portfolio', 'news') ) ) {
        wp_enqueue_style( 'wp-lessons-custom-single', get_template_directory_uri() . '/css/custom-single.css', array(), '1.0' );
    }
}
add_action( 'wp_enqueue_scripts', 'wp_lessons_enqueue_scripts' );

Для более продвинутой оптимизации можно использовать плагин Clearfy Pro, который поможет отключать ненужные скрипты на страницах, где они не нужны. Подробнее о Clearfy Pro и его возможностях можно узнать на wpshop.ru.

Тестирование и отладка общего шаблона для кастомных типов записей

После создания шаблона важно тщательно протестировать отображение всех поддерживаемых CPT. Проверьте, корректно ли выводятся все поля, нет ли ошибок в верстке, правильно ли работает адаптивность.

Если вы используете редактор Gutenberg, убедитесь, что поддержка блоков в CPT включена, чтобы можно было гибко редактировать контент.

Для отладки удобно использовать плагины, например, Debug Bar или Query Monitor, которые покажут, какие шаблоны загружаются, и помогут выявить ошибки.

Автоматизация с помощью WP-Lessons и других плагинов

Если вы хотите автоматизировать процесс создания записей или заполнения полей для CPT, можно использовать возможности WP-Lessons. Плагин позволяет создавать задания и скрипты для массового управления контентом.

Выводы и рекомендации

Создание строго отображаемого общего шаблона для нескольких кастомных типов записей в WordPress позволяет значительно упростить поддержку сайта, избежать дублирования кода и обеспечить единообразный пользовательский опыт. Использование фильтра template_include — самый надёжный способ задать нужный шаблон для разных CPT.

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