Каков наилучший метод для создания ваших собственных циклов Wordpress? - PullRequest
8 голосов
/ 20 февраля 2009

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

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

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

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

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

Ответы [ 3 ]

6 голосов
/ 21 февраля 2009

Я использовал как 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) для каждого объекта записи при использовании WP_query. Вы также можете использовать прекрасную функцию have_posts () в функции WP_Query, которая недоступна при использовании get_posts ().

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

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

-Крис

3 голосов
/ 21 февраля 2009

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

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

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

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

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

1 голос
/ 23 декабря 2009

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() изменит объект $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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...