プラグインのネットワークアクティベーションを防止する


9

現在、ネットワークのアクティブ化をサポートしていないプラグインがあります。もちろん、これに対する最良の修正は、修正することです:)私はそれを計画しています。ただし、その間にネットワークのアクティブ化を防止するために使用できる一時的な解決策、おそらく次のようなワークフローがあるかどうか疑問に思います。

  1. アクティベーションがネットワーク全体であるかどうかを検出する(方法?)
  2. 現在サポートされていないというメッセージを表示します。
  3. アクティブ化を中断するか、非アクティブ化します

または、他の提案が受け入れられました。ありがとう。

説明のために:マルチサイトのアクティブ化は問題なく、ネットワーク全体のアクティブ化ではありません。

回答:


5

ここでの答えは考え過ぎであり、複雑すぎます。アクティベーションを防ぐのではなく、なぜプラグインをアクティベート解除するのですか?アクティベーション時にdie( 'ここにあなたのエラーメッセージ)を呼び出すのと同じくらい簡単なことが仕事をします。

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

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

次に、パネルでアクティブ化しようとすると、ページの上部にエラーメッセージとともに素敵なエラーが表示されます。


6

プラグインのヘッダーNetwork: falseは、WordPress…で残念ながら無視されます。ただし、アクティベーションフックはパラメーターを取得します$network_wide。これを使用して、アクティベーション中にプラグインを非アクティブ化できます。

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

これは便利ですが、何が起こっているかを説明することはできません(少なくとも現在のところ)。私はwp_dieそこにa を入れてリダイレクトをスキップすることができましたが、説明なしで非アクティブ化するよりも少し面倒ではないようです。:)
k3davis

1
これは私が最終的に使用した解決策です-この機能を単に「無効」に調整して、非アクティブ化URLにリダイレクトするのではなく、メッセージを送信しました。これは最もクリーンではありませんが、すべての要件を満たし、他のソリューションよりもオーバーヘッドが少なくなっています。これは、私の部分的な一時パッチの場合です。
k3davis 2012

4

ネットワークプラグインリストから単に非表示にすることができます。

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

また、1回限りのネットワーク管理者通知を表示します。Q&Aの適応add_role()は一度だけ実行されますか?

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

または、この他の手法を使用します。管理領域への最初のログイン時にユーザーに通知を追加します


2

(これはテストされていません)

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

}

次にadmin_noticeswpse76145_network_activate_noticeオプションとディスプレイの通知を確認します。

注: 'myplugin / myplugin.php'をハードコード化しない方が良いでしょう-私はそれを置き換えることでplugin_basename(__FILE__);うまくいくと思います(そして望ましいです)。

マルチサイトのアクティベーションが問題ない場合は編集しswitch_to_blog()各プラグインで個別にアクティベートするために使用できます。ユーザーが要求したことをしていないので、私はまだ通知を表示します。


これはうまくいくかもしれませんが、プラグインがすでに非アクティブ化されている場合、管理通知がどのように呼び出されるのか理解できませんか?それとも、これを可能にするのは単一サイトのアクティブ化ですか?
k3davis

そう、メインサイトだけでプラグインをアクティベートします。
スティーブンハリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.