Intereting Posts
Есть ли способ группировать определенные CPT в одном элементе панели инструментов? Информация о теме в файле style.css Кто отвечает за санацию данных в разработке WordPress? Фиксирование объекта WP Post для пользовательского маршрута Как создать виджетную боковую панель для каждой категории динамически? Как ограничить количество страниц, которые может видеть не подписчик? REST API: как получить вес заказа? Лучшие практики для функций обратного вызова add_action ajax Панель избранных изображений отсутствует в пользовательском типе сообщений в WordPress 3.2 Изменить порядок страниц по пользовательскому полю (магические поля) wp_star_rating () не отображает звезды в сообщении Как изменить статус массового сообщения Перемещение разделяемых кнопок (в Jetpack) в начало сообщения? Как отображать сообщения с изображениями в полноэкранном слайдере Показывать будущие события на основе настраиваемого поля И порядок по дате

Является ли `query_posts` более медленным, чем вторичный запрос?

Я знаю, что основной запрос выполняется быстро, поскольку он получает данные после разбора URL-адреса и после WP_Query . Мы находимся в OO PHP.

Но query_posts действительно медленнее, чем некоторый вторичный запрос, который происходит в шаблоне, например, с get_posts , или native, который вы вызываете с помощью

 // WP_Query arguments $args = array ( ); // The Query $query = new WP_Query( $args ); 

Ты спрашиваешь:

query_posts действительно медленнее, чем некоторые вторичные запросы …

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

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

Проще говоря, все это неэффективно. Таким образом, хотя может быть не «большая красная кнопка», которая гласит: «Не нажимайте сюда!» это в значительной степени подразумевает, что его нельзя нажимать. Это не большой и красный, но в Codex конкретно говорится :

Примечание. Эта функция не предназначена для использования плагинами или темами.

Если вы хотите быть эффективными и должны переопределить основной запрос – используйте pre_get_posts который изменит параметры запроса до того, как он вызовет его из базы данных, которая сохраняет весь вызов базы данных (в этом нам не нужен вторичный запрос).

В целом,

  • запрос, выполненный на домашней странице,

  • query_posts( 'posts_per_page=get_option( 'posts_per_page' ) и

  • $q = new WP_Query( 'posts_per_page=get_option( 'posts_per_page' )

должны иметь одинаковую точную производительность с очень малой разницей между ними, так как все вышеперечисленное по умолчанию одинаково ( то есть по умолчанию имеют одинаковые аргументы запроса ). Это связано с тем, что все эти запросы используют класс WP_Query для запуска сборки и выполнения запросов db для возврата запрошенных сообщений. get_posts() немного быстрее, хотя он также использует WP_Query . Большая разница в том, что get_posts передает no_found_rows=true в WP_Query который юридически разбивает разбиение на страницы.

То, что верно, основной запрос ( первичный запрос ) выполняется при каждой загрузке страницы в соответствии с точной загружаемой страницей. Удаление основного цикла и замена его вторичным запросом ( либо query_posts() , WP_Query либо get_posts() ) – это то, что называется медленной страницей. Это происходит потому, что вы делаете одну и ту же работу дважды. Как я уже сказал, основной запрос выполняется независимо, поэтому вы уже запросили db для сообщений и заменили основной цикл вторичным запросом на запрос db снова.

Помимо проблем, созданных с разбивкой по страницам и другим дрянным проблемам, именно поэтому нельзя заменять основной цикл из основного запроса второстепенным. Я сделал обширную запись об этом, которую вы можете прочитать здесь . Чтобы изменить основной запрос, всегда используйте pre_get_posts поскольку он изменяет вали запросов до WP_Query класса WP_Query и запускает SQL-запрос. Существуют также другие фильтры (фильтры post post ), доступные в WP_Query которые вы можете использовать для прямого изменения SQL-запроса

Что плохо делает query_posts это то, что он изменяет основной объект запроса, на который многие функции полагаются как query_posts делает следующее

 $wp_query = new WP_Query() 

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