Bagaimana saya mencegah plugin dimuat ketika melakukan WP-CLI?

12

Saat ini saya menggunakan kode ini di file plugin utama itu sendiri. Tetapi plugin itu bukan milik saya, jadi saya lebih memilih untuk dapat memutakhirkannya secara normal tanpa setiap kali menambahkan kode ini.

if ( defined( 'WP_CLI' ) && WP_CLI ) {
    exit;
}

Saya perlu melakukan ini karena plugin ini menghasilkan kesalahan dan menghentikan wp-cli untuk mengeksekusi dengan benar sehingga saya tidak bisa menonaktifkan plugin dengan wp-cli, melakukan tugas saya dan mengaktifkannya kembali.

Apakah ada cara saya dapat melakukan sesuatu seperti if x then do not load plugin file xdari dalam plugin-mu?

Tema NextGen
sumber

Jawaban:

12

Salah satu hal pertama yang dilakukan WordPress untuk memuat plugin adalah mendapatkan plugin aktif seperti yang disimpan dalam database:

$active_plugins = (array) get_option( 'active_plugins', array() );

Karena menggunakan get_option()kita dapat menggunakan option_active_pluginsfilter untuk mengubah daftar plugin aktif dengan cepat.

function wpse_301282_disable_plugin( $active_plugins ) {
    if ( defined( 'WP_CLI' ) && WP_CLI ) {
        $key = array_search( 'gravityforms/gravityforms.php', $active_plugins );

        if ( $key ) {
            unset( $active_plugins[$key] );
        }
    }

    return $active_plugins;
}
add_filter( 'option_active_plugins', 'wpse_301282_disable_plugin' );

Ganti saja gravityforms/gravityforms.phpdengan direktori dan nama file plugin yang ingin Anda nonaktifkan.

Masalahnya di sini adalah bahwa kami mencoba untuk mempengaruhi pemuatan plugin, jadi kami tidak dapat melakukannya dari dalam plugin, karena sudah terlambat. Dalam temanya juga akan terlambat.

Untungnya WordPress memiliki "Harus Gunakan Plugin" ini adalah plugin yang dapat Anda tambahkan yang dimuat sebelum dan secara terpisah ke plugin biasa, dan tidak muncul dalam daftar plugin biasa.

Yang perlu Anda lakukan untuk menambahkan kode ini ke dalam Must Use Plugin adalah membuat wp-content/mu-pluginsdirektori (jika belum ada) dan membuat file PHP (bisa disebut apa saja) dengan kode itu di dalamnya. Anda tidak perlu header plugin atau apa pun.

Sekarang kode itu akan dimuat sebelum semua plugin lain ketika WordPress dimuat. Karena filter kami sudah ada, ketika WordPress mendapatkan daftar plugin aktif untuk memuat plugin yang ingin Anda nonaktifkan akan disaring dari daftar itu jika WP-CLI aktif.

Jacob Peattie
sumber
Punya ide yang sama tetapi ini tidak berhasil. Setidaknya tidak di lingkungan lokal saya. Mungkin get_option()kembali lebih awal ketika nilainya disimpan dalam transien / serupa dan filter ini dilewati? (Tidak bekerja untuk kebanyakan kasus, hanya di layar plugin admin itu benar-benar dieksekusi)
kero
Hm Melihat sumber dan sejauh yang saya tahu satu-satunya alasan option_filter tidak diterapkan adalah jika tidak memiliki nilai dan mengembalikan default.
Jacob Peattie
Itu sebenarnya yang terjadi (tidak ada plugin aktif). Saya seharusnya tidak menjaga lingkungan pengujian saya terlalu bersih ..
Kero
1
Saya menerima ini karena dalam kasus saya itulah yang saya butuhkan. Meskipun secara umum --skip-plugin=xopsi wp-cli mungkin merupakan cara yang lebih baik untuk melakukannya.
NextGenTema
15

Anda dapat menggunakan skip-pluginsopsi di WP-CLI untuk tidak memuat plugin individual saat menggunakan WP-CLI.

Anda dapat menggunakannya dalam perintah seperti ini:

wp user list --skip-plugins=my-plugin

Atau Anda dapat menambahkan ini ke wp-cli.ymlfile Anda :

skip-plugins:
- my-plugin
swissspidy
sumber
-1

Hanya penamaan ulang nama dir plugin akan menonaktifkannya. Saya melakukannya kadang-kadang untuk sementara menonaktifkan plugin [linux]:

mv my-plugin-dir renamed-my-plugin-dir
John Dee
sumber
OP ingin melewati plugin hanya ketika menggunakan WP-CLI, bukan untuk aktivitas lain yang mungkin terjadi pada saat yang sama
Mark Kaplun