Когда вы должны использовать wp_query vs Query_posts () vs get_posts ()?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/1753

Вопрос

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

Это было полезно?

Решение

  • 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 Получает количество запрашиваемых постов, а затем выругается, где по умолчанию он дополнительно ищет все сообщения, соответствующие запросу для расчета страниц.

    По этой причине, 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() действительно только для изменения текущего цикла. Как только вы закончите, необходимо сбросить петлю и отправить его на его веселый путь. Этот метод также немного легче понять, просто потому, что ваш «запрос» - это в основном строка URL, которую вы передаете к функции, например, так:

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

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

Я склонен использовать 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_reset_query() После использования query_posts() Потому что это также повлияет на другие результаты запроса.

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

  • Query_posts (): Может использоваться в одном и единственном случае, если вам нужно изменить основной запрос. Он устанавливает много глобальных переменных;
  • get_posts (): Это очень похоже на механику и принимает одинаковые аргументы, но возвращает массив постов
  • Wp_query: Вы можете создавать и работать с собственным объектом. Немного сложнее, меньше ограничений, его безопасно использовать где угодно.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top