Я использовал в get_theme_mod()
течение некоторого времени в различных моих проектах. Я решил воспользоваться API настройки темы в WordPress v3.4, как только он стал доступен, так как я чувствовал, что это необходимый инструмент для моих клиентов.
Через некоторое время я начал замечать, что мои сайты чувствовали себя немного более вялыми, чем обычно, и, в частности, настройщик загружался довольно долго. Из-за большого количества проб и ошибок во время моего исследования, я решил попробовать отключить type
при регистрации мои настройки (т.е. $wp_customize->add_setting()
) из theme_mod
в option
.
Как только я сделал это и поменял все свои get_theme_mod()
вызовы на get_option()
, я заметил очень значительное увеличение скорости при использовании последней настройки в отличие от первой на внешнем интерфейсе и особенно в настройщике на внутреннем интерфейсе. Я просматривал ядро WordPress, пытаясь найти ответ на вопрос, почему это так, но, похоже, не могу понять, что такое зависание в этом сценарии.
Любое понимание, которое сообщество может иметь в отношении get_option()
выполнения значительно быстрее, чем get_theme_mod()
было бы высоко ценится.
/wp-includes
на то,option.php
гдеget_option()
определено, иtheme.php
гдеget_theme_mod()
определено, вы увидите, что последний фактически вызываетget_option()
себя, действуя как его расширение, которое также применяет любые необходимые фильтры. Не могли бы объяснить, почему это медленнее.get_option()
и применение некоторых фильтров, которые не должны замедлять его так значительно, как это было раньше. Конечно, отличная отправная точка, но мне интересно, нет ли здесь чего-то еще в работах.get_theme_mod()
доget_option()
скорости всех проектов в два раза в среднем на обоих веб - интерфейсе и в настройщика. Это было единственное изменение, которое было сделано в попытке изолировать его от любых других побочных эффектов.Ответы:
Ответ: да, функции theme_mod будут работать медленнее, но незначительно, а преимущества перевешивают различия.
Тематические моды хранятся в виде опций. Итак, по сути, функции theme_mod являются обертками для функций параметров.
Во-первых, следует понимать, что настройки theme_mod хранятся в виде массива в одной опции, привязанной к конкретному названию темы. Итак, если я сделаю это:
Тогда то, что я на самом деле получаю в базе данных, это одна строка опций с именем theme_mods_themename, которая содержит сериализованный массив с ('aaa' => 123, 'bbb' => 456) в нем.
Теперь
get_theme_mod
будет медленнее, потому что он на самом деле делает дваget_option
звонка. Во-первых, он получает название темы. Затем он получаетtheme_mods_themename
возможность. Так что тут потеря скорости 50%. Остальная часть проделанной работы заключается в основном в фильтрах, в том, что есть дополнительный вызов фильтра, но если у вас нет чего-то в этом фильтре, это довольно незначительно.Обратите внимание, что система опций сохраняет извлеченные данные в кеше объектов, поэтому здесь не нужно выполнять несколько вызовов базы данных. Только первое использование приводит к попаданию в базу данных.
Это
set_theme_mod
будет несколько медленнее, потому что он делает те же самые два вызова get options, затем делает еще одинget_option
вызов, чтобы снова получить имя темы, а затем делает этоupdate_option
с полным набором теперь измененных параметров. Это вызывает обновление базы данных, и тот факт, что она отправляет намного больше данных, действительно может быть причиной заметного замедления. Обновление нескольких байтов происходит быстрее, чем обновление строки большего размера. Но обычно не так много, как вы заметили. Если у вас нет чертовски много настроек ...Функции мода темы, вероятно, должны быть оптимизированы в целом, но, тем не менее, вы все равно должны использовать их вместо get_option и так далее, потому что дочерние темы.
Проблема с использованием строк параметров напрямую заключается в том, что вы используете их напрямую и используете конкретные имена ключей для своих настроек.
Если у меня есть тема под названием «AAA» и я создаю дочернюю тему под названием «BBB» для использования на другом сайте, тогда моя тема «AAA» может использовать параметр с именем «example». Когда я обновляю один сайт, и он обновляет мой параметр, то этот же параметр теперь будет применяться к моей дочерней теме. Что если я не хочу этого делать? Что, если я хочу, чтобы дочерняя тема использовала другой набор параметров?
Тематические моды, включая фактическое название темы (а не жестко заданное значение) как часть ключа, гарантируют, что каждая «тема» на сайте использует свой собственный набор настроек. Я могу переключаться вперед и назад, и настройки не передаются между ними, они остаются такими, как я их установил. Проще, понятнее, понятнее.
И если какое-то будущее изменение ядра или плагин изменят работу theme_mods, то вы автоматически получите преимущества без каких-либо изменений. Обертки всегда будут медленнее, это неизбежно, это природа оберток. Тем не менее, вы все еще пишете код PHP, а не машинный язык. Мы используем такие обертки, чтобы упростить вещи и разделить функциональность. Темы не должны знать или заботиться о том, как их параметры хранятся в базе данных или как работает именование. Функции theme_mod обеспечивают более простое решение, которое чище.
источник
get_theme_mod
это просто обертка вокругget_option
. Теоретически, поскольку это еще один уровень абстракции, он будет работать медленнее, но на практике разница не должна быть достаточно большой, чтобы ее заметил человек.Реальные различия в скорости могут быть вызваны, если у вас есть какой-то медленный код, подключенный к хукам theme_mod.
источник
Может ли что-то происходить в настройщике тогда? Я вижу то же самое, что и ОП здесь.
Я могу подтвердить, что примерно с 30 опциями время загрузки в настройщик уменьшилось с 3 до примерно 5 с при переключении на
get_option
болееget_theme_mod
Вызывая методы напрямую, я вижу разницу в 2 мс.
( https://gist.github.com/anonymous/d98a46d00d52d40e7dec )
Это может быть незаметно при непосредственном сравнении API, но должно быть что-то с тем, как они используются в Customizer.
источник
Вы можете проверить время из
get_option
(100 итераций) с помощью этого кода (поставитьfunctions.php
или где - нибудь):Другие мысли
Я не знаю, если это будет иметь значение (возможно, разработчики Wordpress знают это лучше), но я подумал, что если у сайта высокий трафик, и при каждой загрузке страницы ему нужно получить сотни вариантов, то что, если я присоединюсь? много вариантов в одном
get_option
? как это:тогда :
это сделает сайт немного быстрее?
источник
TL; DR: если вы разработчик темы, вы должны использовать get_theme_mod
Полный ответ:
Если у вас есть 100 вызовов get_option, он принимает 100 запросов к вашей базе данных.
Если у вас есть 100 вызовов get_theme_mod, это займет всего 1 запрос к вашей базе данных.
Почему? Поскольку все моды темы хранятся в одной строке базы данных и будут называться только одной, в то время как каждая опция является строкой, и 100 вызовов get_option приведут к 100 запросам к базе данных и, конечно, это замедлит работу вашего сайта.
Если ваша тема имеет много опций, использование get_theme_mod значительно уменьшит количество запросов к базе данных.
Вы можете проверить производительность и количество запросов с помощью плагина Query Monitor.
источник