Остановите плагин в процессе активации, если определенная версия 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 обдумайте мой ответ.
Прости

Ответы:


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 любой вывод сделает, так что вы можете просто вывести что-то вроде «несоответствия версий» в хуке активации плагина, который будет отображаться в окне вывода ошибок, которое отображается при сбое активации.

О чем стоит подумать: люди могут включить ваши файлы плагинов или принудительно активировать их, обходя пользовательский интерфейс, или используя 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

Как насчет этого кода для подавления 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, но вам нужно будет настроить.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.