Ответ: да, функции theme_mod будут работать медленнее, но незначительно, а преимущества перевешивают различия.
Тематические моды хранятся в виде опций. Итак, по сути, функции theme_mod являются обертками для функций параметров.
Во-первых, следует понимать, что настройки theme_mod хранятся в виде массива в одной опции, привязанной к конкретному названию темы. Итак, если я сделаю это:
set_theme_mod('aaa',123);
set_theme_mod('bbb',456);
Тогда то, что я на самом деле получаю в базе данных, это одна строка опций с именем 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 обеспечивают более простое решение, которое чище.
/wp-includes
на то,option.php
гдеget_option()
определено, иtheme.php
гдеget_theme_mod()
определено, вы увидите, что последний фактически вызываетget_option()
себя, действуя как его расширение, которое также применяет любые необходимые фильтры. Не могли бы объяснить, почему это медленнее.