تعداد بازدید: 1761

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 یک سری اطلاعات نمایش داده میشه.

 

مطالب مشابه

آموزش نکات و تکنیک های برنامه نویسی وردپرس

پایگاه داده وردپرس

در این مقاله قصد داریم تا پایگاه داده وردپرس ۴.۴ رو بررسی کنیم. پایگاه داده این نسخه از وردپرس تا mysql نسخه 5.0.15 و...

آموزش نکات و تکنیک های برنامه نویسی وردپرس

نکات امنیتی وردپرس

چون وردپرس یک سیستم متن باز است لذا کدهای آن و ساختار پایگاه داده آن برای تمامی افراد قابل دسترس است . به همین منظور...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

2 دیدگاه برای rewrite API در وردپرس (قسمت دوم)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *