هوک های فیلتر در وردپرس

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

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

<?php

add_filter( 'wp_title' , 'mbpt_add_sitename_to_title' ,10, 2 );

 function mbpt_add_sitename_to_title( $title , $sep ) {
  
   $name = get_bloginfo('name');
   $title  .= $sep.'  '.$name;

return  $title;
}
?>

اجرای فیلتر

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

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

مثال:

<?php
     
   $this->posts = apply_filters_ref_array ( 'posts_results' , array( $this->posts) );
?>

هوک posts_results برای اعمال تغییرات بر روی درخواست دریافت اطلاعات پست ها از دیتابیس استفاده می شود.

حذف فیلتر

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

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

مثال:

<?php
remove_all_filters (‘the_content’);
?>

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

<?php
remove_all_filters ( ‘the_content’, 1 );
?>

بررسی وجود فیلتر

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

مثال:

<?php

 if( has_filter( ‘the_content’ ,’wpautop’ ) )
echo ‘Paragraphs are automatically formatted for the content.’;
?>

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

فیلتر در حال اجرا

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

مثال: جایگزینی واژگان مختلف با واژه wow برای هوک های the_title و the_content

<?php
 add_filter(‘the_title’,’mbpt_relace_wow’);
add_filter(‘the_content’,’mbpt_relace_wow’);

function mbpt_replace_wow ($text) {

 if( current_filter() == ‘the_title’)
  $words = array(‘ali’,’ahmad’);
elseif( current_filter() == ‘the_content’ )
 $words = array(‘reza’,’hamid’);

$text = str_replace ( $words , ‘wow’ , $text );

return $text;
}

?>

هوک های فیلتر پرکاربرد

هوک the_content

برای دستکاری و تغییر محتوای مطالب سایت از این هوک استفاده می شود. معمولا فیلترها برای تغییر فرمت بندی محتوا یا افزودن اطلاعات اضافی به پست های وردپرس از این هوک استفاده می کنند.

مثال:

<?php
add_filter ( ‘the_content’,’mbpt_related_posts’ );

function mbpt_related_posts ( $content ) {
if(!is_singular(‘post’))
return $content;
$terms = get_the_terms ( get_the_ID , ‘category’);
$cats = array();
foreach ( $terms as $term)
$cats[] = $term->term_id;
$posts = array();
$posts = get_posts ( array(‘numberposts’=>5 , ‘category’=> $cats , ‘exclude’=>  array(get_the_ID) ,’orderby’=>’rand’) ); 

 if(!empty($posts))
{
  $content .= ‘<ul class=”related_posts” >’;
     foreach( $posts as $post)
     {
      $content .= ‘<li><a href=”’.get_permalink($post->ID).’”>’.$post->post_title.’</li>’;
     }
   $content .=’</ul>’;
}
return $content;
}
?>

در مثال بالا لیستی شامل 5 مطلب مرتبط با مطلب فعلی به محتوا پست اضافه شده است. برای دریافت پست های مرتبط (مطالبی که دسته بندی یکسانی با پست فعلی دارند) از دیتابیس از تابع get_posts استفاده کردیم.

هوک the_title

مشابه هوک the_content، از این هوک نیز برای دستکاری و یا افزودن اطلاعات به عنوان مطالب (پست های) وردپرس استفاده می شود.

مثال: حذف تگ ها از عنوان

<?php
add_filter (‘the_title’, ‘mbpt_strip_tags_for_title’);

function mbpt_strip_tags_for_title ($title) {
$title = strip_tags($title);

return $title;
}
?>

هوک comment_text

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

مثال:

<?php
add_filter(‘comment_text’,’mbpt_add_author_id’);

function mbpt_add_author_id ($text) {
 global $comment;
  if($comment->user_id > 0)
{  
  $text .= ‘<p> Author ID is: ’. $comment->user_id.’</p>’;

}
return $text;
}

?>

در مثال فوق، به شرطی که نویسنده کامنت مهمان نباشد، آیدی نویسنده کامنت به انتهای کامنت اضافه می شود.

هوک template_include

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

استفاده از هوک ها در کلاس

در اغلب موارد، پلاگین ها از توابع به عنوان اکشن و فیلتر استفاده می کنند تا متدهای کلاس اما می توان متدهای یک کلاس را نیز به عنوان فیلتر یا اکشن یک هوک به ثبت رساند. برای این منظور پارامتر دوم add_filter یا add_action به جای نام تابع باید به صورت آرایه ای از نام کلاس و نام متد باشد.

مثال:

<?php
add_action(‘template_redirect’, array(‘mbpt_class_name’,’mbpt_method_name’) );

class mbpt_class_name {
function mbpt_method_name()
{
     if ( is_front_page() ) {
        wp_redirect( home_url( '/dashboard/' ) );
        die;
    }

}
}
?>

در مثال فوق، در صورت درخواست دسترسی به صفحه اصلی سایت، درخواست به صفحه داشبورد تغییر مسیر می دهد. نکته دیگری که لازم به ذکر است، در صورتی که بخواهیم متد فیلتر یا اکشن را در داخل همان کلاس ثبت کنیم، به جای نام کلاس باید از $this استفاده کنیم.

یافتن هوک ها

در بخش قبلی تعدادی از هوک های پرکاربرد را معرفی کردیم. تهیه لیست کاملی از هوک های وردپرس شاید کاری غیرممکن به نظر برسد. چرا که همراه با ارائه نسخه جدیدی از وردپرس احتمالا هوک های جدیدی نیز به مجموعه هوک ها اضافه خواهد شد. به عنوان یک توسعه دهنده پلاگین، آشنایی با هوک های هسته وردپرس امری ضروری است. یکی از راههای یافتن هوک ها، بررسی فایلهای وردپرس و جستجوی توابعی مانند do_action و apply_filters در میان کدها است. همان طور که گفتیم این توابع سازندگان هوک در وردپرس هستند. با این حال بررسی و جستجوی تعداد زیادی از فایلها ممکن است کاری خسته کننده و آزاردهنده باشد. شما از طریق لیست های مرجعی که در فضای وب وجود دارد نیز می توانید اطلاعات جامعی در مورد هوک ها به دست آورید. آدرس های زیر لیست جامعی از هوک های وردپرس را ارائه می دهند:

http://codex.wordpress.org/Plugin_API/Action_Reference

http://codex.wordpress.org/Plugin_API/Filter_Reference

Related posts