如果停用插件,更改将存储在数据库中,因此在所有后续访问中,无论用于访问站点的设备是什么,插件都将停用。
它使用选项"active_plugins"
获取当前活动的插件。WordPress中的所有选项都可以使用"option_{$option}"
过滤器挂钩,在这种情况下"option_active_plugins"
.
你可能会想使用插件来过滤这个选项,但问题是,你想排除的插件可能是在你的插件之前加载的,因为你永远不能确定你的插件是先加载的。
解决方案是使用MU plugin 对于范围。
过早发布的MU插件在WordPress中运行得很早,这使您能够过滤"option_active_plugins"
选项
另一个问题是MU插件加载得很早,甚至在文件加载之前wp-includes/vars.php
包含函数的wp_is_mobile()
已加载,因此如果在MU插件中使用该函数,则会出现致命错误。
“手动”加载文件是not 选项,因为WordPress将使用require
而不是require_once
, 因此,如果您加载该文件,当WordPress再次加载它时,您会得到一个已定义函数的致命错误。
唯一的解决方案是再次写入wp_is_mobile()
, 只是从核心开始,使用不同的名称。
让我们编写代码创建PHP文件并保存在wp-content/mu-plugins
文件夹
首先,在此处编写一个函数,返回要为移动设备禁用的所有插件:
function my_non_mobile_plugins() {
return array(
// an array of all the plugins you want to exclude for mobile
\'plugin-folder/plugin-file.php\',
\'another-plugin-folder/another-plugin-file.php\',
\'no-folder-plugin-file.php\'
);
}
然后写一个克隆
wp_is_mobile()
函数,其他名称:
function my_is_mobile() {
$is_mobile = false;
if ( strpos($_SERVER[\'HTTP_USER_AGENT\'], \'Mobile\') !== false
|| strpos($_SERVER[\'HTTP_USER_AGENT\'], \'Android\') !== false
|| strpos($_SERVER[\'HTTP_USER_AGENT\'], \'Silk/\') !== false
|| strpos($_SERVER[\'HTTP_USER_AGENT\'], \'Kindle\') !== false
|| strpos($_SERVER[\'HTTP_USER_AGENT\'], \'BlackBerry\') !== false
|| strpos($_SERVER[\'HTTP_USER_AGENT\'], \'Opera Mini\') !== false
|| strpos($_SERVER[\'HTTP_USER_AGENT\'], \'Opera Mobi\') !== false
) {
$is_mobile = true;
}
return $is_mobile;
}
最后,过滤器
\'option_active_plugins\'
利用前面的函数检查是否删除插件
add_filter( \'option_active_plugins\', \'my_disable_plugins_for_mobiles\' );
function my_disable_plugins_for_mobiles( $plugins ) {
if ( ! my_is_mobile() ) {
return $plugins; // for non-mobile device do nothing
}
$not_allowed = my_non_mobile_plugins(); // get non allowed plugins
return array_values( array_diff( $plugins, $not_allowed ) );
}