सहानुभूति निर्देशिकाओं में प्लगइन्स?


20

जब मैं प्लगइन्स विकसित करता हूं तो मैं उन्हें अलग-अलग wp-contentनिर्देशिकाओं में अपने प्लगइन निर्देशिका को सहानुभूति से वर्डप्रेस के कई संस्करणों पर परीक्षण करता हूं । यह बहुत अच्छा है क्योंकि मुझे केवल एक बार फ़ाइलों को संपादित करना है, लेकिन यह मेरे प्लगइन में संसाधनों के संदर्भ उत्पन्न करने के लिए एक महत्वपूर्ण निर्माण को तोड़ता है: __FILE__भौतिक प्लगइन स्थान को संदर्भित करता है, न कि किसी को wp-content। मुझे इसे कैसे हल करना चाहिए?

मेरी निर्देशिका संरचना इस तरह दिखती है:

  • /path/to/wordpress/development/dir/
    • plugin-development/
      • monkeyman-rewrite-analyzer/
        • monkeyman-rewrite-analyzer.php
        • js/
          • monkeyman-rewrite-analyzer.js
    • versions/
      • 3.1/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer उपरोक्त प्लगइन के लिए एक सिमलिंक के रूप में
      • 3.1-multi-dir/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer उपरोक्त प्लगइन के लिए एक सिमलिंक के रूप में
      • 3.1-multi-domain/
        • wp-content/
          • plugins/
            • monkeyman-rewrite-analyzer उपरोक्त प्लगइन के लिए एक सिमलिंक के रूप में

यदि मुझे जावास्क्रिप्ट फ़ाइल को एंक्यूब करना है, तो मुझे उपयोग करना चाहिए plugins_url( 'monkeyman-rewrite-analyzer.js', [base file] ), लेकिन __FILE__यहां उपयोग करने से काम नहीं चलेगा, क्योंकि वास्तविक फ़ाइल पथ होगा /path/to/wordpress/development/dir/plugin-development/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php, नहीं /path/to/wordpress/development/dir/versions/*/wp-content/plugins/monkeyman-rewrite-analyzer/monkeyman-rewrite-analyzer.php, इसलिए वर्डप्रेस पहले भाग को बाहर नहीं निकाल सकता है और वर्डप्रेस इंस्टॉलेशन के सापेक्ष एक URL उत्पन्न कर सकता है।

जवाबों:


6

समस्या आंशिक रूप से plugins_urlफ़िल्टर में एक हुक-यूज़ प्लग-इन के साथ संबोधित की जा सकती है ।

यह अन्य सभी मामलों को संभाल नहीं पाएगा जहां plugin_basename()इसका उपयोग किया जाता है, जैसे कि register_activation_hook()और सह।

अधिक जानकारी: http://core.trac.wordpress.org/ticket/16953


मेरा मानना ​​है कि उपयोग करने WP_PLUGIN_URLकी अनुशंसा नहीं की गई है क्योंकि प्रशासकों को इस विशिष्ट प्लगइन की निर्देशिका का नाम बदलने की अनुमति दी जानी चाहिए, लेकिन क्या इससे बचने का एक और कारण भी है? और वास्तव में, आपका टिकट एक सरल समाधान होगा।
Jan Fabry

इसके विपरीत। WP_PLUGIN_URL में केवल वह URL होता है जो सीधे 'प्लगइन्स' को इंगित करता है। अद्यतन उत्तर देखें।
scribu

@ स्क्रिप्ट: लेकिन क्या होगा अगर मेरे प्लगइन्स में रहता है, /external/folder/banana-plugin/लेकिन व्यवस्थापक उस निर्देशिका से लिंक करता है /httpd-root/wp-content/plugins/apple-plugin/? तब यह जाने की कोशिश करेगा /wp-content/plugins/banana-plugin/, नहीं? और मेरा मानना ​​है कि व्यवस्थापक को अलग-अलग प्लगइन निर्देशिका नामों का चयन करने के लिए स्वतंत्र होना चाहिए?
जन फैब्री

मैं अब आपके साथ इस बारे में कोई बहस नहीं करूंगा, क्योंकि मुझे इसका हल मिल गया है: 'plugins_url' फ़िल्टर। अपडेटेड उत्तर फिर से।
scribu

FWIW यह समाधान त्रुटि प्रवण हो सकता है और सभी प्लग इन लोड होने के बाद प्लग इन का उपयोग करके प्लग इन पर निर्भर करता है, अन्यथा फ़ंक्शन को कॉल करने से पहले आप फ़िल्टर को पंजीकृत नहीं कर सकते। Akismet प्लगइन और कई अन्य लोगों को यह समस्या है।
jerclarke

3

मैं वर्तमान में वर्डप्रेस-सापेक्ष फ़ाइल स्थान प्राप्त करने के लिए एक चाल का उपयोग करता हूं: wp_get_active_and_valid_plugins()फ़ाइल पथ लौटाता है, और wp_settings.phpउन पर लूप करता है और फाइलें शामिल करता है । तो वैश्विक $pluginचर आपके वर्तमान प्लगइन को संदर्भित करेगा (केवल तब जब प्लगइन लोड किया जाता है, इसलिए मैं इसे पहले से तैयार किए गए चर संस्करण में सहेजता हूं:

$monkeyman_Rewrite_Analyzer_file = $plugin;

क्योंकि प्लग-इन को भी उपयोग या नेटवर्क प्लग- इन के रूप में लोड किया जा सकता है और ये लूप अन्य चर नामों का उपयोग करते हैं , पूरा कोड इस तरह दिखता है:

$monkeyman_Rewrite_Analyzer_file = __FILE__;
if ( isset( $mu_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $mu_plugin;
}
if ( isset( $network_plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $network_plugin;
}
if ( isset( $plugin ) ) {
    $monkeyman_Rewrite_Analyzer_file = $plugin;
}

फ़ॉलबैक अभी भी है __FILE__, इसलिए यदि कोई भविष्य में लूप वैरिएबल का नाम बदलता है, तो मेरे कोड को अभी भी सभी इंस्टॉलेशन के 99% के लिए काम करना चाहिए, केवल मेरा विकास सेटअप विफल हो जाएगा और मैं आसानी से एक नया संस्करण जारी कर सकता हूं।


महान समाधान @जन। मैंने फ़ंक्शन को कॉल करके और लूपिंग के समान कुछ लागू किया क्योंकि मैं भूल गया कि उन चर के रूप में सुलभ थे global। यहाँ आपके पोस्ट के लिए धन्यवाद मुझे एहसास हुआ कि मैं इसे बहुत सरल बना सकता हूं। BTW, मैं भी false === strpos( __FILE__, WP_CONTENT_DIR )अपने बयानों को चलाने से पहले परीक्षण कर रहा हूं क्योंकि अगर मैं मान रहा हूं कि प्लगइन WP_CONTENT_DIRइसमें सममित नहीं है; मुझे उम्मीद है कि यह वैध तर्क है।
माइकस्किंकल

0

बग 46260 में एक टिप्पणी $_SERVER["SCRIPT_FILENAME"]इसके बजाय उपयोग करने का सुझाव देती है __FILE__। क्या यह काम करता है?


1
नहीं, यह शामिल फ़ाइलों में नहीं बदलता है। तो अगर index.phpशामिल library.php, $_SERVER['SCRIPT_FILENAME']में library.phpइच्छा अभी भी हो सकता है index.php। लेकिन बग के संदर्भ के लिए धन्यवाद, मैं इसे बारीकी से पालन करूंगा!
Jan Fabry

0

$_SERVER["SCRIPT_FILENAME"]काम करता है अगर आप इसे सही उपयोग करते हैं आपको बस आधार पथ सेट करने के लिए इसका उपयोग करना होगा, और फिर उस आधार पथ के सापेक्ष पथ का उपयोग करके अपनी फ़ाइलों को शामिल करना होगा।

कुछ इस तरह:

$plugin_dir = dirname($_SERVER["SCRIPT_FILENAME"]);
$myFile = $plugin_dir."/includes/js/myJavascriptFile.js";

ध्यान दें, यह तब और उपयोगी होता है जब आपके पास wp-blog-header.php तक पहुँच नहीं होती है (यानी एक अजाक्स-आधारित फॉर्म अनुरोध को संसाधित करने में)

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