व्यवस्थापक-ajax.php को फ्रंटेंड में जोड़ना। अच्छा या बुरा विचार?


17

मुझे एडमिन- ajax.php बहुत पसंद है। लेकिन मुझे इसमें स्क्रिप्ट को इंगित करने के लिए स्थानीयकरण करने से नफरत है, और मेरी इच्छा है कि विषयों के लिए एक समतुल्य, आसानी से मिल जाने वाली फ़ाइल थी। (यह भी सिर्फ मुझे सामने वाले अनुरोधों को देखने के लिए परेशान करता है "/ wp-admin /" के माध्यम से जाना। कोई व्यावहारिक कारण नहीं, बस बदसूरत IMO दिखता है।)

इसलिए मैंने बस "/ajax.php" पर रूट dir में व्यवस्थापक-ajax.php की प्रतिलिपि बनाई है, इसमें शामिल पथों को समायोजित किया और WP_ADMIN निरंतर परिभाषा को हटा दिया। गैंगबस्टर्स की तरह काम करने लगता है (मैं अब अपने सभी फ्रंट अजेक्स अनुरोधों को /ajax.php पर निर्देशित कर सकता हूं! और मैं अभी भी अपने प्लग इन में सामान्य wp_ajax हुक का उपयोग कर सकता हूं!)।

लेकिन क्या यह सुरक्षित है? क्या गलत हो सकता है? चूंकि यह कोर में नहीं बनाया गया है, इसलिए मुझे लगता है कि क्यों नहीं इसका एक अच्छा कारण है। लेकिन कोड के माध्यम से देख रहा हूँ, मैं किसी भी तत्काल समस्याओं को नहीं देख सकता।

आप स्मार्ट हैं - मुझे बताएं कि क्या यह दृष्टिकोण पागल है। या अगर वहाँ एक सरल विधि है कि मैं देख रहा हूँ।


आप स्वचालित अपडेट के दौरान इस फ़ाइल को भूल सकते हैं और याद कर सकते हैं, जिसके परिणामस्वरूप सुरक्षा कमजोरियां टूट सकती हैं और निकल सकती हैं।
हेम

जवाबों:


19

आप अपने नियमित नियम को फिर से लिखने के नियमों के ऊपर अपने .htaccess में सिर्फ एक RewriteRule का उपयोग कर सकते हैं:

RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]

अब अपने AJAX अनुरोधों को भेजें example.com/ajax, और उन्नयन के बाद उस फ़ाइल में मुख्य परिवर्तन को कभी न छोड़ें।


महान विचार! यह उन चीजों में से एक है, जिसे सुनने के बाद, आपको लगता है कि "यह इतना सरल और स्पष्ट है!" धन्यवाद।
मठसमठ

मैंने आपके सुझाव के अनुसार पुनर्लेखन नियम जोड़ा है लेकिन example.com/ajaxURL 404 है। क्या आप इस बारे में विस्तार से बता सकते हैं कि .htaccessमुझे इसे कहां जोड़ना चाहिए। मेरे पास वर्तमान में यह है # BEGIN WordPress <IfModule mod_rewrite.c>और</IfModule> # END WordPress
जॉन

यह काम। मुझे अनुगामी स्लेश याद आ रही थी। मेरे पास पर्मलिंक्स / पोस्टनाम% /
जॉन

7

पहला: मानकीकरण। यदि आप सामुदायिक प्लगइन्स का उपयोग करने की योजना बनाते हैं, तो संभावना है कि वे /ajax.phpदस्तावेज़ रूट में आपकी फ़ाइल के बारे में परवाह नहीं करेंगे । इसलिए वे इसका उपयोग नहीं करेंगे।

यदि आप सब कुछ स्वयं करने जा रहे हैं, तो यह कोई समस्या नहीं है।

दूसरा: क्या होगा अगर कोर अपडेट हो? क्या आप अपने ajax फ़ाइल की निगरानी करेंगे और बदलेंगे?

तीसरा : इसमें admin-ajax.phpनिवास करने के बावजूद wp-admin, यह व्यवस्थापक क्षेत्र के किसी भी सामान को लोड नहीं करता है (उदाहरण के लिए टेबल, आदि)। और न ही यह उपयोगकर्ता की गैर-लॉगिंग के लिए संवेदनशील चीज़ों की जाँच करता है या उन्हें उजागर नहीं करता है। यह सिर्फ दूसरे शब्दों में सामने के छोर की फाइल की तरह है। किसी बारे में चिन्ता की जरूरत नहीं।

चौथा: पहले मुद्दे से संबंधित, कुछ प्लगइन्स नेत्रहीन अजाक्स संबंधी कार्यक्षमता लोड करने से पहले जांच करेंगे। एक उदाहरण नीचे है। आपके संशोधित ajax.php के कारण लोड होने की संभावना नहीं होगी।

<?php
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
    //  load ajax stuff
}

अंत में: आप किस बारे में शिकायत करते हैं, अजाक्स यूआरएल प्राप्त करने के लिए स्थानीयकरण का उपयोग करना अच्छी बात है। क्यों? क्योंकि आपकी JS फाइलें सर्वर साइड के किसी भी सामान के बारे में नहीं जानती हैं। आप एक URL में मुश्किल से जा रहे हैं, यदि साइट के हिलने पर / टूट जाएगा? एक बुरी पसंद की तरह लगता है।

यदि आप वास्तव में अजाक्स का उपयोग करने वाली प्रत्येक स्क्रिप्ट को स्थानीय बनाना नहीं चाहते हैं, तो सरल हुक wp_headवास्तव में जल्दी और व्यवस्थापक एजैक्स URL को थूक देता है। समस्या हल हो गई (यह वास्तव में व्यवस्थापक क्षेत्र इसे कैसे करता है, वैसे)।

<?php
add_action('wp_head', 'wpse83650_lazy_ajax', 0, 0);
function wpse83650_lazy_ajax()
{
    ?>
    <script type="text/javascript">
    /* <![CDATA[ */
    var ajax_url = "<?php echo esc_js(admin_url('admin-ajax.php')); ?>";
    /* ]]> */
    </script>
    <?php
}

धन्यवाद, क्रिस! सभी वैध बिंदु। सबसे बड़ी बात यह है कि आपने मुझे यह महसूस करने में मदद की है कि, हालांकि, मैं इसे "कोर हैक" के रूप में नहीं सोच रहा था (क्योंकि मैं जोड़ रहा था, फ़ाइल को संशोधित नहीं कर रहा था), यह वास्तव में है क्योंकि यह कोर में अन्य कार्यक्षमता पर निर्भर करता है जो बदल सकता है । किसी भी अन्य प्लगइन से बहुत ज्यादा अलग नहीं है (जो कोर कार्यक्षमता में परिवर्तन के बाद भी मर सकता है), लेकिन निश्चित रूप से दार्शनिक रूप से अलग है। विचारों के लिए धन्यवाद!
मैथ्समैथ

पुन :: " तीसरा: ... चिंता करने की कोई बात नहीं। ", wp-admin निर्देशिका जैसे लॉक-डाउन करने का प्रयास करने के बारे में क्या ज्ञात-सुरक्षित IP सीमाओं तक सीमित करने के लिए .htaccess नियमों का उपयोग करना? मुझे लगता है कि ajax-admin.php फ़ाइल के लिए किसी प्रकार के अपवाद की आवश्यकता होगी? (मैं कहता हूँ "अनुमान करें" क्योंकि मैं जब यह आता है, तो यह एक खाली जगह होती है। मुझे यह पता नहीं है कि क्या वास्तव में यह संभव है?)।
सिपाही

एकल फ़ाइल की अनुमति देना संभव होना चाहिए, हाँ।
क्रिसगिटेरिटगुए

@chrisguitarguy यह एक शानदार जवाब है, धन्यवाद। मैं कोशिश कर रहा हूँ के रूप में मैं आगे के छोर पर भरी हुई व्यवस्थापक- ajax लोड कर रहा हूँ क्योंकि मैं अपने मंचन / घर url के लिए साइटुरल proxying कर रहा हूँ। कृपया इसे देखें: लिंक क्या यह 3 पार्टी प्लगइन के साथ करना संभव है? क्या मेरा दृष्टिकोण गलत है?
परांजा

5

जैसा कि वर्डप्रेस में कई चीजों के साथ होता है, बिल्ली को त्वचा से दूर करने के अनंत तरीके हैं। जबकि सभी स्वीकृत तरीके काम करते हैं, मैंने पाया है कि वे फ्रंट छोर पर अजाक्स क्षमता को शामिल करने के लिए wp_localize_script का उपयोग करने की तुलना में कम "नीट" हैं।

इसकी जांच करें:

add_action( 'wp_enqueue_scripts', 'se83650_js' );
function se83650_js()
{
    wp_enqueue_script( 'se83650-js', plugin_dir_url( __FILE__ ) . 'js/se83650.js',  'jquery', '1.0.0', true );
    // First param is the name of the script you are attaching it to - in this case
    // it is the name of the custom script we added.  Second param is the name of 
    // the javscript Object that will be attached with your information.
    // Third param is an array of attributes, in this case, ajaxurl
    wp_localize_script( 'se83650-js', 'se83650Ajax', 
        array(
            // You can put any variables here you want for your script
            // such as plugin-specific variables or nonces, etc.
            'ajaxurl'    => admin_url( 'admin-ajax.php' )
        )
    );
}

और फिर se83650.jsफ़ाइल में, आप अपने चर का संदर्भ देंगे se83650Ajax.ajaxurl

इस तकनीक का लाभ यह है कि यदि आप कई प्लगइन्स को समाप्त करते हैं जो इस कार्यक्षमता की कोशिश करते हैं और डुप्लिकेट करते हैं, तो वे एक ही चर को शामिल या अधिलेखित नहीं कर रहे हैं। ajaxurlइसमें शामिल करने के लिए बहुत सामान्य है, यह आपको अधिक सम्‍मिलित करता है और यह अन्य डेवलपर्स के साथ अच्छा खेलता है।

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