WordPress 6.4 新增一组选项相关的函数
WordPress 6.4 引入一组与选项(option)相关的函数,主要是为了解决自动加载的选项相关的性能和其他一些问题。
自动加载选项的问题
首先 WordPress 的选项默认是自动加载的,这是基于 add_option()
和 update_option()
函数的 $autoload
参数的默认值,但是自动加载过多的选项也会造成一些问题,首先可能造成服务器响应时间过长,以及在使用持久化对象缓存时可能时不时会出现 bug。
为了帮助插件开发者更好地管理他们插件的选项和性能,以及是否自动加载这些选项,WordPress 6.4 引入了以下两组函数:
wp_prime_option_caches()
和相关的封装函数可以通过一条 SQL 查询就能获取多个选项。wp_set_option_autoload_values()
和相关的封装函数可以用来更新一个或多个特定选项的自动加载值。
一条 SQL 获取多个选项的新函数
首先介绍 wp_prime_option_caches( $options )
函数,它的参数是一组选项名的数组,它可以先检测这些选项是否已经在内存中,如果还有未缓存的选项,它只通过一条 SQL 查询就能全部获取,这样在随后使用 get_option()
调用这些选项的时候,就不会触发单独的 SQL 查询。
wp_prime_option_caches( $options )
函数不会返回这一组选项的值,该函数的唯一的职责就是更新相关的选项的缓存。不过 WordPress 6.4 也提供一次获取多个选项的值函数:get_options( $options )
,它其实是先调用 wp_prime_option_caches()
更新这组选项的缓存,然后对每个选项调用 get_option()
来获取其值,最后返回一个选项名及其值的关联数组。
第三个同样重要的函数是 wp_prime_option_caches_by_group()
,可以用它来预加载特定选项组(option_group 函数 register_setting()
函数的强制要求的第一个函数),插件开发者可以用它来获取插件使用的特定选项组的所有选项。
上面这三个函数不仅可以作为从数据库查询多个选项的高效方法,也可以在一些特定领域自动加载选项的替代方法,比如一个插件只在后台界面需要使用一些选项,那么建议使用 wp_prime_option_caches()
后者 wp_prime_option_caches_by_group()
来获取这些选项,而不是全局自动加载它们。
举个例子🌰
假设某个插件有四个选项:“myplugin_foo”、 “myplugin_foo”、“myplugin_bar”、“myplugin_foobar” 和 “myplugin_barfoo”,并且这四个选项仅在后台某个界面上使用,因此不应该全局自动加载这四个选项,就是说,在对这些选项进行新增和更新操作时,相应的 add_option()
和 update_option()
函数调用时$autoload
参数应该设置为 false
。
function myplugin_prime_admin_screen_options() {
/*
* 通过预加载选项,当稍后调用 get_option() 时,将不会有更多的 SQL 查询。
*/
wp_prime_option_caches(
array('myplugin_foo', 'myplugin_bar', 'myplugin_foobar', 'myplugin_barfoo');
);
}
add_action( 'admin_menu', function(){
$hook_suffix = add_menu_page( /* Menu page arguments. */ );
add_action("load-{$hook_suffix}", 'myplugin_prime_admin_screen_options');
});
这段代码将确保这些选项通过一条数据库查询就被获取,任何后续对这些选项的 get_option()
调用都将不会触发另外数据库查询,因此非常快。
为了让大家更加对这些函数了解更加清晰,插件选项的缓存更新可以依赖于一个单一注册这些选项时使用的选项组,这样无需维护确切选项的列表,这种方法优化了代码的可维护性和可读性,因为所有的选项注册和自动加载的逻辑都集中在一个地方:
add_action('init', function(){
register_setting('myplugin_admin_screen', 'myplugin_foo', array( /* 注册参数 */ ));
register_setting('myplugin_admin_screen', 'myplugin_bar', array( /* 注册参数 */ ));
register_setting('myplugin_admin_screen', 'myplugin_foobar', array( /* 注册参数 */ ));
register_setting('myplugin_admin_screen', 'myplugin_barfoo', array( /* 注册参数 */ ));
});
function myplugin_prime_admin_screen_options() {
/*
* 通过预加载选项,当稍后调用 get_option() 时,将不会有更多的 SQL 查询。
*/
wp_prime_option_caches_by_group('myplugin_admin_screen');
}
add_action( 'admin_menu', function(){
$hook_suffix = add_menu_page( /* Menu page arguments. */ );
add_action("load-{$hook_suffix}", 'myplugin_prime_admin_screen_options');
});
设置选项自动加载值的新函数
wp_set_option_autoload_values( array $options )
函数的参数是一个关联数组,数组的键是选项名,值是要设置的自动加载值,然后也是只需一条 SQL 就更新这些选项的自动加载值,当然为了方便使用,也增加以下两个相关的封装函数:
wp_set_options_autoload( $options, $autoload )
用于对多个选项设置相同的自动加载值。wp_set_option_autoload( $option, $autoload )
用于设置单个选项的自动加载值。
这些函数在插件停用的钩子中很有用,插件停用后,相关的选项不再使用,但是直到用户决定卸载插件之前,不应该从数据库中删除这些选项。
继续例子🌰
这次例子,我们假设插件有两个选项,分别是 “myplugin_foo” 和 “myplugin_bar”,并且它们在各种前端页面中使用,因此默认全局自动加载,可以在插件激活和停用的时候,将这两个选项自动加载的值设置为 'yes'
或 'no'
:
register_activation_hook( __FILE__, function(){
wp_set_options_autoload(array('myplugin_foo', 'myplugin_bar'), 'yes' );
});
register_deactivation_hook( __FILE__, function(){
wp_set_options_autoload(array('myplugin_foo', 'myplugin_bar'), 'no' );
});
WPJAM Basic 和选项设置
WPJAM Basic 以及其相关的设置页面开发对选项存储是一个页面所有的选项都存储在一个选项中,所以 WPJAM Basic 和 WPJAM 其他插件虽然设置页面很多选项,但是实际存储到数据库中的选项,并没有太多,所以不会对 WordPress 造成性能问题。
不过 WordPress 这些选项对开发来说,还是很方便,在一些场景下,也能够提高开发的效率。