停用wp版本上的插件

时间:2014-04-16 作者:Dannyw24

我目前正在创建一个主题选项页面,并正在使用此功能deactivate_plugins() 我正在运行wordpress 3.8.3,所以在插件中运行此代码应该可以卸载它。

问题

1、我是否错误地使用了此功能?2、由于Wordpress的4.0版本不存在,逻辑不起作用吗?

 register_activation_hook( __FILE__, \'dw_deactivate_theme_options\' ); // activate hook

    function dw_deactivate_theme_options() {
        if ( version_compare( get_bloginfo(\'version\'), \'4.0\', \'<\') )  { // check the version
            deactivate_plugins( basename( __FILE__ ) ); // deactivate this plugin if the version is lower then 3.8
        }
    }
完整插件代码

<?php

/*
Plugin Name: Theme Settings
Plugin URI: xxx
Description: This Plugin will generate all of the theme options, Social Media, Logo, Google analytics.
Version: 0.0.1
Author: xxx
Author URI: xxx
License: GPL2
*/

/*
Function Reference 
plugins_url() - Full plugins directory URL (for example,http://example.com/wp - content/plugins )
register_activation_hook(); Hook to add settings before plugin activation 2nd parem is callback function


*/

//Preset plugin functions

register_activation_hook( __FILE__, \'dw_deactivate_theme_options\' ); // activate hook

function dw_deactivate_theme_options() {
    if ( version_compare( get_bloginfo(\'version\'), \'4.0\', \'<\') )  { // check the version
        deactivate_plugins( basename( __FILE__ ) ); // deactivate this plugin if the version is lower then 3.8
    }
}

add_action(\'admin_menu\', \'dw_theme_options_create_menu\');

function dw_theme_options_create_menu() {
    //create custom top-level menu
    add_menu_page(\'Theme Options\', \'Theme Settings\', \'manage_options\', __FILE__, \'dw_theme_options_cb\');
}

function dw_theme_options_cb() {
    echo \'<img src"\' .plugins_url( \'img/theme_icon.png\', __FILE__ ) . \'">\'; // ?>
        <h2>Theme Settings</h2>
    <?php echo get_bloginfo(\'version\'); ?>
<?php } ?>

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

问题是not version_compare, 问题是register_activation_hook 只是

add_action( \'activate_\' . $file, $function );
在哪里$fileplugin_basename( __FILE__ );__FILE__ 是主插件文件的绝对路径。

因此,您的代码所做的是调用dw_deactivate_theme_options() 当操作\'activate_\' . $plugin 已启动。

但此操作是在插件激活之前,即在插件添加到选项之前启动的\'active_plugins\'.

简而言之,您正试图停用一个尚未激活的插件,因此您的功能不起任何作用。

有两种简单的方法可以避免插件在注册的函数中的某些情况下被激活register_activation_hook:

第一个是重定向:

function dw_deactivate_theme_options() {
  if ( version_compare( get_bloginfo(\'version\'), \'4.0\', \'<\') )  {
    global $status, $paged, $s;
    $url = self_admin_url( "plugins.php?plugin_status=$status&paged=$page&s=$s" );
    wp_redirect( $url );
    exit();
  }
}
这是可行的,但用户只看到页面被重新加载,插件没有激活,但没有任何错误消息。。。这不是很直观

第二种可能更好的方法是die 在函数内部,这样插件就不会被激活,您可以向用户提供反馈,将消息放入die 功能:

function dw_deactivate_theme_options() {
  if ( version_compare( get_bloginfo(\'version\'), \'4.0\', \'<\') )  {
    $message = "Impossible activate Theme Settings plugin because ";
    $message .= "WordPress version is lower than 4.0";
    die( $message );
  }
}
这样插件就不会被激活,用户会看到一条消息,即使WordPress会说你的插件触发了致命错误。。

Check WP version before activate a plugin, and trigger error if check fail

结束

相关推荐

覆盖主题的函数.php--如果主题更新了怎么办?

我在函数中添加了一个短代码。我的a主题的php文件。我想知道如果主题改变,它可能会覆盖当前的功能。php文件。那么,这是真的吗?如果是这样,我应该把我的短代码放在哪里,这样即使我更新了主题,它也不会消失?