Запросы в БД
-
Коллеги, приветствую!
Есть у кого соображение, зачем после
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'делается запрос
SELECT option_value FROM wp_options WHERE option_name = 'rewrite_rules' LIMIT 1При отключенных реврайтах эта строка отсутствует в БД.
-
Соображений нет. Впрочем, и запроса такого тоже нет. Зато есть куча других сомнительных запросов опций от twentyfourteen.
Впрочем, и запроса такого тоже нет.
Запроса этого нет в том случае, если «красивые ссылки» установлены.
И меня терзают сомнения в его «такой» необходимости..
ЧПУ включено (
/%postname%/), а запроса нет. Есть одинFROM wp_options:SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'(WordPress 3.9.1 с темой оформления Twenty Twelve. Плагин Debug Bar.)
И не должно быть, ибо опция rewrite_rules имеет флаг autoloadЮрий, так я про то и говорю:
Если есть эта строкаrewrite_rules, то она имеется в результатах первого запроса и второго запроса не делается.А если ее нет (пермалинки отключены), то зачем-то делается второй запрос.. Вот я и думаю о его целесообразности..
В коде пока не смотрел, может там комментарии какие есть, но интерес уже переходит из статуса «спортивный» в «О_о» :))
Я бы поставил вопрос иначе: не «зачем», а «кем» 😉
а «кем» 😉
Так то понятно.. Чистым WP 🙂 Даже темы нет. Склоняюсь к варианту «зачем» 😀
Под «кем» можно подразумевать и внутреннюю функцию 🙂
Как я понял, западло кроется в том, что при отключении ЧПУ WP тупо грохает опцию
rewrite_rulesвместо того, чтобы просто очистить. В результате строка$this->rules = get_option('rewrite_rules');функции wp_rewrite_rules() делает лишний запрос в базу.
Повозился сначала с
wp_rewrite_rules. В-общем, ситуация там запутанная, если кратко :-). А вот сget_option()более-менее все понятно.
https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-includes/option.php#L25
Если блог установлен, то проверяется наличие опцииisset(..'rewrite_rules')в строке 72, а ее нет по причине отсутствия 🙂 (не ставили мы ЧПУ).Затем, в блоке «отсутствия» происходит попытка взять опцию из кеша в строке 75, но ее и там нет.
В третьем блоке (строки 77-78) происходит попытка выборки данной опции еще раз путем отдельного запроса в БД.. Вот здесь и возникает недоразумение, по-моему..Предлагаю изменить строку 77 на:
if ( false === $value && 'rewrite_rules' != $option ) {Да и со страницами тоже необъяснимое творится..
[1]SELECT ID, post_name, post_parent, post_type FROM wp_posts WHERE post_name IN ('bla') AND post_type IN ('page','attachment') [2]SELECT * FROM wp_posts WHERE ID = 7 LIMIT 1 [3]SELECT ID, post_name, post_parent, post_type FROM wp_posts WHERE post_name IN ('bla') AND post_type IN ('page','attachment')Наверное у меня двоится в глазах уже, но я вижу, что 1 и 3 запросы полностью идентичны..
А может я не тот PHP использую, раз тут много лишнего 😀Весь лог приводить не стал, вокруг-да-около ~5 запросов ). А всего-лишь внутри
is_page—
лан, на досуге разберемся )Предлагаю изменить строку 77 на:
if ( false === $value && 'rewrite_rules' != $option ) {Добавлять лишнюю проверку в функцию
get_option(), которая может вызываться несколько десятков или сотен раз при загрузке страницы, разработчики не будут.Думаю, более правильным решением было бы при отключённых постоянных ссылках не удалять опцию
rewrite_rules, а заменять на пустое значение.Написал в багтрекер: https://core.trac.wordpress.org/ticket/29107.
Написал в багтрекер:
Спасибо!
Тема «Запросы в БД» закрыта для новых ответов.