আমাকে ওয়ার্ডপ্রেসটির 'অনুরোধের প্রক্রিয়াজাতকরণ, এবং ওয়ার্ডপ্রেস পরিবর্তন করার একটি পদ্ধতি' বর্ণনা অনুসারে আপনার লক্ষ্যগুলি সম্পাদন করতে পারি।
অনুরোধটি পার্স করা হচ্ছে
ওয়ার্ডপ্রেস কোনও অনুরোধ পেলে এটি অনুরোধটি ছড়িয়ে দেওয়ার এবং এটি একটি পৃষ্ঠায় রূপান্তর করার প্রক্রিয়া শুরু করে। এই প্রক্রিয়াটির মূলটি শুরু হয় যখন ওয়ার্ডপ্রেস মূল ক্যোয়ারী পদ্ধতি WP::main()
বলা হয়। এই ফাংশনটি parse_request()
(ইন includes/class-wp.php
) -তে আপনি সঠিকভাবে সনাক্ত হিসাবে, ক্যোয়ারিকে পার্স করেছে । সেখানে, ওয়ার্ডপ্রেস পুনরায় লেখার নিয়মের একটির সাথে URL মিলানোর চেষ্টা করে । যখন ইউআরএলটি ম্যাচ করা হয়, তখন এটি ইউআরএল অংশগুলির একটি কোয়েরি স্ট্রিং তৈরি করে এবং urlencode()
বিশেষ অক্ষর যেমন &
ক্যোরির স্ট্রিং গণ্ডগোল থেকে বিরত রাখার জন্য বিশেষ অক্ষরগুলি রোধ করে এই অংশগুলি (দুটি স্ল্যাশের মধ্যে সমস্ত কিছু) এনকোড করে । এই এনকোডযুক্ত অক্ষরগুলির কারণে আপনার মনে হতে পারে যে সমস্যাটি সেখানেই রয়ে গেছে, তবে ক্যোয়ারীর স্ট্রিংটিকে বিশ্লেষণ করার সময় এগুলি প্রকৃতপক্ষে তাদের সম্পর্কিত "প্রকৃত" অক্ষরগুলিতে পরিণত হয়েছে।
অনুরোধের সাথে সম্পর্কিত ক্যোয়ারী চালানো হচ্ছে
ওয়ার্ডপ্রেস ইউআরএল পার্স করার পরে এটি মূল ক্যোয়ারী ক্লাস সেট আপ করে WP_Query
, যা ক্লাসের একই main()
পদ্ধতিতে করা হয় WP
। এর গোশতটি WP_Query
তার get_posts()
পদ্ধতিতে পাওয়া যাবে যেখানে সমস্ত ক্যোয়ারী আর্গুমেন্টগুলি পার্স এবং স্যানিটাইজ করা হয় এবং আসল এসকিউএল কোয়েরিটি নির্মিত হয় (এবং শেষ পর্যন্ত চালানো হয়)।
এই পদ্ধতিতে, 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
ফিল্টার থেকে ফাংশনটি সরিয়ে ফেলা এবং এটি আপনার নিজের ফাংশন দ্বারা প্রতিস্থাপন। এটি করা এতটা কঠিন নয়, তবে :
- ওয়ার্ডপ্রেস যখন স্যানিটাইজিং শিরোনামগুলির অভ্যন্তরীণ প্রক্রিয়া পরিবর্তন করে, তখন এটি আপনার ওয়েবসাইটে বড় প্রভাব ফেলবে।
- এই ফিল্টারটিতে আবদ্ধ হওয়া অন্যান্য প্লাগইনগুলি নতুন কার্যকারিতাটি সঠিকভাবে পরিচালনা করতে পারে না।
সর্বাধিক গুরুত্বপূর্ণ : ওয়ার্ডপ্রেস সরাসরি এই লাইন দ্বারা এসকিউএল কোয়েরিতে sanitize_title
ফাংশনটির ফলাফল ব্যবহার করে :
$where .= " AND $wpdb->posts.post_name = '" . $q['name'] . "'";
আপনি যদি কখনও ফিল্টার পরিবর্তন করার বিষয়টি বিবেচনা করেন তবে নিশ্চিত হয়ে নিন যে ক্যোয়ারীতে এটি ব্যবহারের আগে আপনি শিরোনামটি সঠিকভাবে এড়িয়ে গেছেন!
উপসংহার: আপনার সমস্যার সমাধান যতক্ষণ না সুরক্ষা সম্পর্কিত, তবে এটি sanitize_title_with_dashes
আপনার নিজের কার্যকারিতাটি প্রতিস্থাপন এবং এসকিউএল পলায়নের দিকে মনোযোগ দেওয়া উচিত it
এনবি সমস্ত ফাইলের নাম এবং লাইন নম্বর ওয়ার্ডপ্রেস ৪.৪.২ ফাইলের সাথে মিলে যায়।