• Коллеги, приветствую!

    Есть у кого соображение, зачем после

    SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'

    делается запрос

    SELECT option_value FROM wp_options WHERE option_name = 'rewrite_rules' LIMIT 1

    При отключенных реврайтах эта строка отсутствует в БД.

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Соображений нет. Впрочем, и запроса такого тоже нет. Зато есть куча других сомнительных запросов опций от 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


    лан, на досуге разберемся )

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Предлагаю изменить строку 77 на:
    if ( false === $value && 'rewrite_rules' != $option ) {

    Добавлять лишнюю проверку в функцию get_option(), которая может вызываться несколько десятков или сотен раз при загрузке страницы, разработчики не будут.

    Думаю, более правильным решением было бы при отключённых постоянных ссылках не удалять опцию rewrite_rules, а заменять на пустое значение.

    Написал в багтрекер: https://core.trac.wordpress.org/ticket/29107.

    Написал в багтрекер:

    Спасибо!

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Тема «Запросы в БД» закрыта для новых ответов.