Статьи

Используйте два цикла для вывода вашего первого сообщения в блоге по-разному

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

В этом уроке я покажу вам, как продвинуться дальше, чем вы, используя CSS: вместо того, чтобы просто по-другому оформлять свой первый пост в блоге, вы будете выводить для него разный контент. В частности, первый пост будет иметь заголовок, избранные изображения и контент, в то время как другие посты будут иметь только заголовок, избранные изображения и выдержки.

Вы можете адаптировать эту технику: если вам не нужно так много подробностей, вы можете изменить цикл в каждом из запросов, с которыми мы будем работать, чтобы (например) первое сообщение имело заголовок, изображение и выдержку, а другие только заголовок и изображение. Или вы могли бы опустить рекомендуемое изображение для последующих постов. Тебе решать.

Техника, которую мы будем использовать для этого, включает использование класса WP_Query для написания дополнительного запроса перед основным запросом в home.php шаблона home.php , который управляет главной страницей блога. Затем мы будем использовать pre_get_posts() для изменения основного запроса, чтобы последний пост не выводился дважды. Я создам home.php тему по умолчанию для темы Twenty Fifteen и создам для home.php файл home.php , а также таблицу стилей для настройки дочерней темы.

Чтобы следовать этому уроку, вам понадобится:

  • установка для разработки WordPress
  • установлена ​​копия темы Twenty Fifteen (или вы можете работать со своей собственной темой, если хотите)
  • посты, добавленные на ваш сайт — я добавил большую часть своих, импортировав данные модульного теста темы
  • редактор кода

Если вы работаете с темой Twenty Fifteen, первым шагом будет настройка вашей дочерней темы. Создайте новую папку в каталоге wp-content/themes и дайте ей имя — я называю мой tutsplus-blog-page-two-loops . Теперь создайте пустой файл style.css в этой папке и добавьте в него следующее:

01
02
03
04
05
06
07
08
09
10
11
/*
Theme Name: Tuts+ Use Two Loops on Your Main Blog Page
Theme URI: http://rachelmccollin.co.uk/wptutsplus-taxonomy-archive-list-by-second-taxonomy/
Description: Theme to support WPTutsPlus tutorial on creating a custom taxonomy archive.
Author: Rachel McCollin
Author URI: http://rachelmccollin.co.uk/
Template: twentyfifteen
Version: 1.0
*/
 
@import url(«../twentyfifteen/style.css»);

Это сообщает WordPress, что ваша тема является дочерней по отношению к теме Twenty Fifteen и импортирует таблицу стилей из этой темы. Возможно, вы захотите отредактировать некоторые детали, чтобы отразить тот факт, что это ваша тема.

Так как это главная страница блога, которую вы хотите изменить, вам нужно создать файл шаблона для этого в своей дочерней теме. Файл шаблона, который вам нужно создать, это home.php , который home.php главной страницей блога, независимо от того, является ли она главной страницей вашего сайта.

Создайте файл с именем home.php в папке вашей темы.

Теперь откройте файл index.php в Twenty Fifteen и скопируйте код в начало и конец этого файла (то есть не в цикл). Ваш файл будет выглядеть примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
get_header();
 
    <div id=»primary» class=»content-area»>
        <main id=»main» class=»site-main» role=»main»>
         
            <header>
                <h1 class=»page-title screen-reader-text»><?php single_post_title();
            </header>
             
             
            <?php // Previous/next page navigation.
            the_posts_pagination( array(
                ‘prev_text’ => __( ‘Previous page’, ‘twentyfifteen’ ),
                ‘next_text’ => __( ‘Next page’, ‘twentyfifteen’ ),
                ‘before_page_number’ => ‘<span class=»meta-nav screen-reader-text»>’ .
            ) );
             
        </main><!— .site-main —>
    </div><!— .content-area —>
 
<?php get_footer();

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

Следующим шагом является создание первого цикла, который будет отображать самый последний пост в полном объеме.

Под закрывающим </header> в файле home.php добавьте аргументы для запроса:

1
2
3
$args = array(
‘posts_per_page’ => ‘1’,
);

Это будет просто запрос на самый последний пост. Обратите внимание, что вам не нужно указывать тип записи, и по умолчанию это 'post' .

Теперь добавьте цикл под ваши аргументы:

01
02
03
04
05
06
07
08
09
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
$query = new WP_query ( $args );
if ( $query->have_posts() ) { ?>
 
<?php while ( $query->have_posts() ) : $query->the_post();
 
<article id=»post-<?php the_ID(); ?>» <?php post_class( ‘first-post’ );
    <?php the_title( sprintf( ‘<h2 class=»entry-title»><a href=»%s» rel=»bookmark»>’, esc_url( get_permalink() ) ), ‘</a></h2>’ );
 
    <?php if ( has_post_thumbnail() ) { ?>
        <a href=»<?php the_permalink(); ?>»>
            <?php the_post_thumbnail( ‘medium’, array(
                ‘class’ => ‘left’,
                ‘alt’ => trim(strip_tags( $wp_postmeta->_wp_attachment_image_alt ))
            ) );
        </a>
    <?php } ?>
     
    <section class=»entry-content»>
        <?php the_content();
    </section><!— .entry-content —>
                 
    <footer class=»entry-footer»>
        <?php twentyfifteen_entry_meta();
        <?php edit_post_link( __( ‘Edit’, ‘twentyfifteen’ ), ‘<span class=»edit-link»>’, ‘
    </footer><!— .entry-footer —>
     
</article><!— #post-## —>
 
<?php // End the loop.
endwhile;
 
rewind_posts();
 
} ?>

Этот цикл выводит заголовок сообщения, миниатюру, если таковая имеется, и содержимое.

Обратите внимание, что я добавил дополнительный класс .first-post в post_class() шаблона post_class() . Если вы хотите выделить свой первый пост с помощью CSS, этот дополнительный класс предоставляет вам простой способ сделать это.

Очень важно добавить rewind_posts() после цикла, иначе следующий цикл не будет работать.

Второй цикл очень похож, но вместо использования WP_Query он просто обращается к основному запросу.

Ниже только что добавленного цикла добавьте второй цикл:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php while ( have_posts() ) : the_post();
 
<article id=»post-<?php the_ID(); ?>» <?php post_class();
    <?php the_title( sprintf( ‘<h2 class=»entry-title»><a href=»%s» rel=»bookmark»>’, esc_url( get_permalink() ) ), ‘</a></h2>’ );
 
    <?php if ( has_post_thumbnail() ) { ?>
        <a href=»<?php the_permalink(); ?>»>
            <?php the_post_thumbnail( ‘medium’, array(
                ‘class’ => ‘left’,
                ‘alt’ => trim(strip_tags( $wp_postmeta->_wp_attachment_image_alt ))
            ) );
        </a>
    <?php } ?>
     
    <section class=»entry-summary»>
        <?php the_excerpt();
    </section><!— .entry-summary —>
                 
    <footer class=»entry-footer»>
        <?php twentyfifteen_entry_meta();
        <?php edit_post_link( __( ‘Edit’, ‘twentyfifteen’ ), ‘<span class=»edit-link»>’, ‘
    </footer><!— .entry-footer —>
     
</article><!— #post-## —>
 
<?php // End the loop.
endwhile;

Этот цикл очень похож на первый, но с двумя отличиями:

  • Он выводит выдержку вместо содержания.
  • Он не включает .first-post .

Теперь сохраните ваш файл.

В настоящий момент, если вы проверите свою главную страницу блога, вы увидите, что ваше последнее сообщение отображается дважды. Мы исправим это, pre_get_posts основной запрос с pre_get_posts хука pre_get_posts .

Создайте новый файл в вашей теме с именем functions.php . В качестве альтернативы, если вы работаете со своей собственной темой, и у нее уже есть файл функций, откройте ее.

Добавьте этот код в ваш файл функций:

1
2
3
4
5
6
7
8
<?php
// offset the main query on the home page
function tutsplus_offset_main_query ( $query ) {
     if ( $query->is_home() && $query->is_main_query() ) {
         $query->set( ‘offset’, ‘1’ );
    }
 }
add_action( ‘pre_get_posts’, ‘tutsplus_offset_main_query’ );

Это фильтрует основной запрос, но только на домашней странице, добавляя смещение 1.

Теперь сохраните ваш файл и посмотрите на главную страницу блога:

Главная страница блога, показывающая как липкое сообщение, так и последнее сообщение

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

Это легко исправить. home.php файл home.php и добавьте еще один аргумент к аргументам вашего первого запроса:

1
‘ignore_sticky_posts’ => true

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

1
2
3
4
$args = array(
    ‘posts_per_page’ => ‘1’,
    ‘ignore_sticky_posts’ => true
);

Теперь сохраните файл еще раз и проверьте страницу своего блога:

Страница блога с последним сообщением вверху

Так-то лучше! Самый последний пост находится вверху в полном объеме, а липкий пост — под ним, только с его выдержкой. Если вы прокрутите вниз дальше, вы увидите, что другие посты также просто показывают отрывок:

Страница блога с сообщениями, показывающими только выдержки

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

Вы заметите, что если вы перейдете ко второй и последующим страницам постов (то есть страницам с разбивкой по страницам) в своем блоге, будут отображаться те же посты, что и на первой странице, а это означает, что отображаются только ваши десять последних постов! Это потому, что смещение основного запроса нарушило нумерацию страниц.

К счастью, это легко исправить, добавив функцию, добавленную в хук pre_get_posts .

Снова откройте файл functions.php и отредактируйте функцию так, чтобы она выглядела следующим образом:

1
2
3
4
5
function tutsplus_offset_main_query ( $query ) {
    if ( $query->is_home() && $query->is_main_query() && !$query->is_paged() ) {
        $query->set( ‘offset’, ‘1’ );
   }
}

Здесь мы добавили условный тег is_paged() . Это проверяет страницы, разбитые на страницы, отличные от самой первой, поэтому возвращает true, если посетитель просматривает вторую или последующую страницу постов. Используя !$query->is_paged() , мы гарантируем, что запрос будет смещен, только если страница не разбита на страницы.

Теперь сохраните ваш файл и проверьте снова. Нумерация страниц теперь будет работать нормально.

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

На моем сайте я счастлив оставить все как есть, потому что я хочу, чтобы последнее сообщение было очень заметным. Однако, если вы хотите изменить это, вы добавите дополнительный аргумент в ваш первый запрос, а именно: 'paged' => false .

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

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

Вы можете адаптировать эту технику, чтобы отображать последние сообщения из данной категории, использовать другой контент в цикле и многое другое.