प्लगइन की नेटवर्क सक्रियण को रोकें


9

मेरे पास एक प्लगइन है जो वर्तमान में नेटवर्क सक्रियण का समर्थन नहीं करता है। इस पाठ्यक्रम के लिए सबसे अच्छा फिक्स इसे ठीक करना है :) जो मैं करने की योजना बना रहा हूं। हालांकि मुझे आश्चर्य है कि अगर इस बीच नेटवर्क सक्रियण को रोकने के लिए मैं एक अस्थायी समाधान का उपयोग कर सकता हूं, तो शायद इसके समान एक वर्कफ़्लो:

  1. पता लगाएँ कि क्या सक्रियण नेटवर्क-वाइड है (कैसे ??)
  2. संदेश प्रदर्शित करें कि यह वर्तमान में समर्थित नहीं है, और मुझे बदबू आ रही है, मुझे क्षमा करें
  3. सक्रियण को बाधित करें या निष्क्रिय करें

या, अन्य सुझावों को स्वीकार कर लिया। धन्यवाद।

स्पष्टीकरण के लिए: मल्टीसाइट सक्रियण ठीक है, केवल नेटवर्क-वाइड सक्रियण नहीं।

जवाबों:


5

यहां के जवाबों को बहुत उलझा दिया गया है और बहुत जटिल भी। सक्रियण को रोकने के बजाय प्लगइन को निष्क्रिय क्यों किया जाए? सक्रियण के दौरान कॉलिंग डाई ('आपकी त्रुटि संदेश) के रूप में सरल कुछ काम करेगा।

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को वर्डप्रेस द्वारा अनदेखा किया जाएगा ... दुर्भाग्य से। लेकिन सक्रियण हुक को एक पैरामीटर मिलता है $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वहाँ एक डाल सकता है और पुनर्निर्देशन को छोड़ सकता है, लेकिन ऐसा लगता है कि स्पष्टीकरण के बिना निष्क्रिय करने की तुलना में केवल थोड़ा कम समझौता है। :)
k3davis

1
यह वह समाधान है जिसका मैंने उपयोग किया है - मैंने इस फ़ंक्शन को निष्क्रिय URL के लिए पुनर्निर्देशित करने के बजाय संदेश भेजने के लिए "मर" को समायोजित किया। यह सबसे साफ नहीं है, लेकिन यह सभी आवश्यकताओं को पूरा करता है और मेरे हिस्से पर एक अस्थायी पैच के लिए अन्य समाधानों की तुलना में कम ओवरहेड है।
k3davis

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

और एक बार नेटवर्क व्यवस्थापक सूचना प्रदर्शित करें। प्रश्नोत्तर को जोड़ना & 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_noticesलिए चेक पर wpse76145_network_activate_notice

नोट: 'myplugin / myplugin.php' को हार्डकोड करना बेहतर नहीं होगा - मुझे लगता है कि इसे बदलने से plugin_basename(__FILE__);काम चल जाएगा (और बेहतर होगा)।

संपादित करें यदि मल्टी-साइट सक्रियण ठीक है, तो आप switch_to_blog()प्रत्येक प्लग-इन को व्यक्तिगत रूप से सक्रिय करने के लिए उपयोग कर सकते हैं । मैं अभी भी एक सूचना प्रदर्शित करूंगा क्योंकि आपने वह नहीं किया है जो उपयोगकर्ता ने पूछा है।


यह काम कर सकता है, लेकिन मुझे समझ नहीं आ रहा है कि यदि प्लग इन को पहले ही निष्क्रिय कर दिया जाए तो एडमिन नोटिस कैसे जाएगा? या क्या यह एकल साइट सक्रियण है जो ऐसा होने देता है?
k3davis

हाँ, आप मुख्य साइट पर प्लगइन को सक्रिय करते हैं।
स्टीफन हैरिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.