Hentikan plugin dalam proses aktivasi ketika versi WP tertentu tidak terpenuhi kemudian tampilkan pesan kesalahan di hook tindakan admin_notices

9

Saya memiliki plugin yang tidak ingin saya aktifkan jika tidak memenuhi nomor versi WP tertentu lalu tampilkan pesan kesalahan di kait tindakan admin_notices. Sejauh yang saya teliti, kode di bawah ini adalah yang terbaik yang dapat saya capai tujuan ini:

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

Tetapi saya pikir saya masih melakukan kesalahan karena saya mendapatkan pesan plugin yang diaktifkan bersamaan dengan pemberitahuan kesalahan yang saya tetapkan.

Hentikan plugin dalam proses aktivasi ketika versi WP tertentu tidak terpenuhi

Apa yang akan menjadi kait tindakan / filter yang tepat untuk menghentikan proses aktivasi plugin dengan benar sehingga saya hanya akan mendapatkan pesan kesalahan?

Carl Alberto
sumber
Tolong @CarlAlberto pertimbangkan jawaban saya.
prosti

Jawaban:

6

Saya mungkin terlambat ke pesta ini, tetapi untuk menghentikan aktivasi plugin dan membuat WordPress menunjukkan pesan kesalahan di mana pemberitahuan admin pergi, saya hanya menampilkan pesan kesalahan dan mengakhiri eksekusi. Ini memiliki keuntungan tambahan bermain baik dengan wp-cli :

Aktivasi plugin gagal

Contoh:

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
sumber
2

Intinya, Anda tidak bisa melakukannya dengan cara yang Anda inginkan. Semua bentuk wordpress mengarahkan ulang setelah menyelesaikan proses mereka dan tidak menghasilkan output sendiri dan karenanya pesan kesalahan dihasilkan pada permintaan halaman yang berbeda. Jika plugin Anda tidak akan aktif pada saat itu, tidak akan ada pesan yang ditampilkan. Komplikasi lebih lanjut adalah bahwa plugin mungkin diaktifkan oleh Ajax.

Cara yang jelek tapi berfungsi adalah gagal aktivasi dengan menghasilkan kesalahan php, atau IIRC output apa pun akan dilakukan, jadi Anda bisa menampilkan sesuatu seperti "versi mismatch" di kait aktivasi plugin, yang akan ditampilkan di kotak output kesalahan yang sedang ditampilkan ketika aktivasi gagal.

Sesuatu untuk dipikirkan: orang mungkin menyertakan file plugin Anda, atau entah bagaimana mengaktifkannya secara paksa dengan memintas UI, atau menggunakan wp-cli. tergantung pada alasan Anda ingin gagal aktivasi, hanya memiliki pesan kesalahan mungkin lebih baik daripada mencoba untuk gagal aktivasi

Mark Kaplun
sumber
2

Karena Anda memperbarui judul saya perlu memberikan jawaban yang lain, yang sebelumnya tolong jangan abaikan karena itu bahkan lebih sederhana daripada yang ini.

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

masukkan deskripsi gambar di sini

Harap dicatat bahwa ketika Anda mencoba untuk mengaktifkan plugin Anda berinteraksi dengan file plugins.php. Di sana Anda memiliki banyak tindakan yang dapat Anda jalankan.

Dan jika Anda memiliki kesalahan yang ditetapkan $_GET['error']saat ini Anda hanya memiliki pesan kesalahan yang telah ditentukan - Anda tidak dapat membuat pesan khusus Anda sendiri. Inilah sebabnya saya mengusulkan Anda solusi seperti ini.

masukkan deskripsi gambar di sini

Seseorang dapat mengusulkan pesan khusus sebagai pemberitahuan admin ke inti WordPress jika plugin tidak memenuhi beberapa persyaratan.

prosti
sumber
3
Ini tidak bekerja. Jika plugin tidak aktif, WP tidak akan mengeksekusi skrip dalam file, oleh karena itu, ketika menekan url redirect, fungsi yang dihubungkan ke admin_noticestidak diaktifkan.
JakeParis
0

Bagaimana dengan kode ini untuk menekan hello.php (Hello Dolly) jika 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' );
      }
 }

Saya pikir ini bagus karena tidak memaksa Anda untuk membuat pemberitahuan admin. Anda hanya akan mendapatkan umpan balik tentang alasan aborsi dari pemasangan plugin.

Saya menambahkan kode ini untuk HelloDolly, tetapi Anda harus menyesuaikan.

prosti
sumber