Способ увеличения производительности при чтении метаданных записей
Если плагину приходится в цикле читать метаданные для большого количества записей, можно увеличить производительность путём использования функции update_postmeta_cache()
.
Например, такой код
if (false == empty($all_posts)) :
foreach ($all_posts as $id) :
$caps = get_post_meta($id, '_disclosesecret_cap');
//...
endforeach;
endif;
потребует выполнения n дополнительных запросов, где n — число выбраннных записей.
Код можно сделать гораздо эффективнее, добавив всего одну строку:
if (false == empty($all_posts)) :
update_postmeta_cache($all_posts);
foreach ($all_posts as $id) :
$caps = get_post_meta($id, '_disclosesecret_cap');
//...
endforeach;
endif;
В этом случае понадобится один дополнительный запрос.
Техническая информация: get_post_meta()
вызывает update_postmeta_cache()
, если метаинформация не найдена во внутреннем кэше (группа post_meta
, ключ $id
— уникальный идентификатор записи). Так как update_postmeta_cache()
читает все метаданные для указанных записей, получаем пенальти в одно обращение к базе данных на уникальную запись.
update_postmeta_cache()
в качестве параметра принимает либо строку (список идентификаторов записей, разделённых запятой), либо массив. "Стоимость" вызова данной функции составляет один запрос к базе данных на весь набор параметров.
Побочные эффекты: если длина SQL-запроса превысит значение переменной max_allowed_packet
(для MySQL), запрос к базе данных завершится ошибкой.