Eklentinin ağ aktivasyonunu önleyin


9

Şu anda ağ aktivasyonunu desteklemeyen bir eklentim var. Bunun için en iyi düzeltme tabii ki düzeltmek :) hangi yapmak planlıyoruz. Ancak, bu arada ağ aktivasyonunu önlemek için kullanabileceğim geçici bir çözüm olup olmadığını merak ediyorum, belki de benzer bir iş akışı:

  1. Etkinleştirmenin ağ çapında olup olmadığını tespit edin (nasıl ??)
  2. Şu anda desteklenmediğini belirten bir mesaj görüntüle ve kokuyorum, üzgünüm
  3. Etkinleştirmeyi durdurun veya devre dışı bırakın

Veya diğer öneriler kabul edildi. Teşekkürler.

Açıklığa kavuşturmak için: Çoklu site etkinleştirme gayet iyi, ağ genelinde etkinleştirme değil.

Yanıtlar:


5

Buradaki cevaplar aşırı düşünülmüş ve çok karmaşık. Etkinleştirmeyi önlemek yerine neden eklentiyi devre dışı bırakalım? Etkinleştirme sırasında die ('burada hata mesajınız) çağırmak kadar basit bir şey işi yapar.

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

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

Panelde etkinleştirmeye çalıştığınızda, sayfanın üstünde hata mesajınızla birlikte güzel bir hata alırsınız.


6

Bir eklenti başlığı Network: falseWordPress tarafından yok sayılacak ... maalesef. Ancak aktivasyon kancası bir parametre alır $network_wideve aktivasyon sırasında eklentiyi devre dışı bırakmak için bunu kullanabiliriz:

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

Bu yararlıdır, ancak neler olduğunu açıklamama izin vermiyor (en azından şu anda sunulduğu gibi). Ben sadece wp_dieoraya koymak ve yönlendirme atlamak, ama bu açıklama yapmadan devre dışı bırakmak daha sadece biraz daha az yapışkan gibi görünüyor. :)
k3davis

1
Bu benim kullandığım çözüm - Ben sadece bu işlevi devre dışı bırakma URL'sine yönlendirmek yerine mesajı göndermek için "ölmek" için ayarladım. En temiz değil, ancak benim için geçici bir yama için tüm gereksinimleri karşılar ve diğer çözümlerden daha az ek yüke sahiptir.
k3davis

4

Sadece ağ eklentileri listesinden gizleyebilirsiniz.

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

Ve bir kerelik ağ yöneticisi uyarısı görüntüleyin. Soru-Cevap add_role () yalnızca bir kez çalıştırılsın mı? .

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

Veya bu diğer tekniği kullanın: Yönetici alanına ilk girişte kullanıcılara bir bildirim ekleyin


2

(Bu test edilmemiştir)

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

}

Ve sonra seçeneği admin_noticeskontrol edin wpse76145_network_activate_noticeve bildirimi görüntüleyin.

Not: 'myplugin / myplugin.php' kodunu yazmamak daha iyi plugin_basename(__FILE__);olur.

Düzen çok siteli aktivasyon ok ise, o zaman kullanabilirsiniz switch_to_blog()her eklenti bireysel üzerinde etkinleştirmek için. Kullanıcının istediklerini yapmadığınız için bir bildirim göstermeye devam ediyorum.


Bu işe yarayabilir, ancak eklenti zaten devre dışı bırakılmışsa yönetici bildiriminin nasıl çağrılacağını anlamıyorum? Yoksa bunun gerçekleşmesine izin veren tek site aktivasyonu mu?
k3davis

Evet, eklentiyi yalnızca ana sitede etkinleştirirsiniz.
Stephen Harris
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.