При работе с кастомными типами записей (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.
Не забывайте про подключение стилей и скриптов только там, где они нужны, и тестируйте шаблон на всех типах записей. Рекомендуется использовать дополнительные инструменты для отладки и оптимизации.