कैसे एक प्लगइन बनाने के लिए एक और प्लगइन की आवश्यकता है?


30

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


1
उपयोग करने के बारे में क्या है: is_plugin_active ()? जैसे: if (is_plugin_active('path/to/plugin.php')) { // Do something }
TomC

जवाबों:


35

दोस्तों, जवाबों के लिए धन्यवाद। हालाँकि दोनों जवाबों ने मुझे सही रास्ते पर खड़ा किया, लेकिन किसी ने भी बॉक्स से बाहर काम नहीं किया। इसलिए मैं नीचे अपने समाधान साझा कर रहा हूं।

विधि 1 - register_activation_hook का उपयोग कर:

प्लग इन / पेरेंट-प्लग इन / पेरेंट-प्लग-इन में पेरेंट प्लगिन बनाएँ:

<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/

प्लग इन / चाइल्ड-प्लगइन / चाइल्ड-प्लगइन में चाइल्ड प्लगिन बनाएँ।

<?php
/*
Plugin Name: Child Plugin
Description: Parent Plugin should be installed and active to use this plugin.
Version: 1.0.0
*/
register_activation_hook( __FILE__, 'child_plugin_activate' );
function child_plugin_activate(){

    // Require parent plugin
    if ( ! is_plugin_active( 'parent-plugin/parent-plugin.php' ) and current_user_can( 'activate_plugins' ) ) {
        // Stop activation redirect and show error
        wp_die('Sorry, but this plugin requires the Parent Plugin to be installed and active. <br><a href="' . admin_url( 'plugins.php' ) . '">&laquo; Return to Plugins</a>');
    }
}

ध्यान दें कि मैं deactivate_plugins( $plugin );किसी कारण से उपयोग नहीं कर रहा हूं यह काम नहीं करता है। इसलिए मैंने सक्रियण पुनर्निर्देशन को रद्द करने और उपयोगकर्ता को सूचित करने के लिए wp_die का उपयोग किया।

लाभ:

  • सरल समाधान और विधि 2 की तुलना में अतिरिक्त डीबी हिट को उकसाता नहीं है

नुकसान:

  • wp_die स्क्रीन बदसूरत है
  • wp_die स्क्रीन तब दिखाई देगी जब आपने प्लगइन्स व्यवस्थापक स्क्रीन में चेकबॉक्स का उपयोग करते हुए एक ही समय में पेरेंट प्लगिन और चाइल्ड प्लगिन को सक्रिय कर दिया था।

विधि 2 - admin_init और admin_notices का उपयोग करना

प्लग इन / पेरेंट-प्लग इन / पेरेंट-प्लग-इन में पेरेंट प्लगिन बनाएँ:

<?php
/*
Plugin Name: Parent Plugin
Description: Demo plugin with a dependent child plugin.
Version: 1.0.0
*/

प्लग इन / चाइल्ड-प्लगइन / चाइल्ड-प्लगइन में चाइल्ड प्लगिन बनाएँ।

<?php
/*
Plugin Name: Child Plugin
Description: Parent Plugin should be installed and active to use this plugin.
Version: 1.0.0
*/
add_action( 'admin_init', 'child_plugin_has_parent_plugin' );
function child_plugin_has_parent_plugin() {
    if ( is_admin() && current_user_can( 'activate_plugins' ) &&  !is_plugin_active( 'parent-plugin/parent-plugin.php' ) ) {
        add_action( 'admin_notices', 'child_plugin_notice' );

        deactivate_plugins( plugin_basename( __FILE__ ) ); 

        if ( isset( $_GET['activate'] ) ) {
            unset( $_GET['activate'] );
        }
    }
}

function child_plugin_notice(){
    ?><div class="error"><p>Sorry, but Child Plugin requires the Parent plugin to be installed and active.</p></div><?php
}

लाभ:

  • जब आप एक ही समय में चेकबॉक्स का उपयोग करके पेरेंट और चाइल्ड प्लगइन को सक्रिय करते हैं

हानि:

  • Incur अतिरिक्त db हिट के रूप में प्लगइन वास्तव में पहले से सक्रिय है और एक बार admin_init चलता है।

सक्रिय लिंक को अक्षम करने के संबंध में मेरे प्रश्न के लिए, मैं उपयोग कर सकता हूं:

add_filter( 'plugin_action_links', 'disable_child_link', 10, 2 );
function disable_child_link( $links, $file ) {

    if ( 'child-plugin/child-plugin.php' == $file and isset($links['activate']) )
        $links['activate'] = '<span>Activate</span>';

    return $links;
}

हालांकि, यह अत्यधिक अव्यावहारिक निकला क्योंकि इस कोड को रखने के लिए कोई जगह नहीं है। मैं इसे पेरेंट प्लग इन पर नहीं डाल सकता क्योंकि इस कोड को चलाने के लिए पेरेंट प्लगइन सक्रिय होना चाहिए। निश्चित रूप से चाइल्ड प्लगइन या फ़ंक्शंस से संबंधित नहीं है। इसलिए मैं इस विचार को समाप्त कर रहा हूं।


1
विधि 2 ने बहुत अच्छा काम किया! मैंने इसका इस्तेमाल किसी और के प्लगइन का विस्तार करने के लिए किया।
कोलिन मूल्य

2

इसे आज़माएं, यह टिप्पणी की गई है, ताकि आपको इसे समझने में मदद मिले।

<?php
register_activation_hook( __FILE__, 'myplugin_activate' ); // Register myplugin_activate on
function myplugin_activate() {
    $plugin = plugin_basename( __FILE__ ); // 'myplugin'
    if ( is_plugin_active( 'plugin-directory/first-plugin.php' ) ) {
        // Plugin was active, do hook for 'myplugin'
    } else {
        // Plugin was not-active, uh oh, do not allow this plugin to activate
        deactivate_plugins( $plugin ); // Deactivate 'myplugin'
    }
}
?> 

यदि यह कोई त्रुटि निकालता है, तो आप 'myplugin' का 'विकल्प' भी देख सकते हैं और इसे गलत या सक्रिय नहीं किया जा सकता है।


2

सुझाए गए दोनों समाधानों में दोष हैं।

विधि 1: जैसा कि उल्लेख किया गया है, wp_die () स्क्रीन तब दिखाई देगी, जब प्लगइन्स व्यवस्थापक स्क्रीन में चेकबॉक्स का उपयोग करके पेरेंट प्लगिन और चाइल्ड प्लगिन उसी समय सक्रिय हो जाएंगे।

विधि 2: कुछ उपयोग-मामलों में यह अच्छा नहीं है क्योंकि 'plugins_loaded' ( https://codex.wordpress.org/Plugin_API/Action_Reference ) के बाद 'admin_init' को निष्पादित किया जाता है , और स्थापना रद्द करने के बाद हुक ( https: // codex)। wordpress.org/Function_Reference/register_uninstall_hook )। इसलिए, उदाहरण के लिए, यदि हम चाहते हैं कि ऐड-ऑन अनइंस्टॉल पर कुछ कोड चलाए या नहीं, तो पैरेंट प्लगइन सक्रिय है या नहीं, यह दृष्टिकोण काम नहीं करेगा।

समाधान:

सबसे पहले, हमें मूल कोड के मुख्य PHP फ़ाइल के अंत में निम्नलिखित कोड संलग्न करना होगा:

do_action( 'my_plugin_loaded' );

यह सभी ग्राहकों को एक घटना / संकेत भेजेगा, जिसमें बताया गया था कि कोर प्लग लोड किया गया था।

फिर, ऐड-ऑन की क्लास को निम्नलिखित की तरह दिखना चाहिए:

class My_Addon
{
    static function init ()
    {
        register_activation_hook( __FILE__, array( __CLASS__, '_install' ) );

        if ( ! self::_is_parent_active_and_loaded() ) {
            return;
        }
    }

    #region Parent Plugin Check

    /**
     * Check if parent plugin is activated (not necessarly loaded).
     *
     * @author Vova Feldman (@svovaf)
     *
     * @return bool
     */
    static function _is_parent_activated()
    {
        $active_plugins_basenames = get_option( 'active_plugins' );
        foreach ( $active_plugins_basenames as $plugin_basename ) {
            if ( false !== strpos( $plugin_basename, '/my-plugin-main-file.php' ) ) {
                return true;
            }
        }

        return false;
    }

    /**
     * Check if parent plugin is active and loaded.
     *
     * @author Vova Feldman (@svovaf)
     *
     * @return bool
     */
    static function _is_parent_active_and_loaded()
    {
        return class_exists( 'My_Plugin' );
    }

    /**
     *
     * @author Vova Feldman (@svovaf)
     */
    static function _install()
    {
        if ( ! self::_is_parent_active_and_loaded() ) {
            deactivate_plugins( basename( __FILE__ ) );

            // Message error + allow back link.
            wp_die( __( 'My Add-on requires My Plugin to be installed and activated.' ), __( 'Error' ), array( 'back_link' => true ) );
        }
    }

    #endregion Parent Plugin Check
}

if (My_Addon::_is_parent_active_and_loaded())
{
    // If parent plugin already included, init add-on.
    My_Addon::init();
}
else if (My_Addon::_is_parent_activated())
{
    // Init add-on only after the parent plugins is loaded.
    add_action( 'my_plugin_loaded', array( __CLASS__, 'init' ) );
}
else
{
    // Even though the parent plugin is not activated, execute add-on for activation / uninstall hooks.
    My_Addon::init();
}

आशा करता हूँ की ये काम करेगा :)


4
इस जवाब में एक दोष भी है। :-) यह मानता है कि आपके पास पैरेंट प्लगइन पर पूरा नियंत्रण है जहाँ आप do_action ('my_plugin_loaded') जोड़ सकते हैं; इसके कोड में। चयनित उत्तर पेरेंट प्लगिन के नियंत्रण के साथ या उसके बिना काम करेगा (जैसे कि पेरेंट प्लगिन आपका नहीं है)
kosinix

धन्यवाद, यह वही है जो मैं देख रहा था। मेरे मामले में, मैं कर माता पिता प्लगइन पर पूरा नियंत्रण है, और निर्भरता के इस प्रकार बनाने के लिए आवश्यक।
cr0ybot

0

मुझे लगता है कि आपको टीजीएम प्लगिन एक्टिवेशन की आवश्यकता है ।

टीजीएम प्लगिन एक्टिवेशन एक PHP लाइब्रेरी है जो आपको आसानी से अपने वर्डप्रेस थीम (और प्लगइन्स) के लिए प्लगइन्स की आवश्यकता या सिफारिश करने की अनुमति देता है। यह आपके उपयोगकर्ताओं को देशी वर्डप्रेस वर्गों, कार्यों और इंटरफेस का उपयोग करके एकवचन या थोक फैशन में प्लग इन को स्वचालित रूप से सक्रिय करने की अनुमति देता है। आप इंटरनेट पर कहीं भी होस्ट किए गए वर्डप्रेस प्लगइन रिपॉजिटरी या यहां तक ​​कि प्लगइन्स से बंडल किए गए प्लगइन्स, प्लगइन्स को संदर्भित कर सकते हैं।


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