दोस्तों, जवाबों के लिए धन्यवाद। हालाँकि दोनों जवाबों ने मुझे सही रास्ते पर खड़ा किया, लेकिन किसी ने भी बॉक्स से बाहर काम नहीं किया। इसलिए मैं नीचे अपने समाधान साझा कर रहा हूं।
विधि 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' ) . '">« 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;
}
हालांकि, यह अत्यधिक अव्यावहारिक निकला क्योंकि इस कोड को रखने के लिए कोई जगह नहीं है। मैं इसे पेरेंट प्लग इन पर नहीं डाल सकता क्योंकि इस कोड को चलाने के लिए पेरेंट प्लगइन सक्रिय होना चाहिए। निश्चित रूप से चाइल्ड प्लगइन या फ़ंक्शंस से संबंधित नहीं है। इसलिए मैं इस विचार को समाप्त कर रहा हूं।
if (is_plugin_active('path/to/plugin.php')) { // Do something }