उस प्लगइन से अलग-अलग फ़ंक्शन को कॉल करते समय php सशर्त बयानों का उपयोग किए बिना wp थीम में प्लगइन की आवश्यकता कैसे करें?


10

मेरे Wordpress विषयों में से एक को सही ढंग से चलाने के लिए कुछ तृतीय पक्ष प्लगइन्स की आवश्यकता होती है।

ज्यादातर बार मैं सशर्त बयानों का उपयोग करके तीसरे पक्ष के प्लगइन्स से कार्यों को कॉल करता था

    if(function_exist('plugin_function')) {
             plugin_function() // do something
    }

मान लीजिए कि मुझे अपने विषय की कई फ़ाइलों के माध्यम से बड़े पैमाने पर एक प्लगइन का उपयोग करने की आवश्यकता है ... मैं कई IF स्थितियों का उपयोग करने से बचना चाहूंगा ... क्या WP में स्थापित होने के लिए कुछ विशिष्ट प्लगइन की आवश्यकता है या उन्हें बेहतर तरीके से स्थापित करने का एक उचित तरीका है यदि वे विषय को सक्रिय करने से पहले गायब हैं?

धन्यवाद

जवाबों:


7

is_plugin_active()बल्कि नाजुक है: यह तब टूटेगा जब या तो प्लगइन लेखक मुख्य फ़ाइल का नाम बदल देता है या जब उपयोगकर्ता प्लगइन की निर्देशिका या मुख्य फ़ाइल का नाम बदल देता है। यह जांचना बेहतर है कि क्या एक निश्चित सार्वजनिक फ़ंक्शन मौजूद है।

प्लगइन की कार्यक्षमता में से कुछ की जरूरत है कि हर बार की जाँच करने से बचने के लिए, आप व्यवस्थापक क्षेत्र में एक संदेश दिखा सकते हैं:

add_action( 'admin_notices', 'my_theme_dependencies' );

function my_theme_dependencies() {
  if( ! function_exists('plugin_function') )
    echo '<div class="error"><p>' . __( 'Warning: The theme needs Plugin X to function', 'my-theme' ) . '</p></div>';
}

एक अन्य विकल्प http://tgmpluginactivation.com/ जैसी किसी चीज़ का उपयोग करना है


यदि प्लगइन लेखक एक फ़ंक्शन का नाम बदलता है function_exists, जिसके साथ आप सवाल करते हैं , तो एक सामान्य उपयोगकर्ता को बस संदेश मिलेगा, कि उसने उस प्लगइन को स्थापित नहीं किया है जिस पर एक और प्लगइन निर्भर करता है। समस्या यह है कि उपयोगकर्ता वास्तव में, है जाएगा प्लग-इन इंस्टॉल और फिर बस कारण है कि यह आश्चर्य काम doens't । ओह, और मैं इसके लिए आपको नीचा दिखाने वाला नहीं हूं ।
केसर

यदि आप वोटों के बारे में परवाह करते हैं, तो आपको क्यू को खुद को बढ़ा देना चाहिए, क्योंकि यह एक अच्छा है।
केसर

यदि प्लगइन लेखक फ़ंक्शन का नाम बदलता है, तो वह फ़ाइल के नाम को बदलने की तुलना में बहुत अधिक उपयोगकर्ताओं से शिकायतें प्राप्त करेगा।
13

और मैंने आपके उत्तर को अस्वीकार कर दिया क्योंकि यह प्रश्न, आईएमओ को संबोधित नहीं करता था। या आप कोई स्पष्टीकरण नहीं देने के साथ, मैं गुप्त रूप से पसंद करेंगे?
13

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

1

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

एक और त्वरित विचार: मैंने कभी यह कोशिश नहीं की है, लेकिन मुझे आश्चर्य है कि अगर आप एक ही स्थिति में कई हुक लगाने के लिए कुछ चतुर तरीका समझ सकते हैं। हो सकता है कि आप एक अलग फ़ाइल में सभी सशर्त कार्यों को अलग कर सकते हैं और केवल इसकी आवश्यकता होती है यदि if( function_exists( 'plugin_function' ) )रिटर्न true(समझ के साथ कि यह एक अपूर्ण जांच है।


0

यदि आपको केवल एक प्लगइन पृष्ठ की आवश्यकता है, तो वहाँ है is_plugin_active()। यदि आपको इसकी आवश्यकता है, तो आप अपने विषय के लिए कोर फ़ंक्शन को बेहतर कॉपी / पेस्ट करें और फिर उसका उपयोग करें:

if ( ! is_admin() )
{
/**
 * Check whether the plugin is active by checking the active_plugins list.
 *
 * @since 2.5.0
 *
 * @param string $plugin Base plugin path from plugins directory.
 * @return bool True, if in the active plugins list. False, not in the list.
 */
function is_plugin_active( $plugin ) {
    return in_array( $plugin, (array) get_option( 'active_plugins', array() ) ) || is_plugin_active_for_network( $plugin );
}
}

सशर्त डबल फ़ंक्शन को परिभाषित करने के साथ किसी भी त्रुटि से बचता है।


यह वास्तव में सवाल का जवाब नहीं है। यह केवल की जगह if(function_exist('plugin_function'))के साथif(is_plugin_active('plugin-file.php'))
scribu

0

नोट: यह उत्तर केवल यहाँ @scribu और @kaiser के बीच चर्चा को आसान बनाने के लिए है। मोड: कृपया हटाएं नहीं। उपयोगकर्ता / पाठक: कृपया वोट न करें। यदि आप चर्चा का पालन करना चाहते हैं, तो संशोधन / संपादन लॉग पर एक नज़र डालें। यदि आप चर्चा में शामिल होना चाहते हैं, तो उत्तर को संपादित करें। यदि चर्चा का परिणाम है, तो इसे इस तरह चिह्नित किया जाएगा। धन्यवाद।


परिदृश्य

वहाँ भी अलग अलग परिदृश्य है कि वजन अलग हैं, जहाँ आप एक प्लगइन निर्भरता हो सकता है। (उदाहरण केवल काल्पनिक हैं)। शब्द (मूल) प्लगिन "को मूल विषय से" थीम "के साथ बदला जा सकता है।

  1. (हार्ड) एक बच्चा प्लगइन जो केवल कार्यक्षमता का विस्तार करता है या किसी मौजूदा प्लगइन के प्रदर्शन (और समान) को बदल देता है और इसलिए माता-पिता के बिना मौजूद नहीं हो सकता है। उदाहरण: बड्डीप्रेस »बड्डीप्रेस-फंकी कॉमिशनडिसप्ले
  2. (सामान्य) एक प्लगइन जो एक चाइल्ड प्लगइन सक्रिय होने पर कार्यक्षमता बढ़ाता है। उदाहरण: jQueryAttachmentCarousel »jQuerySlideDeck
  3. (सॉफ्ट) एक प्लगइन जो सिर्फ एक फीचर जोड़ता है। उदाहरण: DisneyWonderlandTheme »MickeysSocialLinks

निम्नलिखित में मैं स्केच करने की कोशिश करता हूं जब आप "अन्य" प्लगइन को अपडेट करते हैं और चेक अब काम नहीं करता है।

  • विज्ञापन 1) BuddyPress सक्रिय किए बिना प्लगइन मौजूद नहीं हो सकता है »सामग्री पूरी तरह से टूट गई है।
  • विज्ञापन 2) प्लगइन हिंडोला »स्लाइडडेक» वायर्ड प्रदर्शित करता है (मुझे लगता है कि शैली स्लाइडडेक में संशोधित कर रहे हैं) से स्विच करने का विकल्प नहीं दे सकता है।
  • विज्ञापन 3) मिकीसोशलियालिंक गायब हो गए।

चेक

अगर आप एक प्लगइन सक्रिय है जानना चाहते हैं, तो imho तीन संभावनाओं के खिलाफ जांच कर सकते हैं:

  • A. क्या फ़ोल्डर मौजूद है?
  • B. मुख्य फ़ाइल - विकल्प 'active_plugins'- मौजूद है?
  • C. क्या कोई विशेष कार्य मौजूद है?

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

इसलिए मैं सबसे कमजोर (बदलने में आसान) से सबसे मुश्किल (बदलने के खिलाफ बहुत कुछ बोलने वाला) (माता-पिता) प्लगइन का हिस्सा कहूंगा:

समारोह »मुख्य फ़ाइल नाम» फ़ोल्डर


जब मैंने कहा कि एक फ़ंक्शन चेक का उपयोग करने की तुलना में कम नाजुक है, तो is_plugin_active()मैंने मान लिया कि प्रश्न में फ़ंक्शन एक है जिसे प्लगइन लेखक स्पष्ट रूप से प्रोत्साहित करता है। इसका अंतिम उदाहरण wp_pagenavi()WP-PageNavi प्लगइन द्वारा प्रस्तुत टेम्प्लेट टैग होगा ।

निर्भरता को परिभाषित करने में कठिनाई यह है कि प्लगइन्स को विशिष्ट रूप से पहचानने का कोई मानक तरीका नहीं है जिसमें फ़ाइल नाम शामिल नहीं है।

विषय पर अधिक विचार:

http://wordpress.org/support/topic/plugin-plugin-dependencies-unreliable-plugin-namingidentifying-scheme


मुझे लगता है कि हम अब तक इसे तीन बिंदुओं में जोड़ सकते हैं:

  • हमने थोड़े अलग विषयों पर बात की है
  • हम इस बात से सहमत हैं कि कोई बुलेटप्रूफ तरीका नहीं है जो मुझे लगा कि विषय क्या होगा
  • प्रश्न की अपनी समझ से, आपने जाने के लिए वैध तरीके की पेशकश की

(अब तक) सबसे चतुर तरीका मैं सोच सकता हूं, कि मैंने पहले ही कुछ (बहुत कम) प्लगइन्स में देखा है:

// inside the plugin file:
add_action( 'plugin_custom_hook', 'plugin_trigger' );
// inside some template:
do_action( 'plugin_custom_hook' );

इसके बारे में बहुत अधिक विचार किए बिना, लेकिन मुझे लगता है कि आप अपने नोटिस को 'सभी' फ़िल्टर पर एक चेक में हुक कर सकते हैं और वर्तमान फ़िल्टर के अंदर जांच सकते हैं कि क्या यह shutdownहुक पर होने पर ट्रिगर किया गया था ...?


हुक का उपयोग करना 'सामान्य' और 'कमजोर' निर्भरता के लिए अच्छा काम करेगा। एकमात्र दोष यह है कि आपको अभी भी उपयोग करने की आवश्यकता होगी function_exists()या is_plugin_active()यदि आप रोकना चाहते हैं तो निर्भरता पूरी नहीं होती है। इसके लिए 'ऑल' फिल्टर का इस्तेमाल करना बहुत महंगा आईएमओ होगा।

@scibu यह "आपके" विषय पर लक्षित था। (मैं पहले से ही मेरे बारे में बात करना छोड़ दिया)। :)

इसलिए मूल रूप से, अगर आपको एक निर्भरता की आवश्यकता है - और आपके पास एक अच्छा लेखक है - तो वह टेम्पलेट टैग के बदले प्रतिस्थापन के रूप में / हुक प्रदान कर सकता है। क्योंकि प्लगइन केवल इसमें हुक करेगा यदि हुक मौजूद होगा, या बस कुछ भी नहीं होगा। और दूसरी तरफ आपको कोई त्रुटि नहीं होगी, जब प्लगइन्स मौजूद न हों।

यहां कठिन भाग (या क्यू से अधिक) है: उपयोगकर्ता को निर्भरता के बारे में सूचित करने के लिए एक व्यवस्थापक नोटिस लिखने के लिए "आपको" DisneyWonderLinks «इंस्टॉल करने की आवश्यकता है", आप देख सकते हैं array_keys( $GLOBALS['wp_filter']['template_tag_like_hook'] )। मुझे यकीन नहीं है कि अगर यह काम करेगा, लेकिन यह सरणी दोनों (सार्वजनिक / व्यवस्थापक) पक्षों पर सुलभ होनी चाहिए।


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

add_action( 'shutdown', function() {
  if ( !did_action( 'template_tag_like_hook' ) )
    echo 'Problem.';
} );

बेशक, यह बहुत ही निचले भाग पर, </html>टैग के बाद , फ्रंट-एंड पर (क्योंकि वह है जहाँ टेम्पलेट टैग सामान्य रूप से उपयोग किया जाता है) में मुद्रित किया जाएगा , जो बहुत अधिक उपयोग का नहीं है।

आप संदेश को wp_options में संग्रहीत करने का प्रयास कर सकते हैं और फिर इसे व्यवस्थापक क्षेत्र में प्रदर्शित कर सकते हैं, लेकिन इससे कीड़े की पूरी नई इच्छा खुल जाएगी: अमान्यकरण, कैशिंग प्लगइन्स आदि।


रिकॉर्ड के लिए, यह साइट की कार्यक्षमता का उपयोग करने का एक अपरंपरागत तरीका है। यह मुझे
scribu

हाँ यही है। लेकिन मुझे नहीं पता था कि बाद के पाठकों से छुपाये बिना हम चर्चा को कैसे जारी रख सकते हैं।
कैसर

मुझे यह महसूस नहीं होगा कि प्रश्न पोस्ट करने से काफी चर्चा उत्पन्न होगी :) लेकिन यह वास्तव में दिलचस्प है और मैं आपके प्रयास और समय दोनों के लिए धन्यवाद देता हूं और सलाह देता हूं और कुछ विचारशील बहस प्रदान करता हूं। मुझे लगता है कि स्क्रिबु (कई में से एक है) से सलाह लेने के लिए टीजीएम सक्रियण वर्ग का उपयोग कम से कम मेरे जवाब को केवल व्यावहारिक दृष्टिकोण से प्रस्तुत कर सकता है, मैं इस पर गौर करूंगा। हालाँकि, मैं अभी भी पूरी चर्चा पर नज़र रख रहा हूँ, क्योंकि कुछ अन्य तरीकों ने भी कुछ परिदृश्यों में अर्थ का प्रस्ताव रखा है और मेरे लिए यह पढ़ना बहुत दिलचस्प है, धन्यवाद!
अनफवियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.