Теория WordPress – Разница между циклами query_posts, get_posts и WP_Query
В движке Вордпресс есть несколько полезных и, главное, встроенных в движок, циклов-запросов, которые оперируют с данными из базы данных. Речь идет о функциях, которые делают запросы к базе данных и возвращают некий массив контента. И с помощью цикла позволяют эффективно обрабатывать этот массив. Эти функции также позволяют «кастомизировать» (задавать параметры) запрос к базе данных и делать выборку только нужного контента.
Основные функции для этого: query_posts()
, get_posts()
и WP_Query()
Какой контент можно ими обрабатывать: выборка постов (записей), отдельной записи, архив записей (по автору, по дате), выборка записей по категории, выборка записей по тегам (меткам), — с указанием дополнительных параметров.
После того, как функция сделала выборку и вернула массив, контент с помощью цикла можно вывести на экран в удобочитаемом виде. Например, «вытянуть» из массива и «передать» html-тегам название поста, дату публикации, категорию поста и т.п.
Разница между этими функциями:
- Цикл на основе
query_posts()
– стандартный цикл. Это не только наиболее упрощенный способ изменения основного запроса, но и также наиболее проблематичный способ, поскольку заменяет запрос его новым экземпляром (и переписывает глобальные переменные$wp_query
,$post
,$posts
). Можно использовать 1 раз на странице (шаблоне). Эта функция не рекомендуется ввиду того, что делает дополнительные SQL-запросы к базе данных, может вызывать баги, особенно при построении страниц с пагинацией (разбивке по страницам). Вместо этой функции рекомендуется использовать другие методы, рассмотренные ниже. - Цикл на основе
get_posts()
– дополнительный цикл. Эта функция очень похожа в использовании на предыдущую, может принимать те же параметры (за небольшими исключениями), но ее главное отличие в том, что она возвращает массив публикаций (записей), не изменяя при этом глобальные переменные ($wp_query
,$post
,$posts
). Использование этой функции безопасно практически в любом месте (читай – шаблоне). Можно использовать много раз на странице (в одном шаблоне). Наиболее популярный метод. - Цикл на основе
WP_Query()
– дополнительный цикл. КлассWP_Query
наиболее сложный (предыдущие две функции работают на его основе), позволяет задавать множество параметров выборки, а главное его отличие – он позволяет создавать новый собственный объект и работать в дальнейшем с ним. Эта функция особенно полезна, когда нужно выводить посты, которые не связаны с текущей страницей или при работе с множественными циклами. Использование этой функции также безопасно практически в любом месте (читай – шаблоне). Рекомендуется использование только для особых и/или сложных случаев выборки данных.
Визуально работу функций запросов в WordPress можно изобразить с помощью этой инфографики:
Пример использования функции get_posts()
для выборки из базы данных 5 постов в случайном порядке, и вывода ссылок на эти посты в маркированном списке
<ul> <?php global $post; $args = array( 'posts_per_page' => 5, 'orderby' => 'rand' ); /* постов на страницу - 5, сортировка - в случайном порядке */ $rand_posts = get_posts( $args ); foreach ( $rand_posts as $post ) : setup_postdata( $post ); ?> <li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li> <?php endforeach; wp_reset_postdata(); ?> </ul>
Последние посты
Как выбрать идеальный ноутбук: Полный гайд
Выбор ноутбука может быть сложной задачей в мире, где рынок переполнен вариантами на любой вкус… Читать далее
Томас Эдисон
Наша самая большая слабость заключается в том, что мы быстро сдаемся. Самый верный способ добиться… Читать далее
Самые красивые и впечатляющие мосты со всего мира (ТОП-10)
Мост — это нечто большее, чем просто сооружение, соединяющее два берега. Для того, чтобы появился… Читать далее
Соломон
Жизнь нас учит, что свою пару мы познаем, когда разводимся, своих братьев мы познаем, когда… Читать далее
Чак Паланик
Кто может — тот делает. Кто не может — тот критикует Чак Паланик Читать далее
Ричард Бах
Ни одно желание не дается тебе отдельно от силы, позволяющей его осуществить. Хотя, возможно, для… Читать далее