rewrite API در وردپرس (قسمت دوم)
در قسمت قبل از این مقاله ما تابع add_rewrite_rule رو معرفی کردیم و گفتیم که این تابع صرفا یک rule به متغیر wp_rewrite اضافه می کنه وبعد از اون ما میتونیم از query_var های پیش فرض استفاده کنیم. اگر بخواهیم از custom query_var استفاده کنیم باید از تابع add_rewrite_tag استفاده کنیم تا درخواست url کاربر به یک query_var جدید بره.
در مثال قبل ما از پارامتر های پیش فرض استفاده کردیم به طور مثال وقتی که کاربری slug رو با توجه به rule که اضافه کرده بودیم میاورد به عنوان مقدار پارامتر name فرستاده می شد.
حالا مثلا ما پست تایپی داریم که فیلم ها رو در اون ذخیره کردیم . در این پست تایپ ها meta فیلدی داریم که سال انتشار فیلم رو در خودش ذخیره کرده . و میخوایم که با کمک لینک ها درخواستی رو بدیم که با سال انتشار فیلم بتونه فیلم ها رو نمایش بده.
اگر دقت کرده باشید توضیح بالا یک مورد خاص می خواد که ما میگیم بهش custom query_var که به دو صورت میشه اون رو اضافه کرد.
راه حل اول) استفاده از فیلتر query_vars
اگر از این طریق اضافه کنیم همیشه و همه جا این query_var وجود داره. به مثال زیر توجه کنید:
<?php function rng_add_query_vars($vars) { $vars[] = "film_year"; return $vars; } // hook add_query_vars function into query_vars add_filter('query_vars', 'rng_add_query_vars');
خوب بعد از این کار می تونیم rule خودمون رو از طریق تابع add_rewrite_rule اضافه کنیم و در نهایت هم در کوئری خودمون پارامتر رو پیدا و ارسال کنیم.
راه حل دوم) استفاده از تابع add_rewrite_tag
تابع add_rewrite_tag
راه حل مناسبی برای تزریق query_var به لیست query_vars های پیش فرض صفحه است که وقتی با تابع add_rewrite_rule
همراه میشه می تونیم از طریق url یک درخواست شخصی سازی شده داشته باشیم که از custom query_var های خودمون استفاده می کنه.
<?php function create_new_url_querystring(){ add_rewrite_rule( '^film-year/([^/]*)$', 'index.php?film_year=$matches[1]', 'top' ); add_rewrite_tag('%film_year%','([^/]*)'); } add_action('init', 'create_new_url_querystring');
توضیح تابع create_new_url_querystring
- در قسمت اول این تابع یه rule جدید ساخته میشه که میگه اگر در لینک
film_year/
داشتیم بعد از اون هر چیزی اومد باید به عنوان مقدار متغیر file_year داده بشه . - در قسمت دوم این تابع اومده و گفته که query_var با نام film_year به لیست query_var های پیش فرض وردپرس داده بشه.
شرح پارامتر های add_rewrite_tag
- پارامتر اول همون tag هست که به عنوان query_var جدید می شناسیمش.
- پارامتر دوم همون عبارت منظمی هست که باید با query_var جایگزین بشه.
حال اگر در لینکمون قسمتی شبیه به film_year/1390
داشته باشیم می تونیم به طرق مختلف query_var رو از اون بگیریم:
۱- از طریق متغیر $wp_query
<?php global $wp_query; $wp_query->query_vars['film_year'];
۲- از طریق تابع get_query_var
<?php get_query_var("film_year");
استفاده از تابع add_rewrite_endpoint
در این تابع کار نسبتا ساده تری نسبت به ترکیب توابع add_rewrite_rule و add_rewrite_tag داریم. چرا که نیاز به پیچیدگی هایی نظیر استفاده از عبارات منظم نیست.
عملکرد این تابع به گونه ای است که query_var با نامی که به عنوان endpoint بهش اضافه کردیم رو به لیست query_vars های وردپرس اضافه می کنه و مقداری که بعد از اون بیاد رو به عنوان مقدار این query_var جدید اضافه می کنه .
ساختار کلی این تابع به شکل زیر است:
<?php add_rewrite_endpoint( $name, $places ); ?>
- name : این همون endpoint هست که قراره به انتهای لینک ما اضافه بشه.
- place : این که این endpoint که ما به انتهای لینک اضافه کردیم در کجا معتبر باشه .
مکان ها یا place های موجود برای این تابع از ساختار EP_*
تشکیل شده که شامل ثوابت زیر هست:
- EP_NONE : یعنی هیچ جا
- EP_PERMALINK
- EP_ATTACHMENT
- EP_DATE
- EP_YEAR
- EP_MONTH
- EP_DAY
- EP_ROOT : این به معنی روت وب سایت یعنی همون دامنه اصلی بدون هیچ مقدار اضافی (مثال توی همین وب سایت خودمون :
https://gnutec.net
) - EP_COMMENTS
- EP_SEARCH
- EP_CATEGORIES
- EP_TAGS
- EP_AUTHORS
- EP_PAGES : یعنی داخل برگه ها. این بدین معنیه که در ادامه نام برگه بیاد.
- EP_ALL_ARCHIVES : این مورد شامل تمامی موارد EP_DATE | EP_YEAR | EP_MONTH | EP_DAY | EP_CATEGORIES | EP_TAGS | EP_AUTHORS می شود.
- EP_ALL : این مورد شامل همه جا است.
توضیح مکان ها یا موارد بالا:
مثال زیر را در نظر بگیرید
<?php if(!function_exists("rudy_add_rewrite_rule")){ function rudy_add_rewrite_rule(){ add_rewrite_endpoint( 'photos', EP_PAGES ); } } add_action('init' , 'rudy_add_rewrite_rule');
حال لینک https://gnutec.net/test/photos/ali/
رو در نظر بگیرید. در این لینک endpoint = photos و مقدار photos = ali می باشد در نتیجه query_var به صورت زیر اضافه می گردد:
["photos"]=> string(3) "ali"
ما در مثال بالا گفتیم که یک endpoint با نام photos به انتهای هر برگه ای که بیاد در نتیجه محتوای برگه به درستی نمایش داده میشه و علاوه بر اون یک query_var جدید به لیست query_vars های صفحه اضافه میشه که مقدارش همون مقداریه که بعد از endpoint با نام photos اومده .
خوب چون ما مکان رو EP_PAGES تعیین کردیم اگر در صفحه دیگری مثل آرشیو یا صفحات داخلی پست ها یا root وب سایت این چنین لینکی درخواست داده بشه خطای ۴۰۴ میده و query_var برای ما اضافه نمیشه.
نکته ظریف : در صفحه حساب کاربری ووکامرس از rewrite_endpoint استفاده شده که به ازای هر endpoint که میتونه مقدار download , edit-address , edit-account یک سری اطلاعات نمایش داده میشه.
ماچ به کلت یه جا درست پیدا نکردم اینا رو توضیح داده باشه
دمت گرم