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

Данные методы можно встретить в документациях и блогах в вперемешку. Но вопрос в том, когда и где лучше использовать query_posts(), get_posts() и WP_Query. На этот вопрос попытаюсь ответить ниже.

query_posts()

Использование query_posts() очень часто можно встретить в старых WordPress темах и руководствах. Это очень примитивный и проблемный способ вывести нужные вам данные. Он заново запускает некоторые SQL запросы, что приводит к дополнительной нагрузке на веб сервер и замедлит работу сайта.

Главная проблема query_posts() состоит в том, что эта функция «ломает» основной объект запроса, что может привести, например, к неправильной работе плагинов, которые его используют и точно приведет к неправильной работе постраничной разбивке.

Одним предложением, вы никогда не должны использовать query_posts() в своем коде.

get_posts()

Эта функция очень похожа на предыдущую, она принимает те же аргументы, разве что некоторые значения по умолчанию слегка отличаются. Но все же, по своей работе кардинально от нее отличается. Дело в том, что она, во-первых, возвращает массив записей, а во-вторых, что самое главное, она не мешает главному объекту запроса и не модифицирует глобальные переменные. А это означает, что ее можно безопасно использовать для создания дополнительных запросов, не опасаясь, что что-то сломается.

WP_Query

WP_Query это класс который используется для главного запроса и его экземпляр можно использовать в своем коде.

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

Резюмируя вышесказанное, создавая свою тему для WordPress, query_posts() не стоит использовать никогда и нигде, get_posts() и WP_Query можно равноценно использовать при надобности в любом месте, что именно – дело вкуса.