Більше результатів...

Загальні селектори
Тільки точні збіги
Шукати у заголовках
Шукати у контенті
Вибір типів постів
Фільтрувати за категоріями
FAQ
Hostenko
Натхнення
Відео уроки
Новини
Плагіни
теми
Уроки
Хакі

Ми великі шанувальники класу WP_Query: ми використовуємо його на багатьох клієнтських сайтах для запиту до БД та виведення контенту.

Якщо ви хочете запустити множинні цикли на сторінці, найпростішим способом буде запускати щоразу WP_Query. Але є і мінуси: при виконанні запиту WordPress надсилає запит до бази даних, це займає певний час і може уповільнити роботу вашого сайту. Якщо ж ви використовуєте WP_Query замість основного запиту для виведення контенту, базовий запит стає непотрібним, що є витратою ресурсів.

inet.ws - Powerful VPS Hosting в США, Canada, UK та DE!

У цій статті ми покажемо вам, як використовувати один запит для запуску одного і більше циклів. Ви також можете зробити це за допомогою базового запиту (що ми зробимо, оскільки це найбільш ефективно) або WP_Query.

Дивіться також:

Процес поділяється на три етапи:

  • Створення дочірньої теми та файлу шаблону
  • Створення частини шаблону для контенту циклу
  • Створення наших циклів

Почнемо!

Що вам знадобиться

Для подальшої роботи вам знадобляться:

  • Адмін доступ до WordPress
  • Редактор коду
  • Записи на вашому сайті з наданими множинними рубриками — ми використовуємо WordPress theme unit test data
  • Встановлена ​​тема двадцять Шістнадцять на вашому сайті
  • Встановлена ​​та активована дочірня тема Twenty Sixteen

Необов'язково використовувати саме тему Twenty Sixteen, ви можете використовувати цей метод для вашої власної теми, але ми показуватимемо вам все саме на її прикладі.

Створення дочірньої теми

Спершу давайте створимо дочірню тему Twenty Sixteen. Ми робимо це, оскільки не хочемо редагувати саму тему. Створіть нову пусту папку в директорії WP-зміст / теми. Нашу ми назвемо tutsplus-one-query-two-loops.

У цій папці створіть файл під назвою style.css і додайте до нього код:

/*
Theme Name:     Tutsplus One Query Multiple Loops
Theme URI:      http://.tutsplus.com/tutorials/how-to-code-multiple-loops-while-only-querying-the-database-once--cms-25703
Description:    Theme to support Tutorial on running multiple loops while querying the database just once. Child theme for the Twenty Sixteen theme.
Author:         Rachel McCollin
Author URI:     
Template:       twentysixteen
Version:        1.0
*/
 
@import url("../twentysixteen/style.css");

Збережіть цей файл і активуйте нову тему.

Наступним кроком буде створення файлу шаблону для рубрик, з якими ми працюватимемо. Зробіть копію файлу archive.php з Twenty Sixteen у вашій новій темі. Не перемістіть, а скопіюйте. Перейменуйте файл на category.php. Тепер це файл шаблону рубрик на вашому сайті.

Створення нового файлу шаблону

Першим кроком буде налаштування нового файлу шаблону в нашій темі, яка міститиме відредаговану версію циклу Twenty Sixteen. У папці вашої теми створіть підпапку під назвою includes, де потрібно створити новий файл, названий loop-category.php.

Тепер відкрийте файл template-parts/content.php з теми Twenty Sixteen і знайдіть такий код (більша частина файлу):

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    <header class="entry-header">
        <?php if ( is_sticky() && is_home() && ! is_paged() ) : ?>
            <span class="sticky-post"><?php _e( 'Featured', 'twentysixteen' ); ?></span>
        <?php endif; ?>
 
        <?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>
    </header><!-- .entry-header -->
 
    <?php twentysixteen_excerpt(); ?>
 
    <?php twentysixteen_post_thumbnail(); ?>
 
    <div class="entry-content">
        <?php
            /* translators: %s: Name of current post */
            the_content( sprintf(
                __( 'Continue reading<span class="screen-reader-text"> "%s"</span>', 'twentysixteen' ),
                get_the_title()
            ) );
 
            wp_link_pages( array(
                'before'      => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', 'twentysixteen' ) . '</span>',
                'after'       => '</div>',
                'link_before' => '<span>',
                'link_after'  => '</span>',
                'pagelink'    => '<span class="screen-reader-text">' . __( 'Page', 'twentysixteen' ) . ' </span>%',
                'separator'   => '<span class="screen-reader-text">, </span>',
            ) );
        ?>
    </div><!-- .entry-content -->
 
    <footer class="entry-footer">
        <?php twentysixteen_entry_meta(); ?>
        <?php
            edit_post_link(
                sprintf(
                    /* translators: %s: Name of current post */
                    __( 'Edit<span class="screen-reader-text"> "%s"</span>', 'twentysixteen' ),
                    get_the_title()
                ),
                '<span class="edit-link">',
                '</span>'
            );
        ?>
    </footer><!-- .entry-footer -->
</article><!-- #post-## -->

Скопіюйте його у свій новий файл.

Редагування шаблону

Цикл із Twenty Sixteen відображає більше, ніж нам потрібно для цього архіву, тому ми його відредагуємо. Ми хочемо, щоб відображалися лише цитати, а не весь контент, тому ми його видалимо.

У вашому новому файлі loop-category.php знайдіть цей код і видаліть його:

<div class="entry-content">
    <?php
        /* translators: %s: Name of current post */
        the_content( sprintf(
            __( 'Continue reading<span class="screen-reader-text"> "%s"</span>', 'twentysixteen' ),
            get_the_title()
        ) );
 
        wp_link_pages( array(
            'before'      => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', 'twentysixteen' ) . '</span>',
            'after'       => '</div>',
            'link_before' => '<span>',
            'link_after'  => '</span>',
            'pagelink'    => '<span class="screen-reader-text">' . __( 'Page', 'twentysixteen' ) . ' </span>%',
            'separator'   => '<span class="screen-reader-text">, </span>',
        ) );
    ?>
</div><!-- .entry-content -->

Наступним кроком буде заміна функції twenty_sixteen_excerpt() на стандартну функцію the_excerpt ()оскільки версія Twenty Sixteen не містить посилання на весь запис.

Знайдіть цей рядок:

<?php twenty_sixteen_excerpt(); ?>

Замініть її на цю:

<?php the_excerpt(); ?>

Нам також потрібно зробити кілька поправок у тегах заголовка. У шаблоні виправте рядок:

<?php the_title( sprintf( '<h2 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h2>' ); ?>

Змініть тег h2 на h3:

<?php the_title( sprintf( '<h3 class="entry-title"><a href="%s" rel="bookmark">', esc_url( get_permalink() ) ), '</a></h3>' ); ?>

Збережіть файл шаблону. А тепер давайте повернемося до вашого файлу category.php і продовжимо роботу там.

Створення наших циклів

Для початку давайте видалимо з файлу category.php звернення до частини шаблону Twenty Sixteen, оскільки ми використовуватимемо новий файл.

У файлі category.php знайдіть такий код:

get_template_part( 'template-parts/content', get_post_format() );

Видаліть його.

Приступимо до створення циклів.

У цьому прикладі ми перерахуємо всі записи з тегом 'зміст', використовуючи умовний тег has_tag().

Це означає, що нам потрібно запустити 3 цикли:

  • Перший перевіряє, чи відобразив запит запису цього тегу
  • Якщо так, то другий цикл виводить записи із цим тегом
  • А третій виводить записи без цього тэгу

Між циклами ми будемо використовувати rewind_posts() для перемотування записів без повторного надсилання запиту: ми все ще використовуємо базовий запит.

Перший цикл: пошук записів

У файлі category.php знайдіть початок циклу:

while ( have_posts() ) : the_post();

Над цим рядком визначте нову змінну під назвою $ count:

$count = 0;

Вставте цей код у цикл:

// check if there are any posts with the '' tag
$tag = 'content';
if ( has_tag( $tag ) ) {
    $count +=1;
}

Це перевірить ваші записи на наявність тега 'зміст', і якщо так, то додасть 1.

Ваш цикл буде схожий на цей:

// Check for posts in the first loop.
$count = 0;
while ( have_posts() ) : the_post();
 
// check if there are any posts with the '' tag
$tag = 'content';
if ( has_tag( $tag ) ) {
    $count +=1;
}
     
endwhile;

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

Наступним кроком буде запуск циклу для виведення записів з тегом, але якщо такі є. Якщо значення $ count більше 0.

Додайте такий код під вашим першим циклом:

if ( $count > 0 ) {
                     
    rewind_posts();
 
    echo '<h2>Posts tagged with ' . $tag . '</h2>';
 
     
    while ( have_posts() ) : the_post();
     
    if ( has_tag( $tag ) ) {            
        get_template_part( 'includes/loop', 'category');    
    }
     
    // End the loop.
    endwhile;
     
}

З його допомогою ми перевіряємо чи більше $ count ніж 0. При позитивній відповіді записи перемотуються, а цикл знову запускається. Він перевіряє кожен запис, і якщо запис має потрібний нам тег, то викликається шаблон, який ми створили.

Третій цикл: виводить інші записи

Останній цикл виведе записи, що залишилися. Якщо в цій рубриці немає жодного запису з тегом 'зміст', то цикл відобразить усі записи цієї рубрики.

Під вашим другим циклом додайте цей код:

rewind_posts();
         
 
// Second Loop - posts not with the 'content' tag
while ( have_posts() ) : the_post();
         
    if ( !has_tag( $tag ) ) {           
        get_template_part( 'includes/loop', 'category');    
    }
         
// End the loop.
endwhile; ?>

Він перемотує записи та запустить цикл знову. Він перевірить записи на відсутність тега 'зміст' і виведе їх за допомогою частини шаблону.

Результат

Нині ж проведіть тест сторінки архіву рубрики на вашому сайті.

Якщо ви використовуєте WordPress test unit data, як і ми, ви побачите, що в рубриці «Націнка» є записи з тегом 'зміст'. Це сторінка архіву рубрики для рубрики «Markup» на нашому сайті:

Як запрограмувати численні Цикли, зробивши лише один запит до БД на WordPress

Висновки

Зовсім не складно запустити численні цикли одним запитом. Замість скидання запиту та створення нового, використовуйте функцію rewind_posts() для перемотування запиту та його повторного запуску. А замість визначення нових параметрів, використовуйте умовні теги для визначення, яку посаду варто вивести.

Важливо: Не використовуйте query_posts () зміни базового запиту. Це уповільнить ваш сайт, як при використанні багатьох запитів.

У нашому прикладі ми запустили два цикли, засновані на базовому запиті, який позбавив WP_Query двох додаткових запитів і зменшив навантаження сайту.

Джерело: code.tutsplus.com
inet.ws - Powerful VPS Hosting в США, Canada, UK та DE!
Олексій Шевченко
редактор wpcafe
Вивчає сайтобудування з 2008 року. Практикуючий вебмайстер, який спеціалізується на створенні сайтів на WordPress. Задати питання Олексію можна на https://profiles.wordpress.org/wpthemeus/

Коментарі до запису: 1

Валерій:

Хіба have_posts() не перемотує цикл назад автоматично після закінчення проходу циклом?

public function have_posts() {
if ( $this->current_post + 1 post_count ) {
повернути правду;
} elseif ( $this->current_post + 1 == $this->post_count && $this->post_count > 0 ) {
/ **
* Fires once the loop has ended.
*
* @ з 2.0.0
*
* @param WP_Query &$this WP_Query instance (passed by reference).
*/
do_action_ref_array( 'loop_end', array( &$this ) );
// Do some cleaning up after the loop
$this->rewind_posts();
}

$this->in_the_loop = false;
повернення помилковим;
}

Додати коментар або відгук