Zatrzymaj wtyczkę w procesie aktywacji, gdy pewna wersja WP nie jest spełniona, a następnie wyświetl komunikat o błędzie w haczyku czynności admin_notices

9

Mam wtyczkę, której nie chcę aktywować, jeśli nie spełnia ona określonego numeru wersji WP, a następnie wyświetla komunikat o błędzie w haczyku czynności administratora. O ile badałem, poniższy kod jest najlepszym, jaki mogę osiągnąć ten cel:

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

Ale myślę, że nadal robię to źle, ponieważ otrzymuję komunikat aktywacji wtyczki w tym samym czasie z powiadomieniem o błędzie, które przypisałem.

Zatrzymaj wtyczkę w procesie aktywacji, jeśli pewna wersja WP nie jest spełniona

Jaki byłby właściwy hak / filtr akcji, aby poprawnie zatrzymać proces aktywacji wtyczki, więc dostanę tylko komunikat o błędzie?

Carl Alberto
źródło
Plese @CarlAlberto rozważ moją odpowiedź.
prosti

Odpowiedzi:

6

Mogę się spóźnić na tę imprezę, ale aby zatrzymać aktywację wtyczki i pozwolić WordPressowi wyświetlać komunikat o błędzie w miejscu, w którym idą powiadomienia administratora, po prostu wysyłam komunikat o błędzie i kończę wykonywanie. Ma to tę dodatkową zaletę, że fajnie się gra z wp-cli :

Aktywacja wtyczki nie powiodła się

Przykład:

class testPlugin() {

  ...

   static function activate() {

   //[do some stuff here]

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

}

register_activation_hook( __FILE__, array( 'testPlugin', 'activate' ));
Pascal Roget
źródło
2

Zasadniczo nie możesz tego zrobić tak, jak chcesz. Wszystkie formularze Wordpress przekierowują po zakończeniu procesu i nie generują wyników samodzielnie, dlatego komunikat o błędzie jest generowany na innym żądaniu strony. Jeśli wtyczka nie będzie aktywna w tym momencie, nie zostanie wyświetlony żaden komunikat. Dalszą komplikacją jest to, że wtyczki mogą być aktywowane przez Ajax.

Brzydkim, ale działającym sposobem jest niepowodzenie aktywacji przez wygenerowanie błędu php lub IIRC, które zrobi dowolne wyjście, więc możesz po prostu wypisać coś takiego jak „niezgodność wersji” w haczyku aktywacyjnym wtyczki, który zostanie wyświetlony w polu wyjściowym błędu, który wyświetla się, gdy aktywacja się nie powiedzie.

Coś do przemyślenia: ludzie mogą dołączyć twoje pliki wtyczek lub w jakiś sposób aktywować je siłą, omijając interfejs użytkownika lub używając wp-cli. w zależności od powodów niepowodzenia aktywacji, komunikat o błędzie może być lepszy niż próba niepowodzenia aktywacji

Mark Kaplun
źródło
2

Ponieważ zaktualizowałeś tytuł, muszę podać inną odpowiedź, poprzedniej nie należy ignorować, ponieważ jest ona jeszcze prostsza niż ta.

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

wprowadź opis zdjęcia tutaj

Pamiętaj, że kiedy próbujesz aktywować wtyczkę, wchodzisz w interakcję z plikiem plugins.php. Tam masz duży przełącznik akcji, które możesz uruchomić.

A jeśli $_GET['error']w tej chwili masz ustawiony błąd , masz tylko predefiniowane komunikaty o błędach - nie możesz utworzyć własnego komunikatu niestandardowego. Dlatego zaproponowałem ci takie rozwiązanie.

wprowadź opis zdjęcia tutaj

Można zaproponować niestandardowe wiadomości jako powiadomienia administracyjne do rdzenia WordPress, w przypadku gdy wtyczki nie spełniają niektórych wymagań.

prosti
źródło
3
To nie działa. Jeśli wtyczka nie jest aktywna, WP nie wykona skryptów w pliku, dlatego po naciśnięciu adresu URL przekierowania funkcja, do której admin_noticesjest podłączone, nie jest uruchamiana.
JakeParis,
0

Co powiesz na ten kod, aby pominąć hello.php (Hello Dolly), jeśli 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' );
      }
 }

Myślę, że to dobrze, ponieważ nie zmusza cię do tworzenia powiadomień administratora. Po prostu otrzymasz informację zwrotną o przyczynie przerwania instalacji wtyczki.

Dodałem ten kod do HelloDolly, ale będziesz musiał go dostosować.

prosti
źródło