Каков наилучший метод для создания ваших собственных циклов WordPress?

Кажется, есть три основных способа вывода контента из WordPress с использованием встроенных функций, причем WP_Query является рекомендуемым:

  • WP_Query
  • query_posts
  • get_posts

Каковы различия между ними? (Я понимаю, что WP_Query – это класс, а два других – методы).

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

Я ищу примеры того, как вы программируете свои петли WP; например, вывод 2 отдельных списков сообщений по категориям, с вложениями, метаданными и т. д.

Это лучшая ссылка, которую я нашел до сих пор:

  • Определите свой собственный цикл WordPress с помощью WP_Query

Related of "Каков наилучший метод для создания ваших собственных циклов WordPress?"

Я использовал WP_Query и get_posts. На одном из моих шаблонов боковой панели я использую следующий цикл для отображения сообщений из определенной категории с помощью настраиваемых полей с ключом «category_to_load», который содержит название категории или название категории. Реальное различие заключается в реализации любого из этих методов.

Метод get_posts выглядит так в некоторых моих шаблонах:

 <?php global $post; $blog_posts = get_posts($q_string); foreach($blog_posts as $post) : setup_postdata($post); ?> <div class="blog_post"> <div class="title"> <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2> <span class="date"><?php the_time('F j, Y'); ?> by <?php the_author(); ?></span> </div> <?php the_excerpt(); ?> </div> <?php endforeach; ?> 

Где реализация WP_Query выглядит так:

 $blog_posts = new WP_Query('showposts=15'); while ($blog_posts->have_posts()) : $blog_posts->the_post(); ?> <div <?php post_class() ?> id="post-<?php the_ID(); ?>" class="blog_post"> <div class="title"> <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2> <span class="date"><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></span> </div> <div class="entry"> <?php the_content(); ?> </div> <p class="postmetadata"><?php the_tags('Tags: ', ', ', '<br />'); ?> Posted in <?php the_category(', ') ?> | <?php edit_post_link('Edit', '', ' | '); ?> <?php comments_popup_link('No Comments &#187;', '1 Comment &#187;', '% Comments &#187;'); ?></p> </div> <?php endwhile; ?> 

Основное отличие состоит в том, что вам не нужно перезагружать глобальную переменную $ post, и вам также не нужно настраивать данные сообщения, вызывая setup_postdata ($ post) для каждого объекта post при использовании WP_query. Вы также можете использовать прекрасную функцию has_posts () в функции WP_Query, которая недоступна с помощью get_posts ().

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

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

-Крис

Из документов WP для get_posts:

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

Единственная разница между этими двумя функциями заключается в том, что get_posts возвращает массив с пост-записями, а query_posts хранит записи в объекте запроса для извлечения с помощью функций шаблона (has_posts, the_post и т. Д.).

Они оба используют объект WP_Query для выполнения запроса.

Создание второго цикла описано в документах WordPress . Есть несколько ссылок для других примеров нескольких циклов. Вы заметите, что все делают по-другому, но все они довольны своими результатами.

WP использует объект с именем $wp_query для основного цикла. Обычно мы не видим этот объект, потому что он скрыт за have_posts() и the_post() которые являются только оболочками для $wp_query->have_posts() и $wp_query->the_post()

Если вы хотите изменить основной цикл, вы должны использовать query_posts() перед циклом.

Если вы хотите другой цикл, вы можете повторно использовать объект $wp_query с помощью query_posts() перед этим новым циклом. Это может быть сделано много раз, если необходимо.

Если по какой-то причине вам нужно сохранить объект $ wp_query вокруг THEN, вы должны использовать WP_Query . И, конечно, поскольку have_posts() и the_post() являются оболочками для объекта $wp_query вы не можете использовать их с WP_Query . Вам лучше использовать $your_query_obj->have_posts() т.е.

 $sidebar= WP_Query('category_name= sidebar'); while( $sidebar->have_posts() ): $sidebar->the_post(); the_title(); the_content(); endwhile; 

Хороший случай, когда WP_Query может быть лучше, чем query_posts() является левой боковой query_posts() . Поскольку цикл кода для боковой панели, вероятно, будет помещен поверх основного цикла, query_posts() $wp_query объект $wp_query а также изменит основной цикл. В этом случае для использования query_posts() в коде боковой панели вам также потребуется использовать query_posts() перед основным циклом для запроса правильного содержимого для этого цикла.

Поэтому использование WP_Query для этого случая будет поддерживать $ wp_query и, следовательно, основной цикл не тронут.

Но опять же, для обычного сценария query_posts() – прекрасный способ запросить ваш контент:

 query_posts('category_name=blog'); while( have_posts() ): the_post(); the_title(); the_content(); endwhile;