چرا یک callback در چند فیلتر رفتار متفاوتی میخواهد؟ راهنمای current_filter
تابع current_filter برای دریافت نام فیلتر در حال اجرا در وردپرس؛ بررسی پارامترها، اشتراک callback بین چند فیلتر و اشتباهات رایج.
چرا دانستن نام فیلتر فعلی اهمیت دارد؟
در توسعه افزونه وردپرس، یکی از الگوهای رایج این است که یک تابع callback به چند فیلتر مشابه متصل شود. برای نمونه، ممکن است بخواهید فرمت خروجی عنوان را در چند فیلتر مختلف کنترل کنید یا محتوای خاصی را به چند بخش اضافه کنید. اگر این تابع در هر فیلتر رفتار یکسانی داشته باشد، نیازی به دانستن نام فیلتر نیست. اما اگر رفتار باید بر پایه فیلتر تغییر کند، تابعcurrent_filter() ابزار اصلی شماست.
این تابع به شما میگوید که کد شما در کدام فیلتر در حال اجرا است و امکان تنظیم رفتار را فراهم میکند.
تابع current_filter چیست؟
تابعcurrent_filter() یک تابع هسته وردپرس است که در فایل wp-includes/plugin.php تعریف شده است. این تابع نام فیلتر در حال اجرا را برمیگرداند.
خروجی این تابع یک رشته یا false است. اگر در داخل یک فیلتر فراخوانی شود، نام فیلتر را برمیگرداند. اگر خارج از فیلتر فراخوانی شود، false برمیگرداند.
نکته مهم این است که این تابع روی پشته $wp_current_filter کار میکند و آخرین عضو پشته را برمیگرداند.
امضای تابع و پارامترها
امضای این تابع بهشکل زیر است:function current_filter() {
global $wp_current_filter;
return end( $wp_current_filter );
}
این تابع هیچ پارامتر ورودی نمیگیرد و تنها یک رشته یا false برمیگرداند.
نکته مهم: تابع end() آرایه را تا انتها میبرد و آخرین عضو را برمیگرداند. اگر پشته خالی باشد، مقدار false برمیگردد.
سازوکار داخلی تابع
تابعcurrent_filter() از متغیر جهانی $wp_current_filter استفاده میکند. این متغیر یک آرایه است که نام هوکهای در حال اجرا را در خود نگه میدارد.
وقتی یک فیلتر فراخوانی میشود، نام آن به پشته اضافه میشود. تابع current_filter با end() آخرین عضو را برمیگرداند. در هوکهای تودرتو، نام درونیترین فیلتر برگردانده میشود.
نکته مهم: پشته پس از اجرا بهطور خودکار کاهش مییابد، بنابراین تغییرات در فیلترهای بیرونی بهدرستی مدیریت میشوند.
تفاوت با current_action
از نظر فنی،current_filter() و current_action() یکسان عمل میکنند و هر دو نام Hook فعلی را برمیگردانند. تفاوت در نامگذاری و کاربرد معنایی است:
- current_filter(): در زمینه فیلترها استفاده میشود
- current_action(): در زمینه اکشنها استفاده میشود
اما در عمل، هر دو تابع خروجی یکسان تولید میکنند. راهنمای تابع دیگر در صفحه current_action آمده است.
اشتراک callback بین چند فیلتر
یکی از رایجترین کاربردهای این تابع، اشتراک یک callback بین چند فیلتر است:function mytheme_format_title( $title ) {
$current = current_filter();
switch ( $current ) {
case 'the_title':
return '<span class="post-title">' . esc_html( $title ) . '</span>';
case 'widget_title':
return '<span class="widget-title">' . esc_html( $title ) . '</span>';
case 'nav_menu_item_title':
return esc_html( $title );
default:
return $title;
}
}
add_filter( 'the_title', 'mytheme_format_title' );
add_filter( 'widget_title', 'mytheme_format_title' );
add_filter( 'nav_menu_item_title', 'mytheme_format_title' );
این الگو از تکرار کد جلوگیری میکند و نگهداری را آسانتر میسازد.
کاربردهای پیشرفته
ترکیبcurrent_filter با did_action و doing_action امکان کنترل دقیقتر را فراهم میکند:
function mytheme_shared_filter( $value ) {
$current = current_filter();
if ( 'the_content' === $current ) {
return mytheme_process_content( $value );
}
if ( 'the_excerpt' === $current ) {
return mytheme_process_excerpt( $value );
}
return $value;
}
add_filter( 'the_content', 'mytheme_shared_filter' );
add_filter( 'the_excerpt', 'mytheme_shared_filter' );
الگوی دیگر، تشخیص زمینه اجرا برای جلوگیری از تغییرات ناخواسته:
function mytheme_safe_filter( $value ) {
$excluded_filters = array( 'the_content_feed', 'the_excerpt_rss' );
if ( in_array( current_filter(), $excluded_filters, true ) ) {
return $value;
}
// اعمال تغییرات
return mytheme_modify( $value );
}
add_filter( 'the_content', 'mytheme_safe_filter' );
این الگو از اعمال تغییرات در فیدهای RSS جلوگیری میکند.
کاربرد در اشکالزدایی
تابعcurrent_filter در اشکالزدایی نیز مفید است:
function myplugin_debug_filter() {
$current = current_filter();
if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
error_log( sprintf(
'Filter executed: %s at %s',
$current,
gmdate( 'c' )
) );
}
}
add_filter( 'the_content', 'myplugin_debug_filter' );
add_filter( 'the_excerpt', 'myplugin_debug_filter' );
این الگو به شناسایی زمان اجرای فیلترها و تشخیص رفتار غیرمنتظره کمک میکند.
نکات امنیتی و اشتباهات رایج
اشتباه اول، نبود بررسی مقدارfalse است. اگر خارج از فیلتر فراخوانی شود، مقدار false برمیگرداند و شرطها شکست میخورند.
اشتباه دوم، نبود escape در خروجی است. اگر نام فیلتر را در HTML چاپ میکنید، از esc_html استفاده کنید.
اشتباه سوم، نبود شرط در هوکهای تودرتو است. اگر فیلتر در داخل فیلتر دیگری فراخوانی شود، current_filter نام درونی را برمیگرداند. برای دسترسی به پشته کامل، از $wp_current_filter استفاده کنید.
اشتباه چهارم، استفاده از این تابع بهجای doing_filter است. اگر هدف بررسی اجرای یک فیلتر مشخص باشد، doing_filter مناسبتر است.
اشتباه پنجم، نبود تست است. باید کد خود را در همه فیلترهای متصل بررسی کنید.
تحلیل فنی پیشرفته
در نگاه مهندسی، تابعcurrent_filter() یک نقطه دسترسی در لایه Hook System است که بر چند جنبه از سیستم اثر میگذارد. لایه اول لایه Stack Management است. وردپرس یک پشته از هوکهای در حال اجرا دارد که در متغیر $wp_current_filter ذخیره میشود.
لایه دوم لایه Debugging است. در پروژههای پیچیده، لاگگیری از نام فیلتر فعلی میتواند به شناسایی نقاط اجرای غیرمنتظره کمک کند.
لایه سوم لایه Performance است. فراخوانی مکرر این تابع هزینه ناچیزی دارد چرا که تنها آخرین عضو پشته را برمیگرداند.
لایه چهارم لایه Re-entrancy است. در هوکهای تودرتو، این تابع نام درونیترین فیلتر را برمیگرداند.
لایه پنجم لایه Integration است. ترکیب با did_action و doing_action امکان تشخیص دقیق وضعیت را فراهم میکند.
لایه ششم لایه Multisite است. در شبکههای Multisite، پشته هوک در هر سایت مستقل است.
لایه هفتم لایه Testing است. تستهای واحد باید همه سناریوها را پوشش دهند: داخل فیلتر، خارج از فیلتر، هوک تودرتو.
مفاهیم پایهای Filter Pattern در Filter در ویکیپدیا توضیح داده شده است.
برای مطالعه بیشتر روی توابع مرتبط، میتوانید به راهنمای current_action، راهنمای did_action، راهنمای doing_action، راهنمای add_filter، راهنمای apply_filters و راهنمای remove_filter مراجعه کنید.
پرسشهای پرتکرار
تفاوتcurrent_filter و current_action چیست؟ از نظر فنی یکسان عمل میکنند؛ تفاوت فقط در نامگذاری و کاربرد معنایی است.
چه زمانی مقدار false برمیگرداند؟ وقتی خارج از یک فیلتر فراخوانی شود.
آیا در هوکهای تودرتو مقدار درست برمیگرداند؟ بله، اما نام درونیترین فیلتر را برمیگرداند.
چطور به پشته کامل دسترسی پیدا کنیم؟ با متغیر جهانی $wp_current_filter.
آیا این تابع در پنل مدیریت کار میکند؟ بله، در هر زمینهای که فیلتری در حال اجرا باشد.
نتیجه و مسیر ادامه
تابعcurrent_filter() یک ابزار قدرتمند برای اشتراک یک callback بین چند فیلتر و شرطگذاری پیشرفته در توسعه وردپرس است. استفاده درست از آن یعنی درک دقیق پشته فیلترها، توجه به مقدار false، ترکیب با did_action و doing_action و تست در سناریوهای مختلف. این تابع در پروژههایی که یک تابع مشترک به چند فیلتر متصل است، ارزش بالایی دارد.
اگر این تابع را در پروژهای واقعی به کار بردهاید و رفتار غیرمنتظرهای دیدهاید — بهخصوص در فیلترهای تودرتو یا در افزونههای پیچیده — تجربهتان میتواند راهگشای دیگران باشد. کدام بخش بیشترین زمان را از شما گرفت؟ دیدگاه خود را بنویسید.