Как вывести блог на отдельной странице WordPress. 2 способа.

Я видел много сайтов на WordPress, у которых на главной странице отображается какая-нибудь статичная страница, а страница блога находится отдельно, например yourwebsite.com/blog.

Как же это реализовать на своём собственной сайте? На самом деле существует два способа — один простой и один не очень, рассмотрим их оба.

Способ 1. Использование index.php в качестве шаблона блога.

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

Кстати, так как в разных темах содержимое файла index.php разное — оно может быть совсем не предназначено для блога, в таких случаях либо меняем сами свой index.php либо воспользуемся вторым способом, который я описал чуть ниже.

Шаг 1. Создание страницы блога.

Ну, что тут сказать, переходим в Страницы > Добавить новую, указываем какой-нибудь заголовок, например Блог и какой-нибудь URL, например blog, после этого сохраняем. Всё, с шагом 1 покончено.

создание страницы блога

Шаг 2. Настраиваем отображение страниц в настройках.

Переходим в Параметры > Чтение, настраиваем отображение нужной страницы на главной, а для страницы записей устанавливаем созданную в предыдущем шаге.

настройка отображения страниц

Шаг 3. Последний шаг. Добавляем страницу в меню.

Уже после завершения второго шага при переходе по адресу блога (у нас это yourwebsite.com/blog), у вас будет отображаться страница с записями, использующая шаблон файла index.php.

Тем не менее можно также добавить эту страницу в меню сайта (если поддерживается темой разумеется). Для этого переходим в Внешний вид > Меню, слева в колонке выбираем нашу страницу блога и нажимаем кнопку «Добавить в меню»

Способ 2. Использование собственного шаблона блога. Создание нескольких блогов на одном сайте WordPress.

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

Шагов будет чуть побольше и они будут немного позаковырестей, чем в предыдущем методе. Итак, поехали.

Шаг 1. Создание шаблона страницы

Открываем папку с темой и создаем там файл произвольного названия, например blog-template.php. Внутрь файла вставляем:

<?php
/*
 * Template name: Блог
 */

Шаг 2. Создаем страницу блога

Этот шаг аналогичен первому шагу из начала поста. Итак, переходим в Страницы > Добавить новую, придумываем название и URL странице, и кроме всего прочего в атрибутах страницы указываем только что созданный нами шаблон.

шаблон блога в атрибутах страницы

Сохраняем.

Шаг 3. Плагин постраничной навигации

Однозначно, что нам понадобится постраничная навигация. Скорее всего у вас уже используется какой-то плагин или функция навигации. Если же навигация не будет работать, рекомендую поставить WP_PageNavi — этот плагин работает отлично, я его протестировал, всё ок.

Шаг 4. Шаблон страницы блога

Это голый шаблон блога, без таких важных функций как get_header(), get_footer() и прочего. Просто в данный момент важно понять саму суть.

<?php
/*
 * Template name: Блог
 */
$current_page = (get_query_var('paged')) ? get_query_var('paged') : 1; // определяем текущую страницу блога
$args = array(
	'posts_per_page' => get_option('posts_per_page'), // значение по умолчанию берётся из настроек, но вы можете использовать и собственное
	'paged'          => $current_page // текущая страница
);
query_posts( $args );
 
$wp_query->is_archive = true;
$wp_query->is_home = false;
 
while(have_posts()): the_post();
	?>
	<h2><?php the_title() /* заголовок */ ?></h2>
	<p><?php the_content() /* содержимое поста */ ?></p>
	<?php
endwhile;
 
if( function_exists('wp_pagenavi') ) wp_pagenavi(); // функция постраничной навигации

Всё, страница блога создана, вы можете таким образом создать различные страницы блогов с разными параметрами массива $args. Полный список параметров здесь.

Источник: http://rudrastyh.com/wordpress/separate-blog-pages.html (мой англоязычный блог)

Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

Комментарии 42

  • Сергей22 октября 2013 в 12:10 #

    Здравствуйте Миша. Спасибо за статью, очень интересно. У меня сразу 2 вопроса.
    1.Если проделать все выше сказанное вами, то придется менять чпу, скажем было:
    http://sait.ru/category/какой-то_пост.html
    на http://sait.ru/blog/category/какой-то_пост.html , ну чтобы логика не потерялась, соответственно придется делать редирект 301 в .htaccess, или все же не нужно менять структуру?
    Мне кажется что нужно поменять структуру ЧПУ.
    2. Не знаете как правильно сделать редирект?

  • Денис27 мая 2014 в 10:05 #

    Спасибо!

  • Сергей21 июня 2014 в 19:06 #

    Здравствуйте Миша.
    Огромное спасибо за блог и понятный и простой стиль изложения. Если Вас когда-нибудь посетят сомнения "нужен ли кому-то этот блог? стоит ли продолжать?" - не сомневайтесь - стоит!

    У меня такой вопрос: я не работаю с уже кем-то созданной темой, а пытаюсь написать тему сам. При этом есть задача вывести блог (новости) не на главную страницу, а на созданный мною специально для этого шаблон. В этот шаблон подгружается хедер из файла header-page.php (с таким названием я создал файл специально для размещения хедера на внутренних страницах сайта. т.е. это специальный кастомный хедер для внутренних страниц, на главную страницу подгружается хедер из файла со стандартным названием header.php). В этом хедере (header-page.php) подгружается каждый раз название страницы (раздела) сайта с помощью функцией the_title. В данном случае это название - Блог. Когда я прохожу со страницы Блог по ссылке какого-либо поста чтобы почитать его подробней (в развернутом виде) я перехожу на страницу которая использует шаблон single.php. Вопрос как сделать так чтобы в хедере, когда я нахожусь в одном из постов, отображалось не название данного поста, а по прежнему - название страницы сайт - Блог. Для этого мне нужно создать еще один хедер для подгрузки его именно в single.php со статичным названием страницы Блог, прописанным в HTML? я пробовал так, но в таком случае хедер отображается вообще без заголовка.
    Как правильно называть файлы дополнительных хедеров? может в этом дело?
    И как потом правильно подгружать такие кастомные хедеры в какие-либо из внутренних страниц сайта?

    Заранее благодарю за ответ и помощь!

    • Миша21 июня 2014 в 20:06 #

      Добрый день!

      Спасибо :)

      Относительно названий файлов дополнительных хедеров - всё ок.

      Итак, если я правильно понял, у нас две страницы - single.php и шаблон.php, в которых выводятся названия страниц при помощи the_title() из одного файла header-page.php. Нужно сделать, чтобы и там и там отображалось название страницы - Блог. Есть пара вариантов:

      1) Написать там без функции статично - Блог, (вы пишете, что заголовок пропадает вообще - хм, скорее всего тут уже просто ошибка была в третьем файле хедера). А что вы имеете ввиду под заголовком - то, что находится в <title>?

      2) Используя функцию get_the_title() вывести название страницы блога. Тут нужно будет знать ID этой страницы, например так:

      echo get_the_title( 55 );
      • Сергей26 июня 2014 в 11:06 #

        Миша, большое спасибо за совет! Второй вариант подошел - все работает корректно.

  • Виктор Андреевич27 июля 2014 в 14:07 #

    Простое спасибо!)

  • Женя20 сентября 2014 в 20:09 #

    Здравствуйте. У меня в блоге на главной странице отображаются последние записи. Так вот названия всех этих записей (постов) отображается в одном месте и сразу. Подскажите пожалуйста как это исправить

  • Женя20 сентября 2014 в 20:09 #

    Или хотя бы подскажите какой файл в шаблоне отвечает за вывод названий постов на главной странице

  • Дана20 октября 2014 в 13:10 #

    Спасибо вам большое!!!!!
    А то насмотрелась тут уже видосов типа "только с помощью установки определённой темы" тьфу!!!
    У вас и просто и понятно! Я танцую!!! Ура!!!

  • Сергей30 декабря 2014 в 20:12 #

    Подскажи пожалуйста, как можно создать страницу похожую по функционалу на главную, что бы можно было на этой странице опубликовывать отдельные посты, например на другую тему и что бы эти посты не публиковались на главной? Буду очень благодарен за помощь!

    • Миша31 декабря 2014 в 08:12 #

      Зависит от того, что из себя представляет главная страница. Вообще я так понимаю, что можно просто создать какую-то отдельную рубрику, нет?

      Универсальное решение:

      1. Открываем файл шаблона, который отвечает за вывод главной страницы и копируем его содержимое.
      2. Создаем шаблон страницы, допустим template-as-home.php, копируем туда код и не забываем в начале файла указать:
        <?php
        /*
         * Template name: Название шаблона
         */
      3. Переходим в админку и создаем страницу, в качестве шаблона указываем только что созданный.
      4. Вероятнее всего на этой странице пока ничего не будет отображаться, используя функцию query_posts() задаём необходимые параметры вывода постов.
      5. Теперь осталось исключить эти посты с главной страницы, в этом тебе поможет пост.
      • Алёша :)20 января 2016 в 17:01 #

        Михаил, здравствуйте, нужна ваша помощь. Прочитал вашу статью, но задачу решить не смог - тупой просто. А задача такова: есть главная страница она статичная, на ней хочу вывести два блока статей из разных рубрик. В данный момент на станице index.php все это дело работает, то есть все выводиться вместе со стандартным циклом и те циклы, которые вывожу через переменную wp_query тоже. Но стоит эти циклы перенести на страницу other.php, к примеру, так все циклы работают одинаково и выводят все последние записи, игнорируя параметры. Надеюсь на Ваш ответ.

        • Миша21 января 2016 в 08:01 #

          Здравствуйте!
          Позвольте уточнить — у вас имеются циклы через класс WP_Query и они при переносе тоже начинают игнорировать параметры?

          • Алёша :)22 января 2016 в 12:01 #

            Не знаю как получилось, но путем шаманских обрядов все заработало, но проблема теперь с пагинацией, как заставить её работать? А так же верно ли я определяю текущую страницу?
            Вот собственно один из циклов:

             <?php
            					 	$current_page = (get_query_var('paged')) ? get_query_var('paged') : 1; // определяем текущую страницу блога
            						$showposts = -1; // -1 shows all posts
            						$do_not_show_stickies = 1; // 0 to show stickies
            						$args=array(
            						   'category__in' => (array(22)),
            						   'showposts' => $showposts,
            						   'caller_get_posts' => $do_not_show_stickies
            						   );
            						$my_query = new WP_Query($args); 
            						?>
            							<?php if( $my_query->have_posts() ) : ?>
            								<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
             
            									<div class="posts">
            													<?php if ( function_exists( 'add_theme_support' ) ) the_post_thumbnail( array(250,9999), array('class' => 'imgmainpost') ); ?>
            													<div class="dated">Опубликовано: <?php echo human_time_diff(get_the_time('U'), current_time('timestamp')) . ' назад'; ?></div>
            													<h2 class="mainpage" onclick="location.href='<?php the_permalink(); ?>'"><?php the_title(); ?></h2>
            													</div>
            								<?php endwhile; ?>
            								<?php wp_reset_postdata(); ?> 
            								<?php if( function_exists('wp_pagenavi') ) wp_pagenavi();  // функция постраничной навигации ?>
             
            							<?php else : ?>
            							<?php endif; ?>
            							 <!-- Заканчивается цикл -->
            					 		<?php
            							// Получим ID категории
            							$category_id = get_cat_ID(22);
            							// Теперь, получим УРЛ категории
            							$category_link = get_category_link( $category_id );
            							?>
            • Алёша :)22 января 2016 в 14:01 #

              уже второй день мучаюсь с навигацией, и никакого результата. Может из-за того что я использую эту страницу как главную, или из-за того, что вывожу на ней аж три цикла с разными категориями? Поэтому пагинация и не работает?

              • Алёша :)22 января 2016 в 16:01 #

                Немного поправил код, но это не дало результата.

                 
                <?php
                					 	$current_page = (get_query_var('paged')) ? get_query_var('paged') : 1; // определяем текущую страницу блога
                						//$showposts = -1; // -1 shows all posts
                						$do_not_show_stickies = 1; // 0 to show stickies
                						$args=array(
                						   'category__in' => (array(22)),
                						   'showposts' => $showposts,
                						   'caller_get_posts' => $do_not_show_stickies,
                						   'paged' => $current_page,
                						   );
                						$my_query = new WP_Query($args); 
                						?>
                							<?php if( $my_query->have_posts() ) : ?>
                 
                								<?php while ($my_query->have_posts()) : $my_query->the_post(); ?>
                									<div class="posts">
                													<?php if ( function_exists( 'add_theme_support' ) ) the_post_thumbnail( array(250,9999), array('class' => 'imgmainpost') ); ?>
                													<div class="dated">Опубликовано: <?php echo human_time_diff(get_the_time('U'), current_time('timestamp')) . ' назад'; ?></div>
                													<h2 class="mainpage" onclick="location.href='<?php the_permalink(); ?>'"><?php the_title(); ?></h2>
                													</div>
                								<?php endwhile; ?>
                								<?php wp_pagenavi(); ?>
                								<div class="pagenavi">
                									<?php if (function_exists('wp_corenavi')) wp_corenavi(); ?>
                								</div>	
                								<?php wp_reset_postdata(); ?> 
                							<?php else : ?>
                							<?php endif; ?>
              • Алёша :)22 января 2016 в 16:01 #

                Очень кстати: перенес этот цикл на index.php там все работает!

  • наталья17 марта 2015 в 18:03 #

    Спасибо Миша!:)

  • Yara12 апреля 2015 в 05:04 #

    У меня страница с новостями site/news/best-car, но при переходе в пост - выглядит так site/best-car

  • Алёша22 января 2016 в 12:01 #

    Миша, а что это у вас за плагин комментариев такой красивый? Или вы сами его писали?

  • Дмитрий3 февраля 2016 в 20:02 #

    СУПЕР!!! Искал решение данного вопроса долго и нудно! и вот - эврика! - все оказывается так просто !!!! СУПЕР спасибо!

  • Vladislav14 февраля 2017 в 17:02 #

    Михаил, здравствуйте, при создании блога на необходимой мне странице, у меня возникли проблемы с кодом, код я позаимствовал с другого сайта. Код отображает записи списком, а мне нужно, чтобы записи выводились миниатюрами, при наведении на миниатюры они затемнялись и выводилось название статьи, в общем, чтобы код использовал стандартное оформление темы и отправлял, созданные мной записи на главную страницу. Помогите мне пожалуйста в данном вопросе, что нужно сделать с кодом, чтобы осуществить мою идею?

    <?php 
    /*
        Template Name: Blog
    */
    ?>
    <?php get_header(); ?>
     
        <article>
     
            <?php // Display blog posts on any page @ http://vladislavkozlov.ru/
            $temp = $wp_query; $wp_query= null;
            $wp_query = new WP_Query(); $wp_query->query('showposts=10' . '&paged='.$paged);
            while ($wp_query->have_posts()) : $wp_query->the_post(); ?>
     
            <h2><a href="<?php the_permalink(); ?>" title="Read more"><?php the_title(); ?></a></h2>
            <?php the_excerpt(); ?>
     
            <?php endwhile; ?>
     
            <?php if ($paged > 1) { ?>
     
            <nav id="nav-posts">
                <div class="prev"><?php next_posts_link('&laquo; Previous Posts'); ?></div>
                <div class="next"><?php previous_posts_link('Newer Posts &raquo;'); ?></div>
            </nav>
     
            <?php } else { ?>
     
            <nav id="nav-posts">
                <div class="prev"><?php next_posts_link('&laquo; Previous Posts'); ?></div>
            </nav>
     
            <?php } ?>
     
            <?php wp_reset_postdata(); ?>
     
        </article>
     
    <?php get_footer(); ?>
    • Миша15 февраля 2017 в 09:02 #

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

      • Vladislav15 февраля 2017 в 11:02 #

        Может быть подскажете какие это файлы или функции? Я использую шаблон Snaps Версия: 1.0.4.

        • Миша15 февраля 2017 в 21:02 #

          Я кроме TwentySeventeen и прочих стандартных никакие темы не использую. Ну кроме собственных. Так что вопрос точно не ко мне.

          Поищите в коде. Можете по какому-то конкретному элементу просто поиск по файлам темы сделать.

          • Vladislav16 февраля 2017 в 05:02 #

            Но ведь за вывод записей может отвечать сразу несколько файлов или функций, как тогда быть?

            • Миша16 февраля 2017 в 11:02 #

              Не может.

            • Миша16 февраля 2017 в 22:02 #

              На самом деле скорее всего (обычно) это делается через функцию get_template_part().

              Допустим откройте в теме какой-нибудь файл шаблона, в котором выводятся записи (о том, как определить - тут) и затем поищите ту часть, которая отвечает за конкретную запись.

              В общем тут наверное больше ничего не посоветовать.

              • Vladislav19 февраля 2017 в 13:02 #

                Подправил имеющийся у меня код, по вашим рекомендациям, миниатюры начали отображаться, но они стали очень огромными, что можно с ними сделать?

                1
                2
                3
                4
                5
                6
                7
                8
                9
                10
                11
                12
                13
                14
                15
                16
                17
                18
                19
                20
                21
                22
                23
                24
                25
                26
                27
                28
                29
                30
                31
                32
                33
                34
                35
                36
                37
                38
                39
                40
                41
                42
                43
                44
                45
                46
                
                <?php 
                /*
                    Template Name: Blog
                */
                ?>
                <?php get_header(); ?>
                 
                    <article>
                 
                        <?php // Display blog posts on any page @ http://m0n.co/l
                        $temp = $wp_query; $wp_query= null;
                        $wp_query = new WP_Query(); $wp_query->query('showposts=10' . '&paged='.$paged);
                        while ($wp_query->have_posts()) : $wp_query->the_post(); ?>
                        <h2><a href="<get_template_part( 'content', get_post_format() ); ?>
                        <?php the_excerpt(); ?>
                        <?php
                						/* Include the Post-Format-specific template for the content.
                						 * If you want to overload this in a child theme then include a file
                						 * called content-___.php (where ___ is the Post Format name) and that will be used instead.
                						 */
                						get_template_part( 'content', get_post_format() );
                					?>
                 
                 
                        <?php endwhile; ?>
                 
                        <?php if ($paged > 1) { ?>
                 
                        <nav id="nav-posts">
                            <div class="prev"><?php next_posts_link('&laquo; Previous Posts'); ?></div>
                            <div class="next"><?php previous_posts_link('Newer Posts &raquo;'); ?></div>
                        </nav>
                 
                        <?php } else { ?>
                 
                        <nav id="nav-posts">
                            <div class="prev"><?php next_posts_link('&laquo; Previous Posts'); ?></div>
                        </nav>
                 
                        <?php } ?>
                 
                        <?php wp_reset_postdata(); ?>
                 
                    </article>
                 
                <?php get_footer(); ?>
                • Миша20 февраля 2017 в 08:02 #

                  Либо размеры изображений вам помогут, либо CSS.

                  И строку 14 гляньте, там муть какая-то.

                  • Vladislav20 февраля 2017 в 18:02 #

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

                    • Миша22 февраля 2017 в 08:02 #

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

  • Vladislav22 февраля 2017 в 17:02 #

    Лучше бы посоветовали изящное решение имеющейся проблемы.

    • Vladislav23 февраля 2017 в 07:02 #

      Может быть обратимся к вашему коду, как можно его доработать, чтобы получился желаемый результат?

      <?php
      /*
       * Template name: Блог
       */
      $current_page = (get_query_var('paged')) ? get_query_var('paged') : 1; // определяем текущую страницу блога
      $args = array(
      	'posts_per_page' => get_option('posts_per_page'), // значение по умолчанию берётся из настроек, но вы можете использовать и собственное
      	'paged'          => $current_page // текущая страница
      );
      query_posts( $args );
       
      $wp_query->is_archive = true;
      $wp_query->is_home = false;
       
      while(have_posts()): the_post();
      	?>
      	<h2><?php the_title() /* заголовок */ ?></h2>
      	<p><?php the_content() /* содержимое поста */ ?></p>
      	<?php
      endwhile;
       
      if( function_exists('wp_pagenavi') ) wp_pagenavi(); // функция постраничной навигации
      • Миша23 февраля 2017 в 11:02 #

        Мы возвращаемся к этому комментарию.

        Тут правда больше нечего посоветовать, вам просто не хватает знаний. Освойте основы PHP, затем немного поразбирайтесь, как устроены шаблоны WordPress, ссылка 1, ссылка 2 и ссылка 3.

        Либо поищите какого-нибудь фрилансера, занимающегося WordPress, думаю это у него займёт минут 15,

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Добрый день! В принципе вам только немного нужно доработать код из этого поста - категории уже есть, цена - это и так...

  • eveniy: Добрый день Михаил, подскажите на примере как добавить свои произвольные поля в в вашу форму фильтрации: Я так понимаю...

  • Миша: Отлично! )

  • Дмитрий: сам разобрался: в настройках кастомного типа записи недавно оптимизировал настройки и переоптимизировал: в аргументе 'ta...

  • Дмитрий: У меня по какой-то причине пропало отображение (как в колонке меню слева, так и метабокс в записях ) раздела рубрик для...