当未达到某个WP版本时,在激活过程中停止插件,然后在admin_notices操作钩中显示错误消息


9

我有一个插件,如果它不符合某个WP版本号,则不希望被激活,然后在admin_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 );
}

但是我认为我仍然做错了,因为我同时收到了分配的错误通知和插件激活消息。

如果未达到某个WP版本,则在激活过程中停止插件

正确停止插件激活过程的正确动作钩子/过滤器是什么,所以我只会收到错误消息?


请@CarlAlberto考虑我的回答。
prosti

Answers:


6

我可能参加这个聚会很晚,但是要停止插件激活并让WordPress在管理员注意的地方显示错误消息,我只是输出一条错误消息并终止执行。这具有与wp-cli好玩的额外优势:

插件激活失败

例:

class testPlugin() {

  ...

   static function activate() {

   //[do some stuff here]

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

}

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

2

本质上,您无法按照自己的方式进行操作。所有wordpress表单在完成其处理后都将重定向,并且不会自行生成输出,因此错误消息是在其他页面请求上生成的。如果此时您的插件未处于活动状态,则不会显示任何消息。更复杂的是,插件可能会被Ajax激活。

一种丑陋但可行的方法是通过生成php错误而使激活失败,否则IIRC任何输出都将执行此操作,因此您可以在插件激活挂钩中仅输出“版本不匹配”之类的内容,该信息将显示在错误输出框中,激活失败时显示。

需要考虑的事情:人们可能包括您的插件文件,或者通过绕过UI或使用wp-cli强制激活它。根据您想要失败激活的原因,仅显示错误消息可能比尝试失败激活更好。


2

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

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;
    }
}

在此处输入图片说明

请注意,当您尝试激活插件时,将与plugins.php文件进行交互。在这里,您可以执行很多操作。

而且,如果您现在$_GET['error']仅设置了预定义的错误消息,则设置了错误-您将无法创建自己的自定义消息。这就是为什么我向您提出这样的解决方案的原因。

在此处输入图片说明

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


3
这是行不通的。如果该插件未处于活动状态,则WP将不会执行文件中的脚本,因此,当点击重定向URL时,admin_notices不会触发连接到该函数的功能。
JakeParis

0

如果WP <8.5,该代码如何禁止hello.php(Hello Dolly):

 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添加了此代码,但是您需要进行调整。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.