मुझे वर्डप्रेस के अनुरोध के प्रसंस्करण, और तदनुसार अपने लक्ष्यों को पूरा करने के लिए वर्डप्रेस के व्यवहार को बदलने की एक विधि बताएं।
अनुरोध को पार्स करना
जब वर्डप्रेस एक अनुरोध प्राप्त करता है, तो यह अनुरोध को अलग करने और इसे एक पृष्ठ में बदलने की प्रक्रिया शुरू करता है। इस प्रक्रिया का मूल तब शुरू होता है जब वर्डप्रेस मुख्य क्वेरी विधि WP::main()
कहलाती है। यह फ़ंक्शन क्वेरी को पार्स करता है, जैसा कि आपने सही तरीके से parse_request()
(में includes/class-wp.php
) पहचाना है । वहां, वर्डप्रेस एक फिर से लिखना नियमों के खिलाफ यूआरएल से मेल खाने की कोशिश करता है । जब URL का मिलान किया जाता है, तो यह विशेष भागों जैसे क्वेरी स्ट्रिंग को गड़बड़ाने urlencode()
से रोकने के लिए, URL भागों का एक क्वेरी स्ट्रिंग बनाता है और इन हिस्सों (दो स्लैश के बीच सब कुछ) का उपयोग &
करता है। ये एन्कोड किए गए वर्ण आपको यह सोचने के लिए प्रेरित कर सकते हैं कि समस्या वहां रहती थी, लेकिन क्वेरी स्ट्रिंग को पार्स करते समय वे वास्तव में उनके संबंधित "वास्तविक" वर्णों में बदल जाते हैं।
अनुरोध के साथ जुड़े क्वेरी को चलाना
WordPress द्वारा URL को पार्स करने के बाद, यह मुख्य क्वेरी क्लास सेट करता है WP_Query
, जो क्लास के उसी main()
तरीके से किया जाता है WP
। गोमांस WP_Query
अपनी get_posts()
विधि में पाया जा सकता है जहां सभी क्वेरी तर्क पार्स और sanitized हैं और वास्तविक SQL क्वेरी का निर्माण किया जाता है (और, अंततः, रन)।
इस विधि में, लाइन 2730 पर, निम्नलिखित कोड निष्पादित किया गया है:
$q['name'] = sanitize_title_for_query( $q['name'] );
यह पोस्ट टेबल से लाने के लिए पोस्ट को सैनिटाइज करता है। लूप के अंदर डिबगिंग जानकारी प्रदर्शित करने से पता चलता है कि यह वह जगह है जहां समस्या रहती है: आपका पोस्ट नाम my-permalink~
, में रूपांतरित हो जाता है my-permalink
, जो तब डेटाबेस से पोस्ट लाने के लिए उपयोग किया जाता है।
पद शीर्षक स्वच्छता समारोह
फ़ंक्शन उचित मापदंडों के साथ sanitize_title_for_query
कॉल करता है sanitize_title
, जो शीर्षक को पवित्र करने के लिए आगे बढ़ता है। अब इस फ़ंक्शन का मूल sanitize_title
फ़िल्टर लागू कर रहा है :
$title = apply_filters( 'sanitize_title', $title, $raw_title, $context );
इस फ़िल्टर में, मूल वर्डप्रेस, इससे जुड़ा एक एकल फ़ंक्शन है sanitize_title_with_dashes
:। मैंने इस फ़ंक्शन का एक व्यापक अवलोकन लिखा है, जो यहां पाया जा सकता है । इस फ़ंक्शन में, वह रेखा जो आपकी समस्या का कारण बन रही है
$title = preg_replace('/[^%a-z0-9 _-]/', '', $title);
यह रेखा अल्फ़ान्यूमेरिक वर्ण, रिक्त स्थान, हाइफ़न और अंडरस्कोर को छोड़कर सभी वर्णों को स्ट्रिप करती है।
आपकी समस्या का समाधान
इसलिए, मूल रूप से आपकी समस्या को हल करने का एक ही तरीका है: sanitize_title_with_dashes
फ़ंक्शन को फ़िल्टर से निकालना और इसे अपने स्वयं के फ़ंक्शन के साथ बदलना। यह वास्तव में ऐसा करना मुश्किल नहीं है, लेकिन :
- जब वर्डप्रेस टाइटल को सैनिटाइज करने की आंतरिक प्रक्रिया को बदलता है, तो इससे आपकी वेबसाइट पर बड़ा प्रभाव पड़ेगा।
- इस फिल्टर में हुक करने वाले अन्य प्लगइन्स नई कार्यक्षमता को सही ढंग से संभाल नहीं सकते हैं।
सबसे महत्वपूर्ण : वर्डप्रेस इस पंक्ति द्वारा सीधे SQL क्वेरी में sanitize_title
फ़ंक्शन के परिणाम का उपयोग करता है :
$where .= " AND $wpdb->posts.post_name = '" . $q['name'] . "'";
क्या आपको कभी फ़िल्टर को बदलने पर विचार करना चाहिए, सुनिश्चित करें कि आप क्वेरी में उपयोग होने से पहले शीर्षक को ठीक से छोड़ दें!
निष्कर्ष: जहां तक सुरक्षा का सवाल है, आपकी समस्या को हल करना आवश्यक नहीं है, लेकिन क्या आप इसे करना चाहते हैं, sanitize_title_with_dashes
अपनी कार्यक्षमता से बदलें और एसक्यूएल से बचने पर ध्यान दें।
NB सभी फ़ाइल नाम और लाइन नंबर वर्डप्रेस 4.4.2 फ़ाइलों के साथ मेल खाते हैं।