Кажется, есть три основных способа вывода контента из WordPress с использованием встроенных функций, причем WP_Query
является рекомендуемым:
Каковы различия между ними? (Я понимаю, что WP_Query
– это класс, а два других – методы).
Каков самый чистый способ иметь несколько циклов на одной странице, без какого-либо вмешательства друг в друга?
Я ищу примеры того, как вы программируете свои петли WP; например, вывод 2 отдельных списков сообщений по категориям, с вложениями, метаданными и т. д.
Это лучшая ссылка, которую я нашел до сих пор:
Я использовал 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 »', '1 Comment »', '% Comments »'); ?></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;