Intereting Posts
Невозможно отобразить значок с помощью get_favicon ()? Все мои вставленные изображения получают ссылку на полное изображение, даже если оно уже полноразмерное изображение проблема с shortcode в файле_excerpt добавлять виджеты в панель инструментов для удобного доступа для клиентов? Как копировать заголовки сообщений для публикации slug в phpmyadmin archive- {custom_post_type} .php не распознается wordpress Вперед и замаскируйте веб-сайт WordPress Как создать tag.php Как отправить пользовательскую переменную в запросе ajax для Media Uploader? Настройка WordPress для правильной работы с перенаправлением прокси домена Добавление полей в медиа-загрузчик WordPress Локализовать tinymce в WordPress 3.9? Получить массив текущих идентификаторов почтовых ящиков Как удалить эти материалы с экрана пользовательских типов сообщений? Использование субдомена для загрузки медиа / изображений и т. Д. В 2 разных блогах

Является ли `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 не делает этого