Зупиніть плагін у процесі активації, коли певна версія 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

Відповіді:


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.