答案是肯定的,theme\\u mod的功能会比较慢,但不会太明显,而且好处大于区别。
主题mod存储为选项。因此,本质上,theme\\u mod函数是围绕options函数的包装器。
首先,了解theme\\u mod设置存储为单个选项中的数组,并键入特定的主题名称。因此,如果我这样做:
set_theme_mod(\'aaa\',123);
set_theme_mod(\'bbb\',456);
然后,我在数据库中实际得到的是一个名为theme\\u mods\\u themename的选项行,其中包含一个序列化数组,其中包含(\'aaa\'=>123,\'bbb\'=>456)。
现在get_theme_mod
会慢一些,因为它实际上是两个get_option
呼叫。首先,它获取主题的名称。然后,它得到theme_mods_themename
选项所以这就是50%的速度损失。剩下的工作主要是在过滤器中完成的,因为有一个额外的过滤器调用,但是除非你在过滤器上有什么东西,否则这是微不足道的。
请注意,选项系统将检索到的数据存储在对象缓存中,因此它不会在此处进行多个数据库调用。只有第一次使用才会导致数据库命中。
这个set_theme_mod
会稍微慢一些,因为它会进行相同的两个get option调用,然后再进行另一个get_option
调用以再次获取主题名称,然后它会update_option
拥有全套现已更改的选项。这会导致数据库更新,而它发送更多数据的事实确实会导致明显的速度减慢。更新几个字节比更新较大的行快。但通常不会像你注意到的那么多。除非你有很多设置。。。
当然,theme mod函数可能需要进行总体优化,但您仍然应该使用它们,而不是get\\u选项,因为这是子主题。
直接使用选项行的问题是,您直接使用选项行,并且为设置使用特定的键名称。
如果我有一个名为“AAA”的主题,并且我为它创建了一个名为“BBB”的子主题,以便在另一个站点上使用,那么我的“AAA”主题可能会使用一个名为“示例”的选项。当我更新一个站点时,它会更新我的选项,那么现在相同的选项将应用于我的子主题。如果我不想让它这样做呢?如果我想让子主题使用一组不同的选项设置,该怎么办?
主题mods,通过将实际的主题名称(而不是硬编码的值)作为键的一部分,确保站点上的每个“主题”都使用自己的设置集。我可以来回切换,设置不会在它们之间转移,而是保持我设置的方式。更简单、更明显、更直观。
如果将来有一些核心更改或插件修改了theme\\u mods的工作方式,那么您将在不做任何更改的情况下自动获得这些好处。包装器总是会变慢,这是不可避免的,这是包装器的本质。尽管如此,您仍然在编写PHP代码,而不是机器语言。我们使用这样的包装器来简化事情和分离功能。主题不需要知道或关心其选项如何存储在数据库中,或命名如何工作。theme\\u mod函数提供了更简单、更干净的解决方案。