Создание и настройка content.php в теме WordPress

Раздел: WordPress -> Разработка 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>

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

Файл content.php в теме WordPress - comments

En
Content php wordpress (php)