当某个WP版本不满足时,停止激活过程中的插件,然后在ADMIN_NOTICES操作挂钩中显示错误消息

时间:2017-01-03 作者:Carl Alberto

我有一个插件,如果它不符合特定的WP版本号,我不想被激活,然后在admin\\u notices操作挂钩中显示错误消息。就我所研究的而言,下面的代码是我能够实现这一目标的最佳代码:

$wp_version = get_bloginfo(\'version\');
if ( $wp_version < 4.5 ) {
    add_action( \'admin_init\', \'deactivate_plugin_now\' );
    add_action( \'admin_notices\', \'errormsg\' ) );
}

public function deactivate_plugin_now() {
    if ( is_plugin_active(\'myplugin/myplugin.php\') ) {
        deactivate_plugins(\'myplugin/myplugin.php\');
    }
}

public function errormsg () {
    $class = \'notice notice-error\';
    $message = __( \'Error you did not meet the WP minimum version\', \'text-domain\' );
    printf( \'<div class="%1$s"><p>%2$s</p></div>\', $class, $message );
}
但我认为我仍然做错了,因为我在收到插件激活消息的同时,收到了我指定的错误通知。

Stop a plugin in the activation process when a certain WP version is not met

什么是正确的操作挂钩/过滤器来正确停止插件激活过程,这样我只会收到错误消息?

5 个回复
SO网友:Pascal Roget

我可能会迟到,但要停止插件激活并让WordPress在管理员通知的位置显示错误消息,我只需输出一条错误消息并终止执行。这还有一个额外的优点,就是玩得很好wp-cli:

Plugin activation failed

示例:

class testPlugin() {

  ...

   static function activate() {

   //[do some stuff here]

   if ($error) {
      die(\'Plugin NOT activated: \' . $error);
   }

}

register_activation_hook( __FILE__, array( \'testPlugin\', \'activate\' ));

SO网友:Mark Kaplun

重要的是,你不能按你想要的方式去做。所有wordpress表单在完成过程后都会重定向,并且不会自行生成输出,因此错误消息会在不同的页面请求上生成。如果您的插件此时不处于活动状态,则不会显示任何消息。更复杂的是,插件可能被Ajax激活。

一种丑陋但有效的方法是通过生成php错误来失败激活,或者IIRC任何输出都可以,因此您可以在插件激活挂钩中输出类似“版本不匹配”的内容,该内容将显示在激活失败时显示的错误输出框中。

需要考虑的是:人们可能会包括您的插件文件,或者通过绕过UI或使用wp cli以某种方式强制激活它。根据您希望激活失败的原因,只显示错误消息可能比尝试激活失败要好

SO网友:prosti

这段代码可以抑制hello。php(Hello Dolly)如果WP<;8.5:

 add_action( \'activate_plugin\', \'_20170113_superess_activate\' , 10, 2);

 function _20170113_superess_activate($plugin, $network_wide){
      global $wp_version;

      if ( $wp_version < 8.5 && \'hello.php\' == $plugin ) {
        error_log( \'WordPress need to be at least 8.5\' );      
        $args = var_export( func_get_args(), true );
        error_log( $args );
        wp_die( \'WordPress need to be at least 8.5 to activate this plugin\' );
      }
 }
我认为这很好,因为它不会强迫您创建管理通知。您只需获得关于插件安装中止原因的反馈。

我为HelloDolly添加了此代码,但您需要进行调整。

SO网友:prosti

由于您更新了标题,我需要提供另一个答案,请不要忽略前一个,因为它比这一个更简单。

add_action( \'admin_notices\', \'my_plugin_admin_notices\' );

function my_plugin_admin_notices() {
    if ( ! is_plugin_active( \'hello.php\' ) && isset( $_GET[\'customhello\'] ) ) {
        echo \'<div class="error"><p>WordPress need to be at least 8.5 to activate this plugin</p></div>\';
    }
}

add_action( \'activate_plugin\', \'_20170113_superess_activate\', 10, 2 );

function _20170113_superess_activate( $plugin, $network_wide ) {
    global $wp_version;
    if ( $wp_version < 8.5 && \'hello.php\' == $plugin ) {
        $redirect = self_admin_url( \'plugins.php?customhello=1\' );
        wp_redirect( $redirect );
        exit;
    }
}

enter image description here

请注意,当您尝试激活插件时,您会与插件进行交互。php文件。在那里,您可以运行大量的操作。

如果你有错误集$_GET[\'error\'] 目前,您只有预定义的错误消息&mdash;您不能创建自己的自定义邮件。这就是为什么我向你提出这样的解决方案。

enter image description here

如果插件不满足某些要求,可以将自定义消息作为管理员通知提交给WordPress核心。

SO网友:Suraj Wasnik

我知道我已经来不及发布回复了,但这可能会帮助一些人。您可以取消设置$_GET 触发消息的变量:

$wp_version = get_bloginfo(\'version\');
if ( $wp_version < 4.5 ) {
    add_action( \'admin_init\', \'deactivate_plugin_now\' );
    add_action( \'admin_notices\', \'errormsg\' ) );
}

public function deactivate_plugin_now() {
    if ( is_plugin_active(\'myplugin/myplugin.php\') ) {
        deactivate_plugins(\'myplugin/myplugin.php\');
        unset($_GET[\'activate\']);
    }
}

public function errormsg () {
    $class = \'notice notice-error\';
    $message = __( \'Error you did not meet the WP minimum version\', \'text-domain\' );
    printf( \'<div class="%1$s"><p>%2$s</p></div>\', $class, $message );
}

相关推荐

插件放置在/wp-content/plugins内的文件夹中时不保存值

我得到了WordPRess插件的以下代码,它在每个页面/后期编辑屏幕上添加了两个自定义输入。然后将这些值保存并输出到前端页面的标题中。如果代码位于内部,则可以正常工作。php文件并直接放入“wp内容/插件”。然而,如果我把它放在插件(如“wp-content/plugins/myplugin”)中自己的文件夹中,那么在通过编辑屏幕保存帖子/页面时,输入字段不会保存。此外,它不会向前端页面html标题部分输出任何内容。这似乎是一个被放弃的项目,所以我无法与原始开发人员一起制定解决方案。然而,代码中的某些内容