احتمالا نام «هوک» (Hook) در وردپرس به گوشتان خورده است. هوکها یکی از قدرتمندترین و بنیادیترین مفاهیم در وردپرس هستند که به توسعهدهندگان اجازه میدهند بدون دستکاری هسته اصلی وردپرس، قابلیتهای جدیدی به آن اضافه کنند یا رفتار پیشفرض آن را تغییر دهند. در واقع، تمام افزونهها و قالبها برای تعامل با وردپرس از هوکها استفاده میکنند. هوکها به دو دسته اصلی تقسیم میشوند
اکشنها (Actions) و فیلترها (Filters). در این مقاله به زبان ساده با این دو مفهوم مهم آشنا میشویم.
هوک به زبان ساده چیست؟
تصور کنید وردپرس مانند یک خط مونتاژ بزرگ است. در نقاط مختلف این خط مونتاژ (مثلا هنگام بارگذاری سایت، قبل از نمایش یک نوشته، یا پس از ذخیره یک دیدگاه)، وردپرس «قلاب» یا «ایستگاههایی» قرار داده است. توسعهدهندگان میتوانند کدهای خود را به این قلابها متصل کنند. وقتی فرآیند اجرای وردپرس به یکی از این نقاط میرسد، متوقف شده و به کدهای متصل به آن قلاب اجازه اجرا میدهد.
این شکل عملکرد دو مزیت مهم دارد:
- عدم دستکاری هسته
شما کدهای وردپرس را به طور مستقیم ویرایش نمیکنید. بنابراین با هر بروزرسانی وردپرس، تغییرات شما از بین نمیرود. - توسعهپذیری
هر کسی میتواند بدون محدودیت، قابلیتهای دلخواه خود را به وردپرس اضافه کند.
۱- اکشنها (Actions)
اکشنها نقاطی در کد وردپرس هستند که به شما اجازه میدهند یک «عملیات» یا «کار» خاص را در آن لحظه اجرا کنید. وقتی یک اکشن فراخوانی میشود، شما میتوانید یک تابع را به آن متصل کنید تا کاری انجام دهد؛ مثلاً یک ایمیل ارسال کند، چیزی را در دیتابیس ذخیره کند، یا یک اسکریپت به صفحه اضافه کند. اکشنها معمولاً چیزی را "برنمیگردانند"، فقط کاری را انجام میدهند.
مثال برای استفاده از اکشن
فرض کنید میخواهید هر زمان که یک نوشته جدید در سایت منتشر میشود، یک ایمیل اطلاعرسانی به مدیر سایت ارسال شود. وردپرس یک اکشن به نام publish_post دارد که پس از انتشار یک نوشته اجرا میشود. شما میتوانید تابعی بنویسید که ایمیل را ارسال میکند و آن را به این اکشن متصل کنید.
// این کد معمولاً در فایل functions.php قالب فرزند قرار میگیرد
function notify_admin_on_publish( $post_id ) {
$post = get_post( $post_id );
$author = get_userdata( $post->post_author );
$message = "یک نوشته جدید با عنوان " . $post->post_title . " توسط " . $author->display_name . " منتشر شد.";
wp_mail( get_option( 'admin_email' ), 'نوشته جدید منتشر شد', $message );
}
add_action( 'publish_post', 'notify_admin_on_publish' );
در کد بالا، تابع notify_admin_on_publish با استفاده از add_action به هوک publish_post متصل شده است. حالا هر بار که نوشتهای منتشر شود، این تابع به صورت خودکار اجرا میشود.
۲- فیلترها (Filters) - زمانی که میخواهید تغییری ایجاد کنید
فیلترها نقاطی در کد وردپرس هستند که به شما اجازه میدهند دادهها را قبل از اینکه استفاده یا نمایش داده شوند، «تغییر دهید» یا «فیلتر کنید». برخلاف اکشنها که فقط کاری انجام میدهند، فیلترها همیشه یک مقدار (مانند یک متن، یک عدد یا یک آرایه) را دریافت میکنند، آن را تغییر میدهند و سپس مقدار تغییریافته را برمیگردانند.
مثال برای فیلترها
فرض کنید میخواهید به انتهای هر نوشته، یک متن ثابت (مثلا «این مطلب توسط کهکشان وردپرس نوشته شده است») اضافه کنید. وردپرس یک فیلتر به نام the_content دارد که محتوای نوشته را قبل از نمایش، از خود عبور میدهد. شما میتوانید تابعی بنویسید که این متن را به محتوا اضافه کند.
// این کد معمولاً در فایل functions.php قالب فرزند قرار میگیرد
function add_text_after_content( $content ) {
if ( is_single() ) {
// فقط در صفحات تکی نوشته اعمال شود
$custom_text = "این مطلب توسط تیم ما نوشته شده است.";
return $content . $custom_text;
// محتوای اصلی + متن سفارشی
}
return $content;
// در غیر این صورت، محتوای اصلی را بدون تغییر برگردان
}
add_filter( 'the_content', 'add_text_after_content' );
در کد بالا، تابع add_text_after_content با استفاده از add_filter به هوک the_content متصل شده است. این تابع محتوای نوشته ($content) را میگیرد، متن سفارشی را به آن اضافه میکند و نتیجه نهایی را برمیگرداند تا نمایش داده شود.
تفاوت اکشن و فیلتر چیست ؟
- هدف: اکشن برای انجام دادن یک کار است. فیلتر برای تغییر دادن یک داده است.
- مقدار بازگشتی: توابع متصل به اکشن معمولاً چیزی برنمیگردانند (
void). توابع متصل به فیلتر باید مقدار تغییریافته را برگردانند. - تابع اتصال: برای اکشن از
add_action()و برای فیلتر ازadd_filter()استفاده میشود.
مقایسه روشهای جایگزین با مدل اکشنها و فیلترهای وردپرس
مدل اکشنها (Actions) و فیلترها (Filters) در وردپرس یک سیستم هوکمحور (Hook-based) است که اجازه میدهد بدون تغییر کد اصلی، رفتار سیستم را گسترش دهید. اما ممکن است برای پروژههای پیچیده، وابستگیهای زیادی ایجاد کند.
حالا بیایید این مدل را با روشهای جایگزین مقایسه کنیم، که برخی در وردپرس قابل استفادهاند و برخی نه:
۱- تغییر مستقیم فایلها
این روش در سیستمهای ساده مثل وبسایتهای استاتیک یا اسکریپتهای PHP خام استفاده میشود. به جای هوک، مستقیم کد را ویرایش میکنید. استفاده از این روش در وردپرس توصیه نمیشود چون با هر بهروزرسانی تغییرات از بین خواهند رفت و نگهداری آن هم بسیار مشکل است.
۲- مدل Inversion of Control (IoC) و Dependency Injection
در فریمورکهای مدرن مثل Laravel یا Spring (جاوا)، IoC وابستگیها را خودکار مدیریت میکند. کد تمیزتر، تستپذیرتر و مقیاسپذیرتر از وردپرس است، اما یادگیری آن سختتر است. در وردپرس میتوانید بخشی از آن را با کتابخانههایی مثل Pimple پیاده کنید، ولی این روش جایگزین هوکها نیست و برای پروژههای بزرگ مناسبتر است.
۳- مدل سرویسمحور یا میکروسرویسها
در سیستمهایی مثل Node.js یا AWS، از APIها و سرویسهای خارجی برای تغییرات استفاده میکنید. مثلا یک سرویس جدا برای مدیریت محتوا. این روش انعطافپذیرتر برای توزیع بار و ادغام با ابزارهای خارجی، اما هزینهبرتر و پیچیدهتر از هوکهای وردپرس است.
در وردپرس، میتوانید با REST API بخشی از این مدل را به کار بگیرید، ولی مدل اصلی وردپرس برای سایتهای متوسط سادهتر است.
در نهایت، مدل وردپرس برای طراحی سایت با ودرپرس بهترین روش است چون جامعه بزرگی دارد و ایجاد پیچیدگی بیشتر برای سیستمی مثل وردپرس که کاربرد طراحی سایتهای کوچک و متوسط را دارد، تنها باعث افزایش هزینهها و سختتر شدن کار میشود.
