是的,theme_mod函数的响应速度会变慢,但不会明显变慢,其好处大于差异。
主题模块存储为选项。因此,从本质上讲,theme_mod函数是options函数的包装器。
首先,要了解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选项,然后再次get_option
调用以再次获取主题名称,然后update_option
使用现在更改的全套选项。这会导致数据库更新,并且它发送大量数据的事实确实可能导致显着的速度下降。更新几个字节比更新较大的行更快。但通常不会如您所愿。除非您有很多设置...
当然,主题mod函数可能应该从总体上进行优化,但是由于子主题,您仍然应该使用它们而不是get_option等。
直接使用选项行的问题在于,您直接使用它们并为设置使用特定的键名。
如果我有一个名为“ AAA”的主题,并且将其子主题为“ BBB”供其他站点使用,那么我的“ AAA”主题可能会使用一个名为“ example”的选项。当我更新一个站点并更新了我的选项时,该选项现在将应用于我的子主题。如果我不想这样做怎么办?如果我希望子主题使用一组不同的选项设置怎么办?
通过将主题的实际名称(而不是硬编码值)作为键的一部分,主题模块可以确保站点上的每个“主题”都使用自己的一套设置。我可以来回切换,并且设置不会在它们之间转移,它们仍然是我的设置方式。更简单,更明显,更直观。
而且,如果将来有一些核心更改或插件修改了theme_mods的工作方式,那么您将无需任何更改即可自动获得好处。包装器总是会变慢,这是不可避免的,这是包装器的本质。但是,您仍在编写PHP代码,而不是机器语言。我们使用这样的包装器来简化事情并分离功能。主题无需了解或关心其选项如何存储在数据库中或命名如何工作。theme_mod函数提供了更简洁的解决方案。
/wp-includes
,在option.php
那里get_option()
被定义,并在theme.php
那里get_theme_mod()
被定义,你可以看到,后者实际上调用get_option()
本身,作为它的一个扩展,它也适用于任何必要的过滤器。可以解释为什么它变慢了。