Mengapa activ_plugin tidak berfungsi di register_activation_hook

10

Saya mencoba mengaktifkan plugin kedua secara otomatis saat mengaktifkan plugin pertama.

register_activation_hook(__FILE__, 'example_activation' );
function example_activation() {
        include_once(ABSPATH .'/wp-admin/includes/plugin.php');
        activate_plugin('hello.php');
}

Tidak berfungsi di dalam register_activation_hook .. Ini berfungsi jika saya menggunakannya secara langsung seperti:

include_once(ABSPATH .'/wp-admin/includes/plugin.php');
activate_plugin('hello.php');

Bagaimana saya bisa memperbaikinya? Terimakasih atas bantuannya

Larutan:

Saya menggunakan ini untuk diri saya sendiri sekarang:

// When this plugin activate, activate another plugin too.
register_activation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_inactive($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            /* for some reason, 
            activate_plugin($dependent); 
               is not working */
            activate_plugin('hello.php');
        });
    }
}); 

// When this plugin deactivate, deactivate another plugin too.
register_deactivation_hook(__FILE__, function(){
    $dependent = 'hello.php';
    if( is_plugin_active($dependent) ){
        add_action('update_option_active_plugins', function($dependent){
            deactivate_plugins('hello.php');
        });
    }
}); 
Ünsal Korkmaz
sumber
Saya salah membaca posting Anda pada awalnya. Saya harus mengatakan, itu diformat dengan benar. Apakah fungsi ini di utama plugin Anda?
Chris
Tunggu sebentar. Perlu mengedit posting saya.
Chris
ya itu dalam plugin pertama yang mencoba untuk mengaktifkan plugin kedua .. plugin kedua adalah hello.php sebagai contoh
Ünsal Korkmaz

Jawaban:

8

Untuk penjelasan lengkap tentang apa yang terjadi lihat posting ini (ini untuk menonaktifkan plug-in, tetapi masalahnya sama).

Penjelasan singkat: Plug-in pada dasarnya diaktifkan dengan menambahkannya ke array pug-in aktif yang disimpan dalam database. Saat Anda mengaktifkan plug-in pertama, WordPress mengambil array dari semua plug-in yang saat ini aktif, menambahkan plug-in ke dalamnya (tetapi belum memperbarui database) dan kemudian menjalankan callback instalasi Anda.

Callback instalasi ini menjalankan kode Anda.

Setelah itu WordPress memperbarui database dengan array di atas, yang berisi plug-in pertama tetapi bukan yang kedua. Dengan demikian plug-in kedua Anda tampaknya tidak diaktifkan.

Solusi: telah disebutkan di tautan di atas solusinya adalah seperti ini (belum teruji):

//This goes inside Plugin A.
//When A is activated. activate B.
register_activation_hook(__FILE__,'my_plugin_A_activate'); 
function my_plugin_A_activate(){
    $dependent = 'B/B.php';
    if( is_plugin_inactive($dependent) ){
         add_action('update_option_active_plugins', 'my_activate_dependent_B');
    }
}

function my_activate_dependent_B(){
    $dependent = 'B/B.php';
    activate_plugin($dependent);
}
Stephen Harris
sumber
Jika Anda punya waktu, saya mengedit pertanyaan saya untuk menulis apa yang saya gunakan sekarang. Anda dapat melihat activ_plugin ($ dependen); tidak berfungsi saat mengaktifkan plugin. Adakah cara untuk memperbaikinya?
Ünsal Korkmaz
Menyalin kode Anda ke plug-in tes (dan membuat hello.phpplug-in tes tes lain - berfungsi dengan baik untuk saya). Ingat bahwa jika plug-in ada di subdirektori, Anda harus memberikan folder: misalnya hello/hello.php.
Stephen Harris
kode saya akan bekerja normal .. masalah mulai ketika Anda mengubah activate_plugin('hello.php');baris denganactivate_plugin($dependent);
Ünsal Korkmaz
Itu karena variabel yang diberikan ke panggilan balik Anda tidak lain adalah hello.phparray plug-in yang saat ini aktif. Anda tidak dapat meneruskan variabel Anda sendiri ke callback seperti itu. Kecuali Anda menggunakan variabel kelas / global, Anda harus menggunakan activate_plugin('hello.php');. Tapi itu seharusnya tidak menjadi masalah ...?
Stephen Harris
baik saya tidak suka menulis variabel yang sama di banyak tempat tbh. tapi itu bukan masalah besar. Terima kasih banyak
Ünsal Korkmaz
2

Berikut adalah seseorang yang menjelaskan mengapa itu tidak berhasil untuknya, dan bagaimana ia harus menyalin metode activ_plugin dan membuat kebiasaan sendiri tanpa masalah: /programming/1415958/how-to- aktifkan-wordpress-plugins-secara internal

Berikut adalah sumber asli kode activ_plugin, yang dapat Anda gunakan untuk membuat fungsi Anda sendiri dan melihat di mana itu tidak berfungsi untuk Anda: http://hitchhackerguide.com/2011/02/11/activate_plugin/

Berikut ini adalah solusi yang mungkin, yang berisi metode aktivasi plugin alternatif yang mungkin dipangkas orang lain dari kode sumber: Cara Mengaktifkan Plugin melalui Kode?

mltsy
sumber
solusi itu masih belum berfungsi di register_activation_hook
Ünsal Korkmaz
Untungnya, sekarang Anda memiliki metode Anda sendiri untuk mengaktifkan plugin, Anda harus dapat men-debug dan mencari tahu di mana itu gagal kan? :) Apakah Anda mengubah register_activation_hook Anda untuk menggunakan metode activ_plugin khusus Anda, bukan yang default? Jika demikian, masukkan beberapa pernyataan trigger_error dan cari tahu di mana itu gagal. Misalnya, tempat yang baik untuk memulai adalah mencari tahu metode apa yang Anda kembalikan ketika gagal.
mltsy
Saya mencoba yang terbaik untuk debugging tetapi saya tidak dapat menemukan alasannya. Mungkin opsi active_plugins mendapatkan pembaruan setelah register_activation_hook dieksekusi.
Ünsal Korkmaz
Maaf, saya baru saja memperbaiki urutan dua tautan yang telah saya bertukar (dua yang terakhir). Apakah Anda menggunakan kode dari tautan yang berjudul "Cara Mengaktifkan Plugin melalui Kode?" Petunjuk bermanfaat lainnya untuk diberikan adalah nilai pengembalian activate_pluginmetode default . Anda dapat menggunakan trigger_erroruntuk menemukan nilai kembali, dan mempostingnya di sini.
mltsy