Когда необходимо использовать WP_Query по сравнению с query_posts () по сравнению с get_posts ()?

Это походит на половину учебных руководств в Кодексе и вокруг использования блогосферы query_posts() и половина использования WP_Query. Каково соглашение?

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

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

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

671
19.02.2020, 21:54
  • 1
    @jjeaton query_posts() крошечная функция обертки для WP_Query, единственная дополнительная вещь, которую это делает (согласно блок-схеме) перезаписывает глобальный $wp_query –  Rarst 08.08.2011, 18:39
  • 2
    @jjeaton query_posts() с WP_Query не сделает разницы в производительности, запрос исходной страницы будет все еще работать, потому что это - часть базовой загрузки. Те запросы будут работать, даже если Ваш шаблонный файл не будет иметь никакого цикла вообще. –  Rarst 08.08.2011, 20:15
  • 3
    Не Может избавиться от чувства, что это большая часть genious и upvoted отправляет на WPSE. Должен быть в Кодексе также. –  kaiser 16.09.2011, 03:03
  • 4
    , я просто добавлю свое самое четкое описание "производительности query_posts ()" проблема: Используя query_posts () или WP_Query в шаблонном файле будет иметь ту же стоимость performnace: запрос Вы просто выполнили. Вопрос, обсуждаемый в статье кодекса, - то, что, если Вы на самом деле хотите заменить запрос, необходимо сделать так путем фильтрации исходного query_posts () с фильтром 'parse_query'. Тем путем у Вас только есть тот, исходный, желательный запрос, вместо того, чтобы делать второй запрос для неловкой замены его. query_posts () никогда не является ПУТЕМ!! НИКОГДА! –  jerclarke 20.04.2012, 01:24
  • 5
    Существует чертовски потрясающее объяснение query_posts, записанного John James Jacoby на блоге developer.wordpress.com, который уносит все эти ответы из воды. Основной момент: query_posts не изменяет основной цикл вообще, он заменяет его после того, как он уже работал. Лучший способ изменить основной цикл через a pre_get_posts фильтр. developer.wordpress.com/2012/05/14 / … –  Dan Gayle 10.06.2012, 02:10

Основное различие - это query_posts() действительно только для изменения токовой петли. После того как Вы сделаны, необходимо сбросить цикл и отправить его на его веселом пути. Этот метод также немного легче понять, просто потому что Ваш "запрос" является в основном строкой URL, как которая Вы передаете функции, так:

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

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

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

33
19.02.2020, 21:54

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

11
19.02.2020, 21:54

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

15
19.02.2020, 21:54

Нет просто никакой потребности использовать 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 класс.

16
19.02.2020, 21:54

Теги

Похожие вопросы