WordPress 功能相近的两个插件互相冲突的如何解决办法

雪花在空中嬉戏着、飞舞着,它净化了世间的一切尘埃,送走了严冬的寂寞,它自由地来,潇洒地去,多少著名的诗词都赞美过它: "忽如一夜春风来,千树万树梨花开 ",多么俏丽呀! "瑞雪兆丰年 ",它还是丰收的预言家呢!

本文要介绍的是如何解决Wordpress插件冲突的问题。

索凌网络之前有一篇文章介绍了如何判断依附插件是否被启用的问题(例如,在作为WooCommerce扩展的插件中,就要判断当前网站的Woocommerce是否启用了),文章链接:http://suoling.net/is_woocommerce_activated/

现在开始说正事儿:

首先,我们要引入一个Wordpress核心文件:

1
2
3
4
5
/*  避免 current_user_can 不可用的问题 */
if ( !function_exists( 'wp_get_current_user' ) ) {
	if ( file_exists(ABSPATH.'wp-includes/pluggable.php') ) require_once( ABSPATH.'wp-includes/pluggable.php' );
	if ( file_exists(ABSPATH . 'wp-admin/includes/plugin.php') ) require_once(ABSPATH . 'wp-admin/includes/plugin.php');
}

/* 避免 current_user_can 不可用的问题 */ if ( !function_exists( 'wp_get_current_user' ) ) { if ( file_exists(ABSPATH.'wp-includes/pluggable.php') ) require_once( ABSPATH.'wp-includes/pluggable.php' ); if ( file_exists(ABSPATH . 'wp-admin/includes/plugin.php') ) require_once(ABSPATH . 'wp-admin/includes/plugin.php'); }

然后,我们需要在插件中定义Wordpress后台初始化Hook函数,以禁用插件自身,以免网站报错。在这个函数中,我们需要判断当前用户是否可以启用插件,如果可以,那么与该插件冲突的插件是否已经被启用了;如果与该插件冲突的插件被启用了,就报个错误,禁用自身;如果与该插件冲突的是一个该插件的Lite版本,那么可以干脆的禁用掉它。下面以自制插件WP Youku(相当于Lite版本)和WP Youku Pro(相当于Pro版本)来说明问题:

在插件WP Youku中写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
add_action( 'admin_init', 'wp_youku_deactivate' );
function wp_youku_deactivate() {
    if ( current_user_can( 'activate_plugins' ) ) {
        if( is_plugin_active( 'wp-youku-pro/wp-youku-pro.php' ) ) {
            add_action( 'admin_notices', 'wp_youku_admin_notice' );
            deactivate_plugins( plugin_basename( __FILE__ ) );
            /*在Lite版本的插件中禁用掉Pro版本的插件是不合适的,所以下面我注释掉了*/
            //deactivate_plugins('wp-youku-pro/wp-youku-pro.php');
        }
    }
}
function wp_youku_admin_notice() {
   echo '<div class="error"><p><strong>WP Youku</strong> 未能启用,可能的原因是您已经启用了<strong>WP Youku Pro</strong>.</p></div>';
   /*进一步确认不可启用自身*/
   //if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] );
}

add_action( 'admin_init', 'wp_youku_deactivate' ); function wp_youku_deactivate() { if ( current_user_can( 'activate_plugins' ) ) { if( is_plugin_active( 'wp-youku-pro/wp-youku-pro.php' ) ) { add_action( 'admin_notices', 'wp_youku_admin_notice' ); deactivate_plugins( plugin_basename( __FILE__ ) ); /*在Lite版本的插件中禁用掉Pro版本的插件是不合适的,所以下面我注释掉了*/ //deactivate_plugins('wp-youku-pro/wp-youku-pro.php'); } } } function wp_youku_admin_notice() { echo '<div class="error"><p><strong>WP Youku</strong> 未能启用,可能的原因是您已经启用了<strong>WP Youku Pro</strong>.</p></div>'; /*进一步确认不可启用自身*/ //if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] ); }

在插件WP Youku Pro中写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
add_action( 'admin_init', 'wp_youku_pro_deactivate' );
function wp_youku_pro_deactivate() {
    if ( current_user_can( 'activate_plugins' ) ) {
        if( is_plugin_active( 'wp-youku/wp-youku.php' ) ) {
             add_action( 'admin_notices', 'wp_youku_pro_admin_notice' );
            /*禁用该插件对应的Lite版本*/
            deactivate_plugins('wp-youku/wp-youku.php' );
            /*是否禁用自身?作为Pro版插件,在与对应的Lite版冲突的时候,大可不必禁用自身,所以下面注释掉了,当然,也可以加上许可证检查步骤以确定是否禁用掉自身*/
            //deactivate_plugins( plugin_basename( __FILE__ ) );
        }
    }
}
function wp_youku_pro_admin_notice() {
  echo '<div class="error"><p>检测到您已经启用了<strong>WP Youku</strong>, <strong>WP Youku Pro</strong>已经禁用了它,请刷新本页面.</p></div>';
  //可以启用自身
  if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] );
}

add_action( 'admin_init', 'wp_youku_pro_deactivate' ); function wp_youku_pro_deactivate() { if ( current_user_can( 'activate_plugins' ) ) { if( is_plugin_active( 'wp-youku/wp-youku.php' ) ) { add_action( 'admin_notices', 'wp_youku_pro_admin_notice' ); /*禁用该插件对应的Lite版本*/ deactivate_plugins('wp-youku/wp-youku.php' ); /*是否禁用自身?作为Pro版插件,在与对应的Lite版冲突的时候,大可不必禁用自身,所以下面注释掉了,当然,也可以加上许可证检查步骤以确定是否禁用掉自身*/ //deactivate_plugins( plugin_basename( __FILE__ ) ); } } } function wp_youku_pro_admin_notice() { echo '<div class="error"><p>检测到您已经启用了<strong>WP Youku</strong>, <strong>WP Youku Pro</strong>已经禁用了它,请刷新本页面.</p></div>'; //可以启用自身 if ( isset( $_GET['activate'] ) ) unset( $_GET['activate'] ); }

这样,在先启用Lite版本,后启用Pro版本的时候,会在自动启用Pro版本并禁用自身之后给出提示;在先启用Pro版本,后启用Lite版本的时候,Lite版本的启用动作将是无效的,并给出一个提示:

以上是针对类型的Wordpress插件冲突的解决方案,如果是一般性的插件冲突,最后在禁用自身后给出友好的提示为好,这种情形的话,只需要删减上述代码放在你的插件中即可。

WP Youku下载地址:http://wordpress.org/plugins/wp-youku/

简单介绍:WP Youku可以以在文章/页面发布或页面上编辑器下方输入栏中直接输入输入优酷视频链接的方式在该文章/页面详情页面文章内容开头部分上方添加优酷视频,也可以以短代码的方式调用,支持iPad/iPhone上播放优酷视频。

到此这篇关于WordPress 功能相近的两个插件互相冲突的如何解决办法就介绍到这了。任何事情,坚持了就是神话,放弃了就是笑话!这个道理听起来很简单,但很多人却做不到,不停的选择,不停的放弃,回头却发现什么事都没做好,坚持,一定能遇到最美的自己,送给正在努力拼搏的我们!更多相关WordPress 功能相近的两个插件互相冲突的如何解决办法内容请查看相关栏目,小编编辑不易,再次感谢大家的支持!

您可能有感兴趣的文章
WordPress站点Gravatar头像前后台不显示的如何解决办法

WordPress做公司官网好吗?会不会显得档次很低?

WordPress主题需要支持https吗?WordPress站点如何如何实现https?

WordPress站点的页面/标签/分类URL地址如何添加.html?

WordPress站点更换了域名后数据库应该如何操作替换新旧域名?