WordPress. Примеры использования циклов

Давайте взглянем на несколько примеров циклов в действии:

Основные примеры

архивная страница блога

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

<?php
if ( have_posts() ) {
    while ( have_posts() ) { 
        the_post();
        the_title( '<h2>', '</h2>' );
        the_post_thumbnail();
        the_excerpt();
    }
} else {
    _e( 'Sorry, no posts matched your criteria.', 'textdomain' );
}
?>

Индивидуальный пост

В WordPress у каждого сообщения есть собственная страница, на которой отображается соответствующая информация для этого сообщения. Теги шаблона позволяют настроить отображаемую информацию.

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

<?php
if ( have_posts() ) {
    while ( have_posts() ) { 
        the_post();
        the_title( '<h1>', '</h1>' );
        the_content();
    }
} else {
    _e( 'Sorry, no pages matched your criteria.', 'textdomain' );
}
?>

Промежуточные примеры

По-разному оформляйте посты из некоторых категорий

Пример ниже делает несколько вещей:

  • Во-первых, он отображает каждое сообщение с его заголовком, временем, автором, содержанием и категорией, как в примере с отдельным сообщением выше.
  • Далее, посты с идентификатором категории «3» могут быть оформлены по-разному с использованием in_category()тега шаблона.

Комментарии к коду в этом примере предоставляют подробную информацию о каждом этапе цикла:

<?php
// Start the Loop.
if ( have_posts() ) {
    while ( have_posts() ) { 
        the_post();
        /* * See if the current post is in category 3.
          * If it is, the div is given the CSS class "post-category-three".
          * Otherwise, the div is given the CSS class "post".
        */
        if ( in_category( 3 ) ) { ?>
        <div class="post-category-three">
        <?php } else { ?>
        <div class="post">
        <?php } 

            // Display the post's title.
            the_title( '<h2>', ';</h2>' ); 

            // Display a link to other posts by this posts author.
            printf( __( 'Posted by %s', 'textdomain' ), get_the_author_posts_link() );

            // Display the post's content in a div.
            ?>
            <div class="entry">
                <?php the_content() ?>
             </div>

            <?php
            // Display a comma separated list of the post's categories.
            _e( 'Posted in ', 'textdomain' ); the_category( ', ' ); 

        // closes the first div box with the class of "post" or "post-cat-three"
       ?>
       </div>

    <?php
    // Stop the Loop, but allow for a "if not posts" situation
    } 

} else {
    /*
      * The very first "if" tested to see if there were any posts to
      * display. This "else" part tells what do if there weren't any.
     */
     _e( 'Sorry, no posts matched your criteria.', 'textdomain' );

     // Completely stop the Loop.
}
?>

Несколько циклов

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

Использование rewind_posts

Вы можете использовать rewind_posts()для повторного выполнения одного и того же запроса. Это полезно, если вы хотите отобразить один и тот же запрос дважды в разных местах на странице.

Вот пример использования rewind_posts():

<?php
// Start the main loop
if ( have_posts() ) {
    while ( have_posts() ) { 
        the_post();
        the_title();
    }
}

// Use rewind_posts() to use the query a second time.
rewind_posts();

// Start a new loop
while ( have_posts() ) { 
    the_post();
    the_content();
}
?>

Создание вторичных запросов и циклов

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

<?php
// The main query.
if ( have_posts() ) {
    while ( have_posts() ) { 
        the_post();
        the_title();
        the_content();
    }
} else {
    // When no posts are found, output this text.
    _e( 'Sorry, no posts matched your criteria.' );
}
wp_reset_postdata();                                                        

/*
 * The secondary query. Note that you can use any category name here. In our example,
 * we use "example-category".
 */
$secondary_query = new WP_Query( 'category_name=example-category' );        

// The second loop.
if ( $secondary_query->have_posts() ) {
    echo '<ul>';
    while ( $secondary_query->have_posts() ) { 
        $secondary_query->the_post();
        the_title( '<li>', '</li>' );
     }
     echo '</ul>';
}
wp_reset_postdata();
?>

Как вы можете видеть в примере выше, мы сначала отображаем обычный цикл. Затем мы определяем новую переменную, которая использует WP_Queryдля запроса определенной категории; в нашем случае мы выбрали ярлык example-category.

Обратите внимание, что обычный цикл в приведенном выше примере имеет одно отличие: он вызывает wp_reset_postdata()сброс данных сообщения. Прежде чем вы сможете использовать второй цикл, вам необходимо сбросить данные сообщения. Есть два способа сделать это:

  1. С помощью rewind_posts()функции;
  2. Путем создания новых объектов запроса.

Сброс нескольких циклов

При использовании нескольких циклов в шаблоне важно сбросить их. Невыполнение этого требования может привести к неожиданным результатам из-за того, как данные хранятся и используются в глобальной $postпеременной. Существует три основных способа сброса цикла в зависимости от того, как они называются.

Использование wp_reset_postdata

Используйте wp_reset_postdata(), когда вы запускаете пользовательские или несколько циклов с запросами WP_Query. Эта функция восстанавливает глобальную $postпеременную в текущую запись в основном запросе. Если вы следуете рекомендациям, это наиболее распространенная функция, которую вы будете использовать для сброса циклов.

Чтобы правильно использовать эту функцию, поместите следующий код после всех циклов с WP_Query:

<?php wp_reset_postdata(); ?>

Вот пример использования цикла WP_Query, который сбрасывается с помощью wp_reset_postdata().

 <?php
// Example argument that defines three posts per page.
$args = array( 'posts_per_page' => 3 ); 

// Variable to call WP_Query.
$the_query = new WP_Query( $args ); 

if ( $the_query->have_posts() ) {
    // Start the Loop
    while ( $the_query->have_posts() ) { 
        $the_query->the_post();
        the_title();
        the_excerpt();
    // End the Loop
    }
} else {
// If no posts match this query, output this text.
    _e( 'Sorry, no posts matched your criteria.', 'textdomain' );
}

wp_reset_postdata();
?> 

Использование wp_reset_query

Всё что нужно знать о query_posts(): query_post используется для изменения цикла используемого самим wordpress, а get_posts необходим для создания собственного цикла. И использовать query_posts не стоит. Вообще забудьте о существовании этой функции.

Но если всё таки разобрать подробнее. То использование wp_reset_query() восстанавливает WP_Query и глобальные $postданные в исходный основной запрос. Вы ДОЛЖНЫ использовать эту функцию для сброса вашего цикла, если вы используете query_posts() внутри своего цикла. Вы можете использовать его после пользовательских циклов с WP_Query. Рекомендуется использовать wp_reset_postdata() с любыми пользовательскими циклами, включающими файлы WP_Query.

Предупреждение:query_posts() не является лучшей практикой , и ее следует избегать, если это возможно. Таким образом, вы не будете иметь много пользы от wp_reset_query().

Чтобы правильно использовать эту функцию, поместите следующий код после всех циклов с query_posts().

<?php wp_reset_query(); ?>

Один комментарий

  1. Добрый день, меня зовут Александра. Я менеджер нескольких информационных площадок. Мне очень понравился ваш сайт, и я хотела бы с вами сотрудничать. Уточните, принимаются ли у Вас статьи к публикации? Хотим купить у Вас несколько штук статей, с ссылкой на наш сайт. Каковы ваши условия?
    Прошу прислать ответ на электронную почту: aleksandraburimova23@gmail.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *