Является ли get_posts () более эффективным, чем The Loop?

В category.php , я хочу получить список сообщений в этой категории.

Я нашел два способа: используя get_posts($args) и The Loop .

get_posts ()

 $args = array ( "category" => ID ); $posts = get_posts($args); // then use foreach to loop the $posts 

Способы

 <?php if (have_posts() ): ?> <?php while (have_posts() ): the_post(); ?> ... <?php endwhile; ?> <?php endif; ?> 

Итак, какой из них эффективнее?

Из того, что я искал, get_posts() предназначен для настраиваемого шаблона, в то время как The Loop используется внутри шаблона, следующего за соглашением об именах WordPress.

Я предпочитаю get_posts() но если есть большие накладные расходы по сравнению с The Loop, я должен снова подумать об этом.

Solutions Collecting From Web of "Является ли get_posts () более эффективным, чем The Loop?"

Когда WordPress включает category.php (как и любой другой шаблон), основной запрос (т. Е. Запрос, вызванный URL-адресом) уже запущен: это означает, что запрос в базе данных уже был запущен, и именно по этой причине в шаблоне вы может запускать Loop без вызова запроса.

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

Также обратите внимание, что get_posts – это просто оболочка для WP_Query поэтому отличие от использования Loop и использования синтаксиса foreach не учитывает сам запрос, а также то, как вы используете результат запроса.

Если вы предпочитаете foreach over while (Loop – всего лишь цикл while), вы можете использовать его, также вызывая непосредственно WP_Query :

 $q = new WP_Query( $args ); // or $q = get_posts( $args ); foreach ( $q->posts as $post ) { // here your code eg $title = $post->title; $content = $post->content; } 

Итак, почему обычно люди используют Loop вместо этого типа цикла? по 2 причинам, по крайней мере:

  1. Настройка глобального объекта $post . Когда вы вызываете the_post() внутри Loop, эта функция глобализует переменную $post содержащую текущий объект post. Многие основные функции и плагины полагаются на этот variale, поэтому часто важно настроить. Однако его можно настроить также с помощью цикла foreach, используя функцию setup_postdata , предыдущий код становится:

     global $post; foreach ( $q->posts as $post ) { setup_postdata($post); // here your code eg $title = $post->title; $content = $post->content; } 
  2. Вторая причина, связанная с шаблонами тегов, над прямым доступом к свойствам post-объекта: при вызове the_title или the_content (или других шаблонов) увольняются перед выводом свойства, а если вы их не вызываете, вывод может быть не который вы ожидаете, снова это можно сделать вручную в нашем цикле foreach:

     $q = new WP_Query( $args ); global $post; foreach ( $q->posts as $post ) { setup_postdata($post); // here your code eg $title = apply_filters('the_title', $post->title); $content = apply_filters('the_content', $post->content); } 

Последний кодовый блок можно считать почти идентичным Loop.

Я сказал почти потому, что есть другая вещь, которая отличается: 2 крючка действия, loop_start и loop_end , запущенные Loop. Некоторые плагины могут их использовать, поэтому для лучшей совместимости вы должны сделать что-то вроде:

 $q = new WP_Query( $args ); global $post; do_action_ref_array('loop_start', array(&$q)); foreach ( $q->posts as $post ) { setup_postdata($post); // here your code eg $title = apply_filters('the_title', $post->title); $content = apply_filters('the_content', $post->content); } do_action_ref_array('loop_end', array(&$q)); 

Как уже говорилось, это лучше использовать для пользовательских циклов, но в отношении основного запроса вызов другого WP_Query является плохим для производительности и ненужным. Однако основной запрос – это просто экземпляр WP_Query , сохраненный в глобальной переменной $wp_query , поэтому, если в вашем шаблоне вы делаете что-то вроде:

 global $wp_query, $post; do_action_ref_array('loop_start', array(&$wp_query)); foreach ( $wp_query->posts as $post ) { setup_postdata($post); // here your code eg $title = apply_filters('the_title', $post->title); $content = apply_filters('the_content', $post->content); } do_action_ref_array('loop_end', array(&$wp_query)); 

вы делаете что-то очень похожее (пропорционально идентичное) на Loop, просто довольно многословное, но если вы просто ненавидите, while петли …

В заключение, в отношении основного запроса, по соображениям совместимости целесообразно (но не обязательно) использовать Loop: если вы не запускаете привязки и фильтры, есть вероятность, что если вы установите какие-либо плагины, некоторые из них не будут работать …

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