Intereting Posts
Первичное редактирование с настраиваемыми полями? Теги, одновременно используйте соединение и пересечение Как отображать Frontend CSS только для администратора Загрузите сообщение с другим шаблоном? Запрос между датами с использованием фильтров выбора даты в WordPress 4.2.1 Шаблоны для мобильных сайтов Loop для извлечения 3 экземпляров post_thumbnail из 3 последних пользовательских типов сообщений, называемых «портфель», Удалить порядковый номер из постоянных ссылок случайный p-тэг в расширенных настраиваемых полях? удалить форму поиска edit.php и заменить на мою собственную WP Query для получения всех сообщений (в том числе в черновом / ожидающем обзоре) Как получить измененный заголовок сообщения в моем настраиваемом плагине, который запускается при вызове 'save_post'? WordPress tinyMCE Keep Wrapping <p> Теги для HTML-кодов при сохранении Как объединить несколько сайтов в WordPress MU если содержимое СРТ пуст, тогда

Объяснение update_post_ (meta / term) _cache

Я читал некоторые лучшие практики из 10up, и они упоминают установку этих двух флагов в false в WP_Query (в зависимости от того, что вы запрашиваете):

  • 'update_post_meta_cache' => false : полезно, когда post meta не будет использоваться.
  • 'update_post_term_cache' => false : полезно, если термины таксономии не будут использоваться.

Я предполагаю, что он использует что-то вроде update_post_caches() но я даже не уверен, что это значит. Может ли кто-нибудь объяснить, что означают эти два флага в WP_Query и насколько они полезны? Чем больше информации, тем лучше, поскольку я не знаю много о том, как WordPress кэширует вещи, но хорошо продуманный ответ на эти два флага также является приемлемым.

Solutions Collecting From Web of "Объяснение update_post_ (meta / term) _cache"

Кэш объектов везде

WordPress пытается максимально сократить количество запросов к базе данных.

Например, в любое время, когда вы получаете мета-поле или поле таксономии, перед запросом базы данных WordPress выглядит, если это уже было запрошено и хранится в кеше, и возвращает его туда вместо запроса в базу данных.

«Кэш-задание» выполняется с помощью классов WP_Object_Cache и wp_cache_* (которые являются оболочками для методов этого класса).

Где живет кеш

По умолчанию «кеш» – это не что иное, как глобальная переменная PHP. Это означает, что оно находится в памяти, но также означает, что оно исчезает по каждому запросу.

Однако через dropins ( advanced-cache.php и / или object-cache.php ) можно настроить собственный способ обработки этого кеша.

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

По этой причине среди людей WP они известны как плагины «постоянного кэша» (даже если за пределами пузыря слова «кеш» и «постоянный» не имеют большого смысла).

Популярным выбором в настоящее время являются Memcached или Redis .

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

Некоторые примеры

 $foo = get_post_meta('foo', $post_id, true); // a lot of code in the middle $bar = get_post_meta('bar', $post_id, true); 

2 строки кода выше вызовут максимум 1 запрос к базе данных.

Фактически, когда вы запрашиваете настраиваемое поле, все поля для этой записи извлекаются из базы данных, кэшируются через кеш объектов, а последующие запросы извлекают данные из кеша, а не из db.

То же самое происходит для терминов таксономии, WordPress вытягивает все термины для таксономии один раз, а затем возвращает их из кеша.

Кэш объектов используется очень широко в WordPress. Не только для сообщений, метазначений и таксономий, но также для пользователей, комментариев, данных темы …

Что WP_Query связано со всем этим?

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

Поэтому, когда вы вызываете, например, get_the_terms() или get_post_meta() то время как записи цикла, полученные через WP_Query , фактически не запускают какой-либо запрос к базе данных, а извлекают информацию из кеша.

Ницца, это не так?

Ну, да, но это связано со стоимостью.

Обновление кеша «магия», которое делает WordPress, когда сообщения о WP_Query через WP_Query происходят в update_meta_cache для мета и в update_object_term_cache для таксономий.

Если вы посмотрите на исходный код этих функций, вы увидите, что WordPress выполняет только один запрос db в каждой функции, но также выполняет большую обработку. Например, в update_object_term_cache есть 7 вложенных foreach … если у вас много таксономий, а число сообщений на странице велико, это не очень хорошо.

О тех аргументах WP_Query , наконец

То, что 'update_post_meta_cache' и 'update_post_term_cache' делает, когда установлено значение « false – это запретить WordPress обновлять кеш для настраиваемых полей и таксономии соответственно.

В этом случае при первом запросе пользовательского поля или таксономии запускается запрос базы данных, а данные кэшируются.

Это стоит того?

Как обычно, ответ зависит от этого . Большую часть времени, чтобы установить эти значения в значение false , является хорошим выбором, поскольку он предотвращает ненужную обработку и запросы к базе данных, если это не требуется, и кеш обновляется в любом случае, когда требуются пользовательские условия поля / таксономии.

Однако, если вы собираетесь вызывать даже один раз get_post_meta() во время цикла, и вы будете называть get_the_terms() для всех (или большинства) таксономий, поддерживаемых сообщениями, тогда обновление кеша запускается в любом случае, и там может быть никакой фактической выгоды при установке аргументов запроса на false .

Основная интересная функция здесь – функция update_post_caches . Он вызывается после того, как WP_Query получил все сообщения из БД. Обычно причиной, по которой вам нужны сообщения, является отображение их, что обычно означает отображение терминов и что-то на основе метаданных, поэтому WP_Query также по умолчанию запрашивает БД для мета и термина данных, связанных с возвращенными сообщениями и сохраняет его в кеше *. Эта информация явно не доступна в данных, возвращаемых WP_Query, но когда вы вызовете соответствующие API-интерфейсы для получения термина и метаинформации определенной записи, она уже будет доступна в памяти, и нет необходимости отправлять новую запрос к БД.

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

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

* cache. Наиболее важным здесь является кеш памяти, в котором WP хранит все, что он получает из БД, даже без активного плагина кэширования объектов. Очевидно, что когда у вас есть кэширование объектов, информация также будет храниться там.