Intereting Posts

Когда следует использовать WP_Query vs query_posts () vs get_posts ()?

Кажется, что половина учебников в Codex и вокруг блогосферы используют query_posts() и половину используют WP_Query . В чем дело?

Solutions Collecting From Web of "Когда следует использовать WP_Query vs query_posts () vs get_posts ()?"

  • query_posts() является слишком упрощенным и проблематичным способом изменения основного запроса страницы путем замены его новым экземпляром запроса. Он неэффективен (повторно запускает SQL-запросы), и в некоторых случаях он будет неудачным (особенно часто при работе с разбивкой по страницам). Любой современный WP-код должен использовать для этого более надежные методы, например, использование pre_get_posts . TL; DR не используют query_posts () ;

  • get_posts() очень похож на использование и принимает те же аргументы (с некоторыми нюансами, как и разные значения по умолчанию), но возвращает массив сообщений, не изменяет глобальные переменные и безопасен в любом месте;

  • Класс WP_Query как за кулисами, но вы также можете создавать и работать с собственным объектом. Бит более сложный, меньше ограничений, также безопасный для использования в любом месте.

query_posts Никогда не следует использовать query_posts . Помимо того, что сказал @Rarst, действительно большая проблема с query_posts заключается в том, что он разбивает основной объект запроса (хранится в $wp_query ). Многие плагины и настраиваемый код зависят от основного объекта запроса, поэтому разбиение основного объекта запроса означает, что вы нарушаете функциональность плагинов и пользовательский код. Одной из таких функций является вся важная функция разбиения на страницы, поэтому, если вы нарушаете основной запрос, вы разбиваете разбивку на страницы.

Чтобы доказать, насколько плохие query_posts на любом шаблоне, выполните следующие действия и сравните результаты

 var_dump( $wp_query ); query_posts( '&posts_per_page=-1' ); var_dump( $wp_query ); 

get_posts и WP_Query – это правильный способ создания вторичных запросов ( например, связанных записей, слайдеров, контента и контента на статических страницах ). Следует отметить, что вы не должны использовать ни одного из двух в пользу основного запроса на главной странице, отдельной странице или странице любого типа архива, так как это нарушит функциональность страницы. Если вам нужно изменить основной запрос, используйте для этого pre_get_posts , а не пользовательский запрос. ( ОБНОВЛЕНИЕ: для статических передних страниц и настоящих страниц см. Использование pre_get_posts на реальных страницах и статических передних страницах *)

По сути, WP_Query используется основным запросом и также используется get_posts , но хотя get_posts() использует WP_Query , есть несколько отличий

  • get_posts быстрее, чем WP_Query . Маржа зависит от количества общих постов сайта. Причина этого заключается в том, что get_posts передает 'no_found_rows' => true по умолчанию WP_Query который пропускает / легально разбивает разбиение на страницы. С 'no_found_rows' => true WP_Query получает количество WP_Query запрашиваемых, затем WP_Query , где по умолчанию он ищет все сообщения, соответствующие запросу, чтобы рассчитать разбиение на страницы.

    По этой причине get_posts() следует использовать только для запросов без разбивки. get_posts – действительно один большой беспорядок. WP_Query следует использовать для всех разбитых на страницы запросов

  • get_posts() не влияют фильтры posts_* которых WP_Query получает влияние этих фильтров. Причина в том, что get_posts по умолчанию передает 'suppress_filters' => true для WP_Query

  • get_posts имеет несколько дополнительных параметров, таких как include , exclude , numberposts и category . Эти параметры меняются в допустимые параметры WP_Query перед передачей WP_Query . include получает изменен в post__in , exclude в post__not_in category в cat и numberposts в posts_per_page . Просто заметьте, все параметры, которые могут быть переданы WP_Query работают с get_posts , вы можете игнорировать и не использовать параметры по умолчанию get_posts

  • get_posts возвращает только свойство $posts WP_Query а WP_Query возвращает полный объект. Этот объект весьма полезен, когда речь идет об условных выражениях, разбиении на страницы и другой полезной информации, которые могут использоваться внутри цикла.

  • get_posts не использует цикл, а цикл foreach для отображения сообщений. Кроме того, по умолчанию не доступны теги шаблонов. setup_postdata( $post ) необходимо использовать для создания тегов шаблонов. WP_Query использует теги цикла и шаблона по умолчанию

  • get_posts передает 'ignore_sticky_posts' => 1 в WP_Query , поэтому get_posts по умолчанию игнорирует липкие сообщения

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

Основное отличие заключается в том, что query_posts() действительно только для модификации текущего Loop. Как только вы закончите, необходимо сбросить петлю и отправить ее на веселье. Этот метод также немного легче понять, просто потому, что ваш «запрос» в основном представляет собой строку URL-адреса, которую вы передаете функции, например:

 query_posts('meta_key=color&meta_value=blue'); 

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

Я чаще использую WP_Query , как это бывает. На самом деле, это сведется к вашему конкретному делу.

Просто нет необходимости использовать query_posts() . Все это создает экземпляр нового объекта WP_Query и переназначает этот новый объект global wp_query .

Для справки следующее: фактическая query_posts() .

  function query_posts($query) { $GLOBALS['wp_query'] = new WP_Query(); return $GLOBALS['wp_query']->query($query); } 

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

В любом случае, я настоятельно рекомендую сделать одолжение и перейти к wp_includes/query.php и WP_Query класс WP_Query .

Убедитесь, что вы используете wp_reset_query() после использования query_posts() потому что это повлияет и на другой результат запроса.

Если я помню, как правильно читал, по существу «цикл» делает WP_Query в основных файлах, но проще понять.

  • query_posts () : может использоваться в одном и только случае, если вам нужно изменить основной запрос. Он устанавливает множество глобальных переменных;
  • get_posts () : он очень похож в механике и принимает те же аргументы, но возвращает массив сообщений
  • WP_Query : вы можете создавать и работать с собственным объектом. Бит более сложный, меньше ограничений, он безопасен в любом месте.

Я бы сказал, не используйте get_posts() в плагине. В некоторых случаях он накладывает очень ограничительные фильтры (set suppress_filters , ignore_sticky_posts и т. Д.) И, вероятно, должен использоваться только в теме, если вам нужно что-то сделать быстро.