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

نکات و ترفندهای برنامه نویسی وردپرس

وردپرس می تواند کارهای متعددی را به واسطه برخورداری از قابلیت ارزشمندی به نام هوک(Hook یا قلاب) انجام دهد، هوک ویژگی است که به یک رویداد گوش می دهد و به محض اتفاق افتادن آن رویداد کدهایی که به آن قلاب شده است را فراخوانی و اجرا می کند.

وردپرس بیش از ۱۰۰ هوک مختلف دارد که در بخش های مختلف وردپرس استفاده می شوند:

  • یک هوک برای فراخوانی های Ajax
  • یک هوک هنگام ذخیره یک نوشته یا Post
  • یکی هنگام تایید دیدگاه یا Comment
  • یکی هنگام حذف نوشته از زباله دان
  • و …

هوک ها به دو دسته کلی اکشن(Action Hooks) و فیلتر(Filter Hooks) تقسیم بندی می شوند، اکشن و فیلتر توابعی هستند که اجازه می دهند کدهای سفارشی خود را در بخش های مختلف وردپرس به کمک توابع add_filter و add_action اجرا نمائید.

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

function modiredev_enqueue_scripts(){
 
    $uri = get_theme_file_uri();

    wp_register_style( 'custom-css', $uri . '/assets/css/custom.css' );

    wp_register_script( 'custom-js',
                         $uri . '/assets/js/custom.js',
                         array('jquery'), false, true);

    wp_enqueue_style( 'custom-css' );
    wp_enqueue_script( 'custom-js' );
}

add_action( 'wp_enqueue_scripts' , 'modiredev_enqueue_scripts' );

تابع add_action چهار پارامتر دارد که در کدهای بالا فقط از دو تای آن استفاده کردیم، تابع add_filter هم همین ساختار را دارد.

add_action( string $tag,
            callable $function_to_add,
            int $priority = 10,
            int $accepted_args = 1
    );
  1. اولین پارامتر نام هوکی است که می خواهیم به آن دسترسی داشته باشیم، مقدار این پارامتر رشته ای است و باید داخل کوتیشن باشد.
  2. پارامتر دوم تابعی است که می خواهیم در هنگام اتفاق افتادن هوک مدنظر(پارامتر اول) تریگر(Trigger)، اجرا یا فایر شود، اگر این تابع وجود نداشته باشد وردپرس خطا می دهد.
  3. سومین پارامتر الویت است که به صورت پیش فرض با ۱۰ مقداردهی می شود، یعنی اگر مقدار این پارامتر برای تابع add_action مشخص نشده باشد برای آن الویت اجرای ۱۰ در نظر گرفته خواهد شد، هر چه این عدد کوچکتر باشد الویت اجرای تابع بالاتر خواهد بود و بالعکس.
  4. چهارمین پارامتر تعداد آرگومان هایی است که یک تابع دریافت می کند، مقدار پیش فرض این پارامتر ۱ است.

برای اینکه بدانید هر هوک چه تعداد آرگومان می پذیرد حتما از مستندات وردپرس کمک بگیرد، مثلا اکشن هوک save_post بدین صورت تعریف شده است.

do_action( 'save_post', int $post_ID, WP_Post $post, bool $update )

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

function modiredev_save_post( $post_ID, $post, $update ) {
   // do stuff here
}

add_action( 'save_post', 'modiredev_save_post', 3 );

اگر فقط به پارامتر post_id$ نیاز دارید تابع سفارشی و add_action را اینگونه فراخوانی کنید.

function modiredev_save_post( $post_ID ) {
   // do stuff here
}

add_action( 'save_post', 'modiredev_save_post', 1 );

همانطور که ملاحظه کردید هوک ها(نه همه آنها) تعدادی پارامتر از پیش تعریف شده دارند که وردپرس مقادیرشان را در هنگام اجرای یک رویداد ارسال می کند.

آیا می توانم برای یک اکشن یا فیلتر پارامتر سفارشی تعریف کنم؟

بعد از کلی مقدمه چینی وارد بحث اصلی می شویم، احتمالا تا به حال به این موضوع فکر کرده اید که چگونه می توانم برای هوکی که ساختار آن از قبل تعریف شده است یک پارامتر دلخواه تعریف کنم؟

برای بررسی این موضوع از فیلتر هوک the_content استفاده کردیم، می خواهیم برای آن یک پارامتر دیگر به نام my_param$ تعریف کنیم.

function modiredev_the_content ( $content ) {
    return $content . '<br>Author: Saeed Yavarnia';
}
add_filter( 'the_content', 'modiredev_the_content');

احتمالا اولین راه حلی که به آن فکر می کنید تعریف یک پارامتر اضافی برای تابع modiredev_the_content است. متاسفانه این روش به هیچ عنوان کار نمی کند.

function modiredev_the_content( $content, $my_param ) {
    return $content;
}

برای حل این مشکل از توابع بی نام یا ناشناس( Closures – Anonymous Functions ) که از PHP نسخه ۵٫۳ به بعد پیاده سازی و معرفی شده اند استفاده می کنیم.

حالا تابع modiredev_the_content را اینگونه و به صورت بی نام پیاده سازی می کنیم.

$my_param = 'Author: Saeed Yavarnia';
add_filter( 'the_content', function ( $content ) use ( $my_param ) {
    return $content . '<br>' . $my_param;
});

در نهایت این آموزش را با یک مثال دیگر از توابع بی نام به اتمام می رسانیم.

function modiredev_set_page_title( $page_title = '' ){
    add_filter( 'document_title_parts',
               function ( $title_parts ) use ( $page_title ) {
                    $title_parts['title'] = $page_title;
                    $title_parts['site'] = get_bloginfo( 'name', 'display' );
                    return $title_parts;
       });
}

modiredev_set_page_title( 'عنوان تستی' );

با اکشن فیلتر document_title_parts می توانید اجزای یک صفحه وب(عنوان صفحه(Title Tag)، شماره صفحه در هنگام صفحه بندی(Pagination)، عنوان سایت(Site Title) و توضیحات مختصری از وب سایت(Tagline)) را به صورت داینامیک تغییر دهید.

برچسب ها
سعید یاورنیا 118 نوشته 120 دیدگاه

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

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

نشانی ایمیل شما منتشر نخواهد شد، بخش‌های موردنیاز با * مشخص شده‌اند.