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

rewrite API در وردپرس (قسمت اول)

اگر شما وردپرس روی وب سرویس آپاچی نصب کرده باشید قطعا از rewrite API استفاده می کنید(حتی اگر آشنایی باهاش نداشته باشید).

شاید تا به حال با redirect کار کرده باشید.زمانی که مرورگر شما رو به لینک دیگری میفرسته . یعنی وقتی لینکی رو باز می کنید location bar در مرورگر شما تغییر می کنه و شما به جای دیگری هدایت میشید.این کار توسط پی اچ پی و با تغییر http header اتفاق می افته .

<?php 
header("Location: http:gnutec.ir");

rewrite هم شبیه به redirect عمل می کنه با این تفاوت که تموم این اتفاقات در پشت صحنه اتفاق می افته .(منظور از پشت صحنه تنظیمات آپاچی است)

اگر با وب سرور آپاچی آشنا باشید می دونید که با تغییر در تنظیمات این وب سرور می تونید که درخواست های کاربران از طریق url رو مدیریت کنید که این کار با قرار دادن فایل .htaccess در روت پروژه تون اتفاق می افته .

در حقیقت وب سرور عمل rewriting رو انجام میده و شما با توابع وردپرس تنها درخواست های url ها رو مدیریت می کنید.(در index.php درخواست ها مدیریت میشه)

نگاهی کوتاه به تنظیمات فایل .htaccess در وردپرس می کنیم:

<IfModule mod_rewrite.c>
    # enable rewriting
    RewriteEngine on

    # don't rewrite files that exist in the file system
    RewriteCond %{REQUEST_FILENAME} !-f

    # don't rewrite directories that exist in the file system
    RewriteCond %{REQUEST_FILENAME} !-d

    # rewrite the request to index.php
    RewriteRule ^ index.php [QSA,L]
</IfModule>
  • در ابتدا چک میشه که آیا rewrite module فعال هست یا خیر ( خط ۳ )
  • بعد یک شرط رو داریم که می پرسه آیا درخواست به یک فایل مشخص داده شده ؟‌ (خط ۶)
  • بعد یک شرط رو داریم که می پرسه آیا درخواست به یک دایرکتوری مشخص داده شده ؟ (خط ۹)
  • در نهایت اگر دو شرط قبل برقرار نبود درخواست رو به index.php می فرسته و از اونجا به بعد شما می تونید با توجه به توابع وردپرس درخواست رو مدیریت کنید.(خط ۱۲)

چگونه وردپرس از rewrite API برای مدیریت لینک ها استفاده می کنه؟

خود وردپرس هم از rewrite API برای مدیریت لینک ها استفاده می کنه . یعنی وقتی درخواستی به index.php داده میشه از روی rule جاری میاد و درخواست رو تبدیل به یه سری query_variable می کنه و در نهایت کوئری مربوطه زده می شه و محتوا نمایش داده میشه.

rule جاری همون قسمت تنظیمات permalink یا پیوند های یکتا هست که شما از روی تنظیمات > پیوند های یکتا تعیین کردینش. این در پایگاه داده وردپرس فیلدی با نام rewrite_rules از جدول wp_options هست.

پس به وسیله rewrite API ما می تونیم لینک ها رو از حالت پلشت http://example.com/?p=1  به حالت مرتب و تمیز http://example.com/hello-world  در بیاریم.

rule های پیش فرض در وردپرس

در زیر rule های پیش فرض در وردپرس رو می تونید مشاهده کنید. این ها همون مواردی هستند که در تنظیمات > پیوند های یکتا تعیین کردینشون.

category/(.+?)/page/?([0-9]{1,})/?$ => index.php?category_name=$matches[1]&paged=$matches[2]
category/(.+?)/?$ => index.php?category_name=$matches[1]
tag/([^/]+)/?$ => index.php?tag=$matches[1]
page/?([0-9]{1,})/?$ => index.php?&paged=$matches[1]
([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$ => index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]
(.+?)(/[0-9]+)?/?$ => index.php?pagename=$matches[1]&page=$matches[2]

همون طور که می بینید ما در سمت چپ یک rule داریم و در سمت راست گفتیم چطور url با توجه به این rule مدیریت میشه.

به طور مثال در rule گفتیم که category/(.+?)/page/?([0-9]{1,})/?$  یعنی که یعنی لینک http://example.com/category/film/paged/2 تبدیل بشه به index.php?category_name=film&paged=2 و با set شدن query_variable ها کوئری تکمیل بشه و اطلاعات نمایان.

برای مشاهده تمامی rule های پیش فرض وردپرس به لینک مراجعه کنید.

افزودن custom rule با استفاده از فیلتر rewrite_rules_array

شما به وسیله این فیلتر می تونید یک rule به وردپرس اضافه یا کم کنید.

rule ها در وردپرس در متغیر $wp_rulesدر متد rules به صورت آرایه هستند که ما می تونیم مقداری رو به اون اضافه یا کم کنیم.(با استفاده از تابع add_rewrite_rule هم این کار امکان پذیره)

<?php
function rng_add_rewrite_rules($rules) {
$NewRules = array('msds-pif/([^/]+)/?$' => 'index.php?pagename=msds-pif&msds_pif_cat=$matches[1]');
array_push($rules,$NewRules);
return $rules;
}
 
// hook add_rewrite_rules function into rewrite_rules_array
add_filter('rewrite_rules_array', 'rng_add_rewrite_rules');

برای حذف یک rule می تونید از فیلتر زیر استفاده کنید.

<?php
function kill_feed_rewrites($rules){
    foreach ($rules as $rule => $rewrite) {
        if ( preg_match('/^foo.*(feed)/',$rule) ) {
            unset($rules[$rule]);
        }
    }
    return $rules;
}
add_filter('rewrite_rules_array', 'kill_feed_rewrites');

افزودن یک custom rule به وردپرس با تابع add_rewrite_rule

به وسیله تابع زیر شما می تونید یک rule به وردپرس ( متغیر $wp_rulesدر متد rules ) اضافه کنید و در اکشن template_redirect به اون از طریق query_var دسترسی داشته باشید.

<?php
//Add rewrite rule for a pattern matching "post-by-slug/<post_name>"
function rewrite_rule_example() {
	add_rewrite_rule('^post-by-slug/(.*)/?', 'index.php?name=$matches[1]', 'top');
        flush_rewrite_rules();
}
add_action('init', 'rewrite_rule_example');
  • پارامتر اول این تابع یک عبارت منظم (regular expression) است که تعیین می کنه چه رشته ای بعد از /post-by-slug میتونه وجود داشته باشه و اون رو در متغیر $matches میریزه که در نهایت این متغیر یک آرایه از مواردی هست که از سمت چپ با عبارت منظم ما همخوانی داشته .
  • پارامتر دوم این تابع نحوه اعمال مورد match شده واقع در متغیر $matches هست که برای یکی از query_var ها set میشه. حال میتونه این query_variable از موارد پیش فرض وردپرس باشه یا این که توسط خود ما ( یا با تابع add_rewrite_tag یا فیلتر query_vars ) اضافه شده باشه.
  • پارامتر سوم اولویت اعمال این rule رو تعیین می کنه که می تونه یکی از موارد top یا bottom باشه که در صورت برخورد کدوم rule اولویت داشته باشه (به صورت پیش فرض top است)
  • بعد از اعمال این تابع ما از تابع flush_rewrite_rules(); استفاده می کنیم که برای ریستارت شدن rule ها استفاده میشه.
  • برای اینکه تابع flush_rewrite_rules(); سربار زیادی داره ما پروسه خودمون رو (تابع rewrite_rule_example) به اکشن init میزنیم . در صورتی که از پلاگین برای افزودن rule استفاده می کنید از register_activation_hook استفاده کنید.
  • در مثالی که زدیم name یک query_var پیش فرض وردپرس بود که بدین ترتیب هر slug از پست بعد از post-by-slug بیاد به عنوان پارامتر name به کوئری داده میشه .

نکته : پارامتری که در مثال اضافه کردیم اگر از قبل در  لیست query_vars وجود داشته باشه میتونه مقدار دهی بشه ولی اگر از قبل وجود نداشته باشه قابل دسترسی نیست مگر این که با استفاده از تابع add_rewirte_tag اون رو به لیست query_var اضافه کنیم.در مثالی که در بالا ذکر کردیم name یک query_variable است که به صورت پیش فرض در وردپرس موجوده ولی مثلا اگر rng بود(مثال عرض می کنم خدمتتون) با استفاده از توابع query_vars قابل دستیابی نبود. پس add_rewrite_rule به تنهایی فقط برایquery_var های پیش فرض کاربرد داره.

نکته مهم : برای ساخت query_var شخصی باید یا از فیلتر query_vars استفاده کنید یا از تابع add_rewrite_tag تا بتونید query_var شخصی خودتون رو اضافه کنید و  در نهایت با قوانینی که در تابع add_rewrite_rule ساختید بتونید اون رو مقدار دهی کنید. (پس query_var شخصی اگر مقدار دهی نشه به تنهایی کاربردی نداره و حتی نمایش هم داده نمیشه).

نکته مهم : دقت داشته باشید عبارت دوم را در ‘ ‘ ( تک کوتیشن ) قرار بدید تا متغیر $matches رو نشناسه . چون چنین متغیری فقط در زمان پیاده سازی تابع استفاده میشه و در زمانی که ما داریم تابع رو فراخوانی می کنیم اصلا تعریف نشده.

نکته مهم : بعد از این که این custom rule به لیست rule های موجود اضافه شد کار ما تمومه . ولی اگر تابع افزودن rule رو غیر فعال کنید و لینک ها رو ریستارت کنید دیگه custom rule های شما وجود ندارند. یعنی با ریستارت کردن لینک ها rule ها هم ریستارت میشن و باید دوباره در اکشن init که در بعد از ریستارت کردن لینک موجوده دوباره اضافه بشن.

 

 

مطالب مشابه

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

تکسونومی ها (taxonomy) در وردپرس

در این مقاله قصد داریم تا دسته بندی ها و تگ ها یا به صورت کلی تر taxonomy ها رو در وردپرس بررسی کنیم و پارامتر های تابع...

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

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

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

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

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