Создание и настройка content.php в теме WordPress
Основные принципы работы файла content.php
Файл content.php в теме WordPress отвечает за отображение содержимого записи внутри цикла (the Loop). Он вызывается функцией get_template_part( 'content', get_post_format() ) и позволяет повторно использовать один и тот же шаблон для разных форматов записей. Основное решение - создать универсальный шаблон, который будет подключаться для всех типов контента, если не существует более специфичного файла (например, content-single.php).
Пример базового content.php:
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php the_title( '<h2 class="entry-title">', '</h2>' ); ?>
</header>
<div class="entry-content">
<?php the_content(); ?>
</div>
</article>Content php wordpress (файл content.php в теме wordpress)
Этот код выводит заголовок и содержимое записи. Если требуется отобразить миниатюру, дату, автора, их добавляют внутри соответствующих блоков.
Как создать шаблон для отдельного типа записи?
WordPress позволяет создавать специализированные файлы content-{slug}.php. Например, для произвольного типа записи book достаточно создать файл content-book.php. Если он существует, get_template_part() автоматически использует его вместо общего content.php.
<?php
// В файле content-book.php
$book_author = get_post_meta( get_the_ID(), 'book_author', true );
?>
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<h2><?php the_title(); ?></h2>
<p class="book-meta">Автор: <?php echo esc_html( $book_author ); ?></p>
<?php the_content(); ?>
</article>Таким способом для каждого типа записи задаётся уникальная разметка.
Почему content.php не подключается?
Частая ошибка - вызов get_template_part() без указания второго аргумента или его неправильное значение. Если в теме используется get_template_part( 'content', 'single' ), WordPress сначала ищет content-single.php. Если его нет, подключается content.php. Но если файла content.php тоже нет, ничего не выводится. Решение - всегда создавать базовый content.php как запасной вариант.
Типичная проблема: при использовании дочерней темы родительский content.php может переопределяться неправильно. Если в дочерней теме отсутствует файл, WordPress обращается к родительской теме. Но если в дочерней теме создан content.php с другой структурой, это может нарушить работу плагинов или других шаблонов. Решение - перед переопределением копировать исходный код родительской темы и только потом вносить изменения.
Какие ещё варианты файлов content-*.php существуют?
Стандартные названия: content-single.php (для одиночных записей), content-page.php (для страниц), content-none.php (когда записей нет), content-aside.php (для формата aside) и другие, основанные на get_post_format(). Кроме того, можно использовать content-{term}.php для терминов таксономий, если расширить логику хуками.
Пример вызова с форматом записи:
<?php get_template_part( 'template-parts/content', get_post_format() ); ?>Важно: файлы должны находиться в папке темы (или подпапке, как template-parts/), иначе get_template_part() их не найдёт. Ошибка вызывает скрытое предупреждение, которое не всегда видно.
Расширенные примеры использования content.php
1. Кастомизация с помощью классов чётности
<?php
// content.php с чередованием фона
$post_counter = 1;
if ( have_posts() ) : while ( have_posts() ) : the_post();
$even_class = ( $post_counter % 2 === 0 ) ? 'even' : 'odd';
?>
<article id="post-<?php the_ID(); ?>" <?php post_class( $even_class ); ?>>
<h2 class="entry-title"><?php the_title(); ?></h2>
<?php the_excerpt(); ?>
</article>
<?php
$post_counter++;
endwhile; endif;
?>Результат: чётные посты получают класс even, нечётные - odd. Дополнительные стили CSS задают разные фоны.
2. Использование произвольных полей (ACF или метабоксы)
<?php
// content.php с выводом кастомного поля 'subtitle'
$subtitle = get_post_meta( get_the_ID(), 'subtitle', true );
if ( $subtitle ) {
echo '<p class="post-subtitle">' . esc_html( $subtitle ) . '</p>';
}
?>Пример вывода на фронтенде для записи с заполненным полем subtitle:
<h2>Заголовок поста</h2> <p class="post-subtitle">Это подзаголовок</p>
3. Разделение шаблона для разных форматов записей
<?php
// В index.php или archive.php вызываем шаблон с учётом формата
$format = get_post_format();
if ( false === $format ) {
$format = 'standard';
}
get_template_part( 'template-parts/content', $format );
?>
// Файл template-parts/content-aside.php
<div class="format-aside">
<p><?php the_content(); ?></p>
</div>Если запись имеет формат aside, будет подключён content-aside.php. Для стандартного формата - content.php.
4. Вставка рекламы или дополнительного контента
<?php
// В content.php после каждого 3-го поста выводим рекламный блок
if ( $wp_query->current_post === 2 ) :
?>
<div class="ad-block">
<!-- код рекламы -->
</div>
<?php endif; ?>Этот код размещается внутри цикла до вывода очередного поста.
5. Использование фильтра 'the_content' для модификации вывода
<?php
// Добавляем ссылку на скачивание после контента для типа записи 'download'
add_filter( 'the_content', function( $content ) {
if ( get_post_type() === 'download' ) {
$download_link = get_post_meta( get_the_ID(), 'download_url', true );
if ( $download_link ) {
$content .= '<p><a href="' . esc_url( $download_link ) . '">Скачать</a></p>';
}
}
return $content;
});
?>Фильтр располагается в functions.php, но сам контент выводится через the_content() внутри content.php.
6. Адаптивная разметка для Bootstrap
<article <?php post_class( 'col-12 col-md-6 col-lg-4 mb-4' ); ?>>
<?php if ( has_post_thumbnail() ) : ?>
<a href="<?php the_permalink(); ?>">
<?php the_post_thumbnail( 'medium', array( 'class' => 'img-fluid' ) ); ?>
</a>
<?php endif; ?>
<h3 class="card-title"><?php the_title(); ?></h3>
<p><?php the_excerpt(); ?></p>
</article>Результат - сетка из карточек, где на мобильных устройствах каждая карточка занимает полную ширину, на средних - половину, на больших - треть.