Чтобы вынести блог на отдельную страницу WordPress, создай страницу «Блог» и назначь её страницей записей в настройках чтения. Главная при этом может остаться страницей компании или портфолио.
Для настройки плагин не нужен. Ниже — действия в админке и пример home.php для классической темы. Он выводит записи и постраничную навигацию.
1. Как назначить страницу записей в WordPress
- Создай две пустые страницы, например «Главная» и «Блог». Контент второй страницы выводиться не будет — достаточно заголовка и ярлыка, например
blog. - Открой «Настройки → Чтение».
- В «На главной странице отображать» выбери «Статическую страницу».
- В «Главная страница» выбери «Главная», в «Страница записей» — «Блог». Сохрани.
Теперь записи открываются по адресу /blog/, а постраничная навигация — /blog/page/2/. Количество записей на странице задаётся там же, в «Настройки → Чтение».
2. Как WordPress выбирает шаблон блога
Иерархия шаблонов для этих двух адресов отличается от обычных страниц:
- Главная:
front-page.php→ шаблон страницы (свой шаблон,page-{slug}.php,page-{id}.php,page.php) →singular.php→index.php. - Страница записей:
home.php→index.php.
Для страницы записей WordPress использует home.php или запасной index.php. Файлы page.php, page-blog.php и шаблон, выбранный в редакторе страницы, для неё не применяются.
Если блог был собран в page-blog.php, перенеси нужную разметку в home.php и адаптируй её под основной цикл записей. Одного переименования недостаточно, если шаблон рассчитан на содержимое обычной страницы.
front-page.php имеет приоритет всегда, даже когда на главной выбрана лента записей. Если в теме есть этот файл, а нужна лента, выведи её в нём или удали файл.
3. Вывод записей и пагинации в home.php
В home.php используется основной цикл — записи уже выбраны WordPress, свой WP_Query не нужен:
<?php get_header(); ?>
<main class="blog">
<?php
$blog_page_id = (int) get_option( 'page_for_posts' );
if ( $blog_page_id ) : ?>
<h1><?php echo esc_html( get_the_title( $blog_page_id ) ); ?></h1>
<?php endif; ?>
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<article <?php post_class( 'post-card' ); ?>>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<?php the_excerpt(); ?>
</article>
<?php endwhile; ?>
<?php the_posts_pagination(); ?>
<?php else : ?>
<p>Записей пока нет.</p>
<?php endif; ?>
</main>
<?php get_footer(); ?>
Заголовок блога берётся по ID назначенной страницы. Внутри цикла the_title() выводит заголовок текущей записи.
Количество записей и сортировку меняй через pre_get_posts. Отдельный запрос может нарушить расчёт страниц — подробнее в статье о пагинации WordPress.
4. Разница между is_home() и is_front_page()
Названия условных тегов сбивают с толку:
is_front_page()— главная сайта, что бы на ней ни выводилось.is_home()— страница с лентой записей. При статической главной это/blog/, а не главная.
Пример: подсветить пункт «Блог» в меню на странице записей, в рубриках и в самих записях.
function mytheme_is_blog_section() {
return is_home() || is_singular( 'post' ) || is_category() || is_tag() || is_date() || is_author();
}
Функцию можно использовать в фильтре nav_menu_css_class — как добавлять классы пунктам меню, разобрано в статье о классах меню WordPress.
Ссылка на блог в шаблоне
Не прописывай /blog/ вручную: ярлык страницы могут поменять. Ссылку даёт ID из настроек:
<?php
$blog_page_id = (int) get_option( 'page_for_posts' );
$blog_url = $blog_page_id ? get_permalink( $blog_page_id ) : home_url( '/' );
?>
<a href="<?php echo esc_url( $blog_url ); ?>">Все статьи</a>
Запасной адрес home_url( '/' ) подходит, когда на главной отображаются последние записи. Если выбрана статическая главная, но страница записей не назначена, сначала задай её в настройках чтения.
Почему страница блога работает неправильно
- На
/blog/пусто или выводится текст страницы — тема используетpage.php, потому что страница записей не выбрана в настройках. - Главная показывает ленту, хотя выбрана страница, — в теме есть
front-page.phpс циклом записей. /blog/page/2/отдаёт 404 — проверь, хватает ли записей для второй страницы и не заменён ли основной запрос вhome.php. Другие причины разобраны в статье о пагинации.- У записей адреса вида
/blog/slug/не появились — это отдельная настройка «Постоянных ссылок», страница записей на неё не влияет.