Cegah aktivasi jaringan plugin

9

Saya memiliki plugin yang saat ini tidak mendukung aktivasi jaringan. Perbaikan terbaik untuk ini tentu saja adalah memperbaikinya :) yang saya rencanakan untuk dilakukan. Namun saya bertanya-tanya apakah ada solusi sementara yang dapat saya gunakan untuk mencegah aktivasi jaringan sementara itu, mungkin alur kerja yang mirip dengan:

  1. Mendeteksi jika aktivasi di seluruh jaringan (bagaimana ??)
  2. Tampilkan pesan bahwa saat ini tidak didukung, dan saya bau, saya minta maaf
  3. Ganggu aktivasi atau nonaktifkan

Atau, saran lain diterima. Terima kasih.

Untuk klarifikasi: Aktivasi multisite baik-baik saja, hanya saja tidak aktivasi seluruh jaringan.

k3davis
sumber

Jawaban:

5

Jawaban di sini terlalu dini dan terlalu rumit. Mengapa menonaktifkan plugin alih-alih mencegah aktivasi? Sesuatu yang sederhana seperti memanggil mati ('pesan kesalahan Anda di sini) setelah aktivasi akan melakukan pekerjaan itu.

function activate($networkwide) {
    if (is_multisite() && $networkwide) 
       die('This plugin can\'t be activated networkwide');
}

register_activation_hook('your-plugin/index.php','activate');

Kemudian ketika Anda mencoba mengaktifkan di panel, Anda akan mendapatkan kesalahan yang bagus di bagian atas halaman, dengan pesan kesalahan Anda.

Maciej Krawczyk
sumber
6

Header plugin Network: falseakan diabaikan oleh WordPress ... sayangnya. Tetapi kait aktivasi mendapatkan parameter $network_wide, dan kita dapat menggunakannya untuk menonaktifkan plugin selama aktivasi:

<?php
/**
 * Plugin Name: Prevent Network Activation
 * Plugin URI:  http://wordpress.stackexchange.com/questions/76145/prevent-network-activation-of-plugin
 * Network:     false
 *
 * Note the 'Network' option will be ignored by WordPress.
 */

register_activation_hook( __FILE__, 'pna_check_network_activation' );

function pna_check_network_activation( $network_wide )
{
    if ( ! $network_wide )
        return;

    deactivate_plugins( plugin_basename( __FILE__ ), TRUE, TRUE );

    header( 'Location: ' . network_admin_url( 'plugins.php?deactivate=true' ) );
    exit;
}
fuxia
sumber
Ini berguna, tetapi jangan biarkan saya menjelaskan apa yang terjadi (setidaknya seperti yang disajikan saat ini). Saya hanya bisa meletakkan wp_diedi sana dan melewatkan pengalihan, tetapi itu tampaknya hanya sedikit kurang norak daripada menonaktifkan tanpa penjelasan. :)
k3davis
1
Ini adalah solusi yang akhirnya saya gunakan - Saya baru saja menyesuaikan fungsi ini untuk "mati" untuk mengirim pesan alih-alih mengarahkan ulang ke URL nonaktifkan. Ini bukan yang terbersih, tetapi memenuhi semua persyaratan dan memiliki lebih sedikit overhead daripada solusi lain, untuk tambalan sementara di pihak saya.
k3davis
4

Anda bisa menyembunyikannya dari daftar plugin jaringan.

add_filter( 'all_plugins', 'wpse_76145_hide_network_plugin' );
function wpse_76145_hide_network_plugin( $all )
{
    global $current_screen;

    if( $current_screen->is_network )
        unset($all['akismet/akismet.php']);

    return $all;
}

Dan menampilkan pemberitahuan admin jaringan satu kali. Mengadaptasi Q&A add_role () berjalan hanya sekali? .

add_action( 'network_admin_notices', 'wpse_76145_admin_notice' );

function wpse_76145_admin_notice()
{ 
    global $current_screen;
    if( 'plugins-network' == $current_screen->id )
    {
        if ( wpse_25643_run_once( 'hide_akismet_network' ) )
            echo '<div class="error">Akismet not available in Network mode</div>';
    }
}

function wpse_25643_run_once( $key )
{
    $test_case = get_option( 'run_once' );

    if ( isset( $test_case[$key] ) && $test_case[$key] )
    {
        return false;
    }
    else
    {
        $test_case[$key] = true;
        update_option( 'run_once',$test_case );
        return true;
    }
}

Atau gunakan teknik lain ini: Tambahkan pemberitahuan kepada pengguna saat login pertama kali ke area admin

brasofilo
sumber
2

(Ini belum diuji)

add_action( 'activated_plugin', 'wpse76145_no_network_activation',10,2 );
function wpse76145_no_network_activation( $plugin, $network_wide){

   if( $plugin == 'myplugin/myplugin.php' && $network_wide ){
       //Plugin was network activated

       //Network deactivate
       deactivate_plugins( $plugin,false, true );

       //Activate on single site
       activate_plugins( $plugin);

       add_option('wpse76145_network_activate_notice',1);
   }

}

Dan kemudian admin_noticesmemeriksa wpse76145_network_activate_noticeopsi dan pemberitahuan tampilan.

Catatan: Akan lebih baik untuk tidak melakukan hardcode 'myplugin / myplugin.php' - Saya pikir menggantinya dengan plugin_basename(__FILE__);akan bekerja (dan lebih disukai).

Edit jika aktivasi multi-situs ok, maka Anda dapat menggunakan switch_to_blog()untuk mengaktifkan setiap plug-in satu per satu. Saya masih akan menampilkan pemberitahuan karena Anda belum melakukan apa yang diminta pengguna.

Stephen Harris
sumber
Ini mungkin berhasil, tetapi saya tidak mengerti bagaimana pemberitahuan admin akan dipanggil jika plugin sudah dinonaktifkan? Atau aktivasi situs tunggal yang memungkinkan ini terjadi?
k3davis
Yup, Anda mengaktifkan plugin di situs utama saja.
Stephen Harris