現在ネットワークアクティベーションをサポートしていないプラグインがあります。もちろんこれに対する最善の解決策はそれを修正することです:)これを行うつもりです。しかし、その間にネットワークのアクティブ化を防ぐために使用できる一時的な解決策、おそらく次のようなワークフローがあるのでしょうか。
または、他の提案が受け入れられました。ありがとう。
明確にするために:マルチサイトアクティベーションは問題ありません。ネットワーク全体のアクティベーションではありません。
ここでの答えはひっくり返って複雑すぎます。アクティベーションを妨げるのではなく、プラグインを非アクティブにするのはなぜですか?起動時にdieを呼び出すのと同じくらい簡単なもの(ここではエラーメッセージ)がその仕事をします。
function activate($networkwide) {
if (is_multisite() && $networkwide)
die('This plugin can\'t be activated networkwide');
}
register_activation_hook('your-plugin/index.php','activate');
それからあなたがパネルで活性化しようとすると、あなたはあなたのエラーメッセージと一緒にページの上にNiceエラーを得るでしょう。
プラグインヘッダー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;
}
あなたは単にそれをネットワークプラグインリストから隠すことができます。
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;
}
ワンタイムネットワーク管理者通知を表示します。 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;
}
}
またはこの他のテクニックを使用する: 管理者エリアへの最初のログイン時にユーザーに通知を追加する
(これはテストされていません)
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_notices
でwpse76145_network_activate_notice
オプションをチェックして注意を表示します。
注意: 'myplugin/myplugin.php'をハードコードしない方が良いでしょう - 私はそれをplugin_basename(__FILE__);
に置き換えるのがうまくいくと思います(そして望ましい)。
編集 もしマルチサイトアクティベーションが問題なければ、switch_to_blog()
を使って各プラグインを個別にアクティベートすることができます。ユーザーが要求したことを実行していないため、通知を表示します。