Bagaimana cara menonaktifkan plugin yang diaktifkan jaringan hanya untuk satu situs?

22

Saya sedang dalam proses menyiapkan jaringan multisite (berpotensi) besar, dan saya ingin membuatnya semudah mungkin sekarang untuk menambah dan mengkonfigurasi situs bila diperlukan. Saya saat ini pada tahap di mana saya berurusan dengan plugin.

Dengan multisite, saya mengetahui beberapa cara berbeda untuk mengaktifkan plugin

  • Masukkan plugin /plugins, aktifkan di setiap situs secara invidual
  • Masukkan plugin /plugins, gunakan 'jaringan aktifkan' untuk mengaktifkannya di semua situs
  • Masukkan plugin /mu-plugins, diaktifkan secara otomatis di setiap situs

Sekarang, saya telah bermain dengan pengaturan dan saya ingin mengaktifkan Akismet di semua situs kecuali satu atau dua. Saya pikir saya akan dapat mengaktifkan jaringan plugin dan kemudian menonaktifkannya di satu situs, tetapi saya tidak dapat melakukannya - jika saya menggunakan aktivasi jaringan maka hanya ada pilihan untuk 'menonaktifkan jaringan' - yang menonaktifkan plugin di semua situs.

Apakah ada cara untuk mengaktifkan fungsionalitas jaringan namun masih memiliki kenyamanan untuk menonaktifkan plugin berdasarkan situs-demi-situs?

tak seorangpun
sumber

Jawaban:

31

Anda bisa menggunakan filter site_option_*.

Misalnya berikut ini akan menonaktifkan akismet di blog dengan id 2.

add_filter('site_option_active_sitewide_plugins', 'modify_sitewide_plugins');

function modify_sitewide_plugins($value) {
    global $current_blog;

    if( $current_blog->blog_id == 2 ) {
        unset($value['akismet/akismet.php']);
    }

    return $value;
}
sorich87
sumber
1
+1 untuk memberikan solusi tingkat PHP yang bersih yang menyelesaikan masalah yang dipermasalahkan tanpa perlu menginstal plugin tambahan - karena saya seorang maniak yang murni dan sangat menyukai Wordpress sebersih dan seminimal mungkin tanpa plugin! :]
trejder
1
Menjatuhkan kode ini dalam file PHP mu-pluginsdan berfungsi seperti mimpi!
bgallagh3r
Bagus untuk dicatat bahwa ini tidak akan berfungsi dalam sebuah tema. Itu perlu dijalankan lebih cepat, jadi mu-plugins adalah tempat yang bagus untuk itu. Itu mungkin berjalan sebagai plugin, tapi saya akan menembak untuk plugins mu jika itu tidak berhasil.
Jake
1
Juga, filter ini dijalankan BANYAK, saya akan memeriksa apakah indeks dalam array diatur sebelum membukanya. Setelah pertama kali, ia akan terus mencoba pada array di mana item itu tidak ada. if ( isset($value['akismet/akismet.php']) ) { unset($value['akismet/akismet.php']); }
Jake
1
Ini masih berfungsi dengan baik pada 4.9.4.
Jake
3

Plugin ini: http://firestats.cc/wiki/WPMUPluginCommander

memotong hal-hal aktivasi jaringan dan melakukan sendiri. dan memungkinkan Anda menonaktifkan plugin di situs demi situs.

Pembaruan: Sepertinya plugin ini memecah plugin tag seluruh situs, jadi berhati-hatilah sebelum mencoba di jaringan produksi.

andrea_r
sumber
wordpress.org/plugins/plugin-commander - URL berubah. Meskipun plugin ini belum diperbarui dalam beberapa tahun pada saat ini ...
Jake
3

Inilah yang berhasil bagi saya untuk menonaktifkan plugin untuk satu tema tertentu pada instalasi multisite / multitheme. Saya menambahkan beberapa baris ini di bagian atas file functions.php dalam tema saya:

/**
 * Disable fancybox plugin for this theme, it breaks javascript
 */
function deactivate_plugin_conditional() {
    if ( is_plugin_active('fancybox-for-wordpress/fancybox.php') ) {
        deactivate_plugins('fancybox-for-wordpress/fancybox.php');
    }
}
add_action( 'muplugins_loaded', 'deactivate_plugin_conditional' );
pengguna33465
sumber
Saya cukup yakin ini hanya akan berfungsi pada mu-plugins yang cukup membatasi. Saya akan melakukan ini initseperti @GDR.
Jake
2

Plugin aktif disimpan di wp_ [blog_id] _pilihan di bidang 'active_plugins' dan 'active_sitewide_plugins' di wp_ [blog_id] _sitemeta. Ini adalah bidang bersambung jadi jangan mengeditnya kecuali Anda tahu apa yang Anda lakukan.

Lihat juga wp-admin \ plugin.php. Seharusnya dimungkinkan untuk menulis plugin yang akan melakukan apa yang Anda inginkan menggunakan fungsi-fungsi yang dideklarasikan di sana misalnya is_plugin_active () dan activ_plugin ().

Namun, saya mengandaikan Anda mahir dalam PHP yang mungkin tidak terjadi.

codecowboy
sumber
2

Jawaban dari sorich87 dan user33465 tidak berfungsi untuk saya dengan Wordpress 4.3. Menambahkan ini ke functions.php tema berfungsi:

function deactivate_plugin_conditional() {
    $deactivated_plugin_name = 'lazy-load/lazy-load.php';
    deactivate_plugins($deactivated_plugin_name, false, true);
}
add_action( 'init', 'deactivate_plugin_conditional' );
GDR
sumber
Saya dapat mengonfirmasi bahwa solusi yang ditingkatkan sebelumnya tidak lagi berfungsi dan bahwa solusi oleh @gdr sebenarnya berfungsi.
Saya dapat mengonfirmasi bahwa solusi @ sorich87 berfungsi dengan baik di 4.4.1. Kalian tidak menggunakannya dengan cara yang tampaknya berhasil, tetapi masih berfungsi. Namun, itu mungkin hanya bisa berfungsi di mu-plugins dan jelas tidak di temanya. Opsi ini akan berfungsi dalam tema. Tetapi perhatikan bahwa ini memaksa plugin dinonaktifkan vs sorich87's yang hanya berhenti memaksanya di situs, tetapi masih memungkinkan untuk digunakan secara normal jika diinginkan. Saya lebih suka yang terakhir, tetapi keduanya bisa bermanfaat.
Jake
Sebenarnya. Metode solusi @ sorich87 tidak berfungsi jika situs Anda adalah situs pertama (ID: 1). Jika itu masalahnya, itu tidak akan memungkinkan Anda untuk Jaringan Mengaktifkan plugin. ID lain apa pun tampaknya berfungsi.
Jake
Dan metode ini melakukan hal yang sama untuk saya. Anda tidak dapat lagi mengaktifkan plugin di mana saja jika ini ada dalam tema untuk situs di ID = 1.
Jake
0

Tidak keluar dari kotak di WP 3, tetapi mungkin, saya pikir, untuk menimpa opsi menggunakan filter option_ *.

Juga, akan lebih baik jika Anda menambahkan saran sebagai permintaan fitur di core.trac.wordpress.org.

Denis de Bernardy
sumber
-1

Saya berhasil menonaktifkan plugin tetapi masih ada di panel situs utama. Satu-satunya solusi yang saya temukan untuk sepenuhnya menghapusnya dari situs utama adalah memeriksa main.php dari plugin situs dan menonaktifkannya sesuai dengan itu:

global $current_blog;

// Only available to B
if( $current_blog->blog_id == 2 ) {


    define( 'AB_PATH', __DIR__ );

    include_once 'includes.php';

    //  plugin loaded stuff

    AB_Plugin::registerHooks();

    is_admin() ? new AB_Backend() : new AB_Frontend();

}
NetOholik
sumber