問題描述

我有一個插件,目前不支持網絡激活。最好的解決方案當然是修復它:) 我打算做的。不過我想知道是否有一個臨時解決方案,我可以用來防止網絡激活的同時,也許一個工作流程類似於:

  1. 檢測如果激活是 network-wide(怎麼樣)

  2. 顯示當前不支持的消息,我發現我很抱歉

  3. 中斷激活或停用

或者接受其他建議。謝謝。

要澄清:多點激活很好,只是不激活 network-wide 。

最佳解決方案

這裏的答案是過分的,太複雜了。為什麼要禁用插件,而不是阻止激活?在激活時,簡單的調用 die(「你的錯誤信息」) 就可以完成這項工作。

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

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

然後,當您嘗試在面板中激活時,您將在頁面頂部獲得一個錯誤的錯誤信息。

次佳解決方案

您可以簡單地將其從 network-plugins 列表中隱藏。

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

並顯示一個 one-time 網絡管理通知。適應 Q& A add_role() run only once?

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 a notice to users upon first login to the admin area

第三種解決方案

插件頭 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_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__); 替換它會奏效 (最好是) 。

編輯如果 multi-site 激活確定,那麼您可以使用 switch_to_blog()單獨激活每個 plug-in 。我仍然會顯示通知,因為您尚未完成用户的查詢。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。