هوک ها در وردپرس، معرفی اکشن

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

هوک ها در وردپرس به دو دسته اصلی تقسیم می شوند:

  1. هوک های اکشن (action)
  2. هوک های فیلتر (filter)

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

هوک اکشن

برای اینکه تابعی به عنوان یک تابع اکشن در نظر گرفته شود باید برای یک هوک اکشن ثبت گردد. هنگامی که در مرحله مشخصی از اجرای وردپرس یا وقوع رویدادی هوک اکشن مورد نظر فراخوانده شود، این فراخوانی سبب اجرای تمامی توابع ثبت شده برای آن هوک می گردد. در توسعه پلاگین ها، یکی از مهمترین اقدامات، تعریف توابع (اکشن هایی) است که عملکرد خاصی را در زمان فراخوانی هوک ها باید به اجرا در آورند. برای این منظور، از تابع add_action برای افزودن یک تابع به لیست توابع ثبت شده برای یک هوک اکشن مشخص استفاده می کنیم. این تابع چهار پارامتر ورودی می پذیرد که دو پارامتر اول آن اجباری است. پارامتر اول، نام هوک اکشن اجرایی، پارامتر دوم نام تابعی که با اجرای هوک فراخوانده می شود. پارامتر سوم عددی است که تعیین کننده اولویت اجرای تابع است. هر چه عدد کوچکتر باشد، از اولویت بالاتری برخوردار بوده و زودتر اجرا می شود. پارامتر چهارم بیان کننده تعداد پارامترهایی است که از طرف هوک به تابع ارسال می شود.

مثال:

<?php             
add_action( 'wp_footer', 'mbpt_footer_message', 100); 
function mbpt_footer_example () {                          
    echo 'This site is built using  WordPress';             
}
?>

در مثال فوق، تابع mbpt_footer_message برای اجرا توسط هوک wp_footer به ثبت می رسد. هوک wp_footer در قالب وردپرس و درست پیش از بسته شدن تگ html صفحه فراخوانده می شود. کد فوق، پیامی را به انتهای صفحه (فوتر) اضافه می کند. عدد 100 باعث می شود تا تابع mbpt_footer_message دیرتر از سایر توابع ثبت شده برای هوک wp_footer به اجرا در آید.

حذف تابع اکشن

در وردپرس از تابع remove_action برای حذف تابع ثبت شده برای یک هوک استفاده می شود. برای حذف تابع اکشن، آن تابع باید پیش از حذف توسط add_action ثبت شده باشد. در غیر این صورت، تابع remove_action نمی تواند تابع اکشن را از هوک مورد نظر حذف کند. این تابع نیز، همانند add_action چهار پارامتر ورودی می­ پذیرد که دو پارامتر اول آن (یعنی نام هوک و نام تابع) اجباری هستند. پارامتر سوم ورودی عدد اولویت اجرای تابع و پارامتر آخر تعداد پارامترهایی است که action می پذیرد. با اجرای remove_action، در صورت حذف موفقیت آمیز تابع action، تابع remove_action مقدار true و در صورت عدم موفقیت، مقدار false را برمی گرداند.

در صورتی که بخواهیم تمامی action های ثبت شده برای یک هوک را حذف کنیم، تابع remove_all_actions این امکان را برای ما فراهم می آورد. این تابع دو پارامتر ورودی می پذیرد. پارامتر اول نام هوک و پارامتر دوم عدد اولویت که اختیاری است و در صورت مقداردهی توابعی که دارای عدد اولویت مشخص شده باشند، حذف می گردند.

مثال:

<?php
Remove_all_actions ('wp_head');
?>

کد فوق تمامی توابع ثبت شده برای هوک wp_head را بدون توجه به اولویت آنها حذف می کند. برای حذف توابع ثبت شده برای هوک wp_head که دارای اولویت 1 هستند می توانیم از کد زیر استفاده نماییم:

<?php
Remove_all_actions ( 'wp_head', 1 );
?>

بررسی وجود اکشن

برای کنترل وجود اکشن برای هوک ها می توان از تابع has_action استفاده کرد. این تابع دو پارامتر ورودی می پذیرد. پارامتر اول نام هوکی که وجود اکشن برای آن باید مورد بررسی قرار گیرد و پارامتر دوم که اختیاری است نام تابعی است که ثبت شدن آن برای هوک مورد نظر باید بررسی شود. در حالتی که تنها پارامتر اول برای has_action مقداردهی شود، این تابع در صورت وجود action مقدار true و در صورت عدم وجود مقدار false را برمی گرداند. اما در حالتی که پارامتر دوم تابع has_action نیز مقداردهی شده باشد، در صورت وجود تابع action مورد نظر برای آن هوک، عدد اولویت آن تابع action و در صورت عدم وجود مقدار false برگردانده می شود.

مثال:

<?php
if ( has_action( 'wp_footer' ) )
  echo '<p> An action has been registered for footer </p>';
else
  echo '<p> An action has not been registed for footer </p>';
?>

مثال:

<?php
if ( has_action( 'wp_footer' ,'mbpt_footer_new_action') )
  echo '<p> mbpt_footer_new_ action is registered for footer </p>';
?>

در مثال فوق، در صورتی که تابع mbpt_footer_new_action با add_action برای هوک wp_footer ثبت شده باشد، با اجرای کد فوق پیام در فوتر سایت به نمایش در می آید.

اجرای اکشن

در وردپرس برای اجرای توابع ثبت شده برای یک هوک اکشن از تابع do_action استفاده می شود. پارامتر اول این تابع عنوان هوک اکشن و پارامترهای ورودی بعدی مقادیر ارسالی برای اکشن های ثبت شده است که برای هوک های مختلف تعداد آن متفاوت می باشد.

مثال:

<?php
do_action ( 'wp_head' );
?>

هوک wp_head در بخش head سایت به اجرا در می آید و معمولا برای افزودن تگ های مرتبط با اسکریپت ها و استایل های مورد استفاده قرار می گیرد. با اجرای کد فوق تمامی توابع ثبت شده برای هوک wp_head به اجرا در می آیند.

در صورتی که بخواهیم به جای استفاده از چندین پارامتر اضافی به توابع action، آرایه ای از پارامترهای مورد نیاز توابع ثبت شده را ارسال نماییم می توانیم از تابع do_action_ref_array استفاده کنیم. پارامتر اول ورودی این تابع نام هوک و پارامتر دوم آرایه ای از پارامترهای ارسالی مورد نظر باید باشد.

مثال:

<?php
 
do_action_ref_array( 'pre_get_posts', array( $this) );
?>

وردپرس هوک pre_get_posts را پیش از بارگذاری پستها از دیتابیس به اجرا در می آورد. در صورتی که بخواهیم پست ها را در صفحه خانه سایت به طور تصادفی مرتب نماییم می توانیم تابع اکشنی روی این هوک ثبت کنیم و این تغییر را اعمال نماییم:

<?php
add_action ( 'pre_get_posts', 'mbpt_new_order' );

function mbpt_new_order ( $query ) {
    if( $query->is_home  &amp;&amp; empty( $query->query_vars['suppress_filters']  ) )
    $query->set( 'orderby' , 'rand' );
}
?>

بررسی اجرای اکشن

برای کنترل اجرای یک هوک اکشن و یا تعیین تعداد دفعات اجرای یک هوک اکشن از تابع did_action استفاده می شود. این تابع تنها پارامتر نام هوک اکشن مورد نظر را به عنوان ورودی می پذیرد. در صورتی که هوک قبلا به اجرا در آمده باشد تعداد دفعات اجرا و در غیر این صورت مقدار false  برگردانده می شود.

مثال:

<?php

  if( did_action( 'plugins_loaded' ) )
   define ( 'MBPT_CONST' , true );
?>

در مثال فوق، اگر هوک plugins_loaded قبلا به اجرا در آمده باشد، ثابت MBPT_CONST با مقدار true تعریف می شود.

هوک های اکشن پرکاربرد

هوک plugin_loaded

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

مثال:

<?php
add_action(  'plugins_loaded' , 'mbpt_load_textdomain' );
() { function mbpt_load_textdomain 
	  load_plugin_textdomain( 'follow-for-bbpress', false, plugin_basename( 
dirname( __FILE__ ) ) . '/languages/' );
	}

?>

در کد فوق، در زمان بارگذاری پلاگین ها، فایل زبان پلاگین که در پوشه languages قرار دارد، بارگذاری می شود.

هوک init

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

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

هوک admin_menu

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

هوک template_redirect

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

مثال: بارگذاری یک فایل css برای نمایش صفحه یک پست

<?php
add_action( 'template_redirect' , 'mbpt_add_css_file' );

function mbpt_add_css_file () {
   if ( is_singular('post') )
{ 
wp_enqueue_style( 'bbpf-frontend-style', plugins_url( 'css/style.css', __FILE__ ) ); 
}
  
 }

?>

هوک wp_head

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

مثال: افزودن توضیحات سایت به تگ head صفحه

<?php
add_action ( 'wp_head', 'bmpt_add_meta_desc' );

function bmpt_add_meta_desc () {
  
  $desc = esc_attr ( get_bloginfo('description') );

   if ( !empty( $desc ) )
  echo  '<meta  name="description"  content=" '.$desc .' "  />';
}

?>

Related posts