仅为移动设备停用插件

时间:2014-10-19 作者:c64girl

我试着用deactivate_plugins 用于仅为移动设备停用插件的函数。

它起作用了:当我在手机上进入站点时,插件被停用,但当我在PC上进入站点时,插件也被停用。

有没有办法不停用插件,而只禁用手机插件?

function deactivate_plugin_conditional() {
  if ( wp_is_mobile() ) {
    deactivate_plugins( array(\'/first-plugin/first.php\', \'/second-plugin/second.php\') );    
  }
}

add_action( \'admin_init\', \'deactivate_plugin_conditional\' );

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

如果停用插件,更改将存储在数据库中,因此在所有后续访问中,无论用于访问站点的设备是什么,插件都将停用。

使用以下方法检索WordPress中的活动插件wp_get_active_and_valid_plugins() 作用

它使用选项"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 ) );

}

SO网友:Violet Raindrops

我这样做的方式是简单地隐藏插件位(如果插件用于显示额外信息,例如社交媒体选项卡,则此操作有效)。

我只是用Chrome中的开发人员工具查看我想隐藏的div,然后在我自己的CSS中添加了如下规则:

@media screen and (max-width: 767px) {
   div#nameOfDiv {
       display: none;
   }
}

结束