首先,你应该知道$_SERVER[\'HTTP_USER_AGENT\']
是not 完全可靠,因为其输出基于http请求User-Agent
标题,因此它很容易被忽略或隐藏。
也就是说,请确保您的方法将检测到大多数移动请求,但请注意,mayority并不是全然的。
现在,您知道当前主题基本上基于一个选项:template
(如果有活动的子主题,则选项为stylesheet
). 此选项包含主题的slug(通常是主题文件夹名称)。
什么switch_theme
正在更新该选项,所以在数据库上运行查询。此外,您还需要运行该功能,即使默认主题(在admin中设置)是非移动主题,并且请求来自非移动主题。
优化的解决方案是对选项使用快捷过滤器:"pre_option_{$option}"
, 这是在获取任何选项之前激发的,如果挂接的函数返回非false值,则该值将在不进行任何数据库查询的情况下返回。
这有两个优点:
当需要输出非默认主题时,无需运行任何db查询。当需要使用默认主题时,无需执行任何操作。代码非常简单,只有3行:
if( wp_is_mobile() ) {
add_filter( \'pre_option_template\', function() { return \'theme_mobile\'; } );
add_filter( \'pre_option_stylesheet\', function() { return \'theme_mobile\'; } );
}
我用过
wp_is_mobile
函数为了简单起见,它不是百分之百可靠的,但如何在第一行说,没有使用
$_SERVER[\'HTTP_USER_AGENT\']
100%可靠。
请注意:
如果移动主题是子主题(移动和非移动的父主题都相同),则必须使用\'pre_option_stylesheet\'
由于使用闭包,我的代码需要PHP 5.3以上