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

Hooks: Actions and Filters

هیچ وقت هسته وردپرس رو تغییر ندید (do’nt touch the core) . بدین معنی هست که برای هک وردپرس راه دیگری غیر از تغییر مستقیم در کدها باید طی کنید. هوک یا قلاب (به انگلیسی: Hooks) همون راهی هست که برای پیاده سازی ساختار های شخصی خودتون روی وردپرس تعبیه شده. دو مورد از مهم ترین موارد اون Actions و Filters هستند. بدین ترتیب پس از بروزرسانی هسته یا پلاگین تغییرات شما حفظ میشه.

Actions Hook

Action ها یه سری وقایع مشخص هستند که در وردپرس تعبیه شدند ، مثل انتشار یک پست ، تغییر یک تم .

Action های زیادی در وردپرس داریم که شما می تونید تابع خودتون رو به اون Action خاص قلاب کنید. بدین ترتیب در زمان اجرا وقتی وردپرس به Action شما میرسه اون تابعی که براش تعریف کردید رو اجرا می کنه.(در زمان اون واقعه-action- تابع شما -custom php function- اجرا میشه)

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

همچنین شما می تونید یه action خودتون تعریف کنید تا بشه در اون زمان یه تابع خاص بهش تزریق بشه. میتونید همراه action که ساختید یه سری پارامتر هم بفرستید یعنی در واقع به تابعی که قراره در زمان اون action اجرا بشه یه سری آرگومان دادید.

برای ساخت action از تابع do_action استفاده می کنیم.

برای قلاب تابع به action از تابع add_action استفاده می کنیم.

تابع do_action

برای ساخت action . ساختار این تابع به شکل زیر است:

<?php do_action( string $tag,  $arg = '' ); ?>

پارامتر های این تابع:

  • tag : این نام action هست که قراره ایجاد بشه.
  • arg : این پارامتر هست که برای تابع قلاب شونده تعبیه شده . اگر هر تعداد پارامتر لازم داشتید کافیه به ترتیب پشت سر هم بیاریدشون توی تابع do_action تا کاربری تابع قلاب می کنه پارامتر های شما رو با همون ترتیب ازشون استفاده کنه.

تابع add_action

برای قلاب کردن یک تابع به یک action خاص . ساختار تابع به شکل زیر است.

<?php dd_action( string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1 ); ?>

پارامتر های تابع :

  • tag : نام action که قراره تابع از اونجا قلاب بشه.
  • function_to_add : تابعی که قراره قلاب بشه.
  • priority : ترتیب اجرای توابع قلاب شده به action . اعداد کوچکتر با اولویت بیشتر (یعنی زودتر). و اعداد بزرگتر با اولویت کمتر (یعنی دیرتر) در صف توابع اجرا می شوند. مثلا تابعی با priority برابر با 10 زودتر از تابع با priority برابر با 20 اجرا میشه.
    مقدار پیش فرض برای این پارامتر عدد 10 است.
    دقت داشته باشید که تابعی که دیر تر اجرا می شود در بعضی موارد بر موارد بالا تر override می شود. به طور مثال در تابعی با اولویت 10 مقدار متغیر $column برابر با ’12’ هست و در تابعی با اولویت 20 مقدار متغیر $column برابر  ’18’ است. در نهایت مقدار متغیر ’18’ می شود. اول اولویت 10 بعد اولویت 20 اجرا می شود.
  • accepted_args : تعداد پارامتر هایی که این تابع قراره بگیره . هر تعداد پارامتر در زمان ساخت action داشته باشید می تونید استفاده کنید.

در مثال زیر یک action با نام before_any_thing ایجاد کردیم و دو پارامتر $param1 و $param2 رو براش تعبیه کردیم.

<?php
$param1 = "first";
$param2 = "second";
do_action("before_any_thing",$param1,$param2);

خوب حالا یک تابع خاص رو بهش قلاب می کنیم و از پارامتر های تعبیه شده هم استفاده می کنیم.

<?php
 if(!function_exists("rudy_before_anything")){
     function rudy_before_anything($param1, $param2){
         echo "param1: {$param1} <br>";
         echo "param2: {$param2} <hr>";
    }
 }
 
 add_action("before_any_thing","rudy_before_anything",10,2);

Filters Hook

فیلتر همون طور که از نامش مشخصه یعنی یه سری خروجی رو فیلتر می کنه. پس وقتی سخن از خروجی میاد یعنی return . پس در فیلتر ها همیشه یه چیزی گرفته میشه و بعد از تغییر مجددن برگشت داده میشه.

مثلا نام slug یه پست تایپ که تعریف شده داخل یه فیلتر خاص قرار بگیره و این اجازه به کاربر داده بشه که slug رو تغییر بده.

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

نکته : پلاگین Simply Show Hooks برای محیط Development می تواند لیست Hook های موجود را برای شما در پنل ادمین و فرانت وب سایت نمایش دهد.

شما میتونید خودتون هم روی خروجی هاتون فیلتر بزارید .

برای ساخت فیلتر از تابع apply_filters استفاده می کنیم.

برای اعمال فیلتر از تابع add_filters استفاده می کنیم.

تابع apply_filters

این تابع برای ساخت فیلتر استفاده میشه. ساختار تابع به شکل زیر است:

<?php apply_filters( string $tag, mixed $value , $arg ) ?>

پارامتر های تابع:

  • tag : نام فیلتری که قراره تعبیه بشه.
  • value : اون مقداری که قراره روش فیلتر با نام (tag) اعمال بشه. در نهایت خروجی این تابع همین مقدار value هست که میتونه برگرده یا چاپ بشه . فکر کنید یه متغیر با مقدار value برای فیلتر شدن.
  • arg : پارامترهایی که قراره فرستاده بشه. ممکنه لازم باشه تابع فیلتر کننده از یه سری پارامترها استفاده کنه ولی در نهایت مقدار value هست که فیلتر میشه.

تابع add_filter

این تابع برای اعمال فیلتر استفاده میشه. ساختار تابع به شکل زیر است:

<?php add_filter( string $tag, callable $function_to_add, int $priority = 10, int $accepted_args = 1 ); ?>

پارامترهای تابع:

  • tag : نام فیلتر
  • function_to_add : تابعی که قراره عملیات فیلتر رو انجام بده.
  • periority : اولویت توابع در صف . کمترین مقدار برابر با بیشترین اولویت.
  • accepted_args :‌ تعداد پارامتر هایی که قراره این تابع بگیره. پارامتر ها رو در تابع function_to_add به همون ترتیبی که در apply_filters تعبیه شده استفاده می کنیم.

نکته مهم : ترتیب فراخوانی action ها و filter ها از پیش تعیین شده و ربطی به ترتیب قلاب کردن توابع شما به آن ندارد.

do_action_ref_array

این یک نوع اجرای Action می باشد که بسیار نزدیک به apply_filters می باشد . از این جهت که می توان پارامتر های موجود در action را به صورت Reference ارسال کرد. کاربرد این نوع از قلاب این است که اگر جایی نیاز بود که به صورت recursive یک Handler را اجرا کنیم از این تابع استفاده کنیم.

خوب می توان گفت که این را جایی قرار است استفاده کنیم که متغیر می تواند تغییر کند و همچنین apply_filters برای ما کاربرد ندارد. این حالت زمانی است که قرار است به تعداد لول های مورد نظر همین Handler روی پارامتر های مورد نظر این قلاب اتفاق بیفتد.

do_action_ref_array('woreadmin_hotel_category_list_terms_reference',[&$hotel_category_terms]);

خوب در بالا ما یک قلاب درست کردیم که قرار است لیست terms ها را برای ما به صورت Reference در اختیار قلاب قرار بدهد.حال می توان گفت که چون این متغیر از نوع ارجاع است هر تغییری روی آن به صورت add_action می تواند آن را تحت تاثیر قرار بدهد.

add_action('woreadmin_hotel_category_list_terms_reference','add_hotel_category_grandchildrens');

function add_hotel_category_grandchildrens(array &$terms_array,int $start=0){
  if(empty($terms_array)){
    return;
  }   
  foreach(array_slice($terms_array,$start) as $key => $term){
    $childrens = get_terms([
      'hide_empty' => false,
      'parent' => $term->term_id,
      'taxonomy' => 'product_cat',
    ]); 
    if(!empty($childrens) && !is_wp_error($childrens)){
      $postion = array_search($term,$terms_array) + 1;
      array_insert($terms_array,$position,$childrens);
      add_hotel_category_grandchildrens($terms_array,$position);
    }   
  }   
}   

روال handler بالا به این شکل است که term هایی که فرزند داشته باشد را به صورت لول به لول فرزندان آن ها را در جایگاه مناسب آن ها اضافه می کند.

مطالب مشابه

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

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

۰ دیدگاه برای Hooks: Actions and Filters

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

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