هوک‌های وردپرس (WordPress Hooks) در واقع قلب تپنده توسعه در وردپرس هستند؛ بدون آن‌ها، هر تغییری در رفتار هسته، قالب یا افزونه به دستکاری مستقیم کد منجر می‌شد و به‌سرعت به یک فاجعه‌ی نگهداری‌ناپذیر تبدیل می‌گشت. هوک‌ها همان مکانیزمی هستند که به توسعه‌دهنده اجازه می‌دهند بدون لمس کردن یک خط از هسته‌ی وردپرس، رفتار آن را در نقاط مشخص تغییر دهد. این معماری مبتنی بر رویداد (Event-Driven Architecture) است و ستون اصلی قابلیت توسعه‌پذیری (Extensibility) وردپرس محسوب می‌شود.

هوک‌ها در وردپرس به دو دسته اصلی تقسیم می‌شوند: اکشن (Action) و فیلتر (Filter). اکشن‌ها در لحظه‌ای مشخص اجرا می‌شوند تا کاری انجام دهند؛ مثلاً ارسال یک ایمیل یا درج یک متاباکس. فیلترها داده‌ای را دریافت می‌کنند، تغییر می‌دهند و سپس آن را بازمی‌گردانند؛ مثلاً تغییر متن یک نوشته یا کوتاه کردن طول خلاصه. درک این تفاوت بنیادین، اولین قدم برای کار حرفه‌ای با هوک‌های وردپرس است.

مکانیزم هوک در وردپرس از یک سیستم اولویت‌بندی (Priority) استفاده می‌کند که ترتیب اجرای توابع متصل‌شده را کنترل می‌کند. همچنین هر هوک می‌تواند تعدادی پارامتر (Argument) داشته باشد که به تابع کالبک (Callback) پاس داده می‌شوند. تسلط بر این سه مفهوم — نوع هوک، اولویت و پارامترها — تفاوت بین یک توسعه‌دهنده مبتدی و یک مهندس حرفه‌ای وردپرس را مشخص می‌کند.

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

اگر پیش از این با وردپرس کار کرده‌اید، احتمالاً با کدی شبیه به add_action('init', 'my_function') برخورد کرده‌اید. این خط ساده، نماینده‌ی یکی از عمیق‌ترین مفاهیم معماری وردپرس است. در ادامه، این مفهوم را لایه‌به‌لایه باز می‌کنیم و در هر مرحله، تصمیم‌های فنی و دام‌های پنهان را بررسی می‌کنیم.

کار با هوک‌ها شبیه به کار با یک ارکستر است: هر تابع، یک ساز است که در لحظه‌ی مشخصی و با ترتیب دقیق باید نواخته شود. اگر این ترتیب به‌هم بریزد، آهنگ به‌هم می‌ریزد؛ حتی اگر همه‌ی سازها درست نواخته شوند. این استعاره، تمام چیزی است که در ادامه درباره‌ی اولویت‌ها و پارامترها خواهید خواند.

هوک در وردپرس دقیقاً چیست؟

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

در وردپرس، هوک‌ها با فراخوانی توابعی مثل do_action() و apply_filters() در هسته، قالب یا افزونه‌ها ایجاد می‌شوند. هر هوک یک نام منحصربه‌فرد دارد و توسعه‌دهنده با استفاده از add_action() یا add_filter() تابع خود را به آن هوک متصل می‌کند. این مکانیزم، به‌طور دقیق همان چیزی است که در معماری نرم‌افزار با عنوان الگوی Observer (ناظر) یا Publish-Subscribe شناخته می‌شود.

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

هوک‌ها همان چیزی هستند که وردپرس را از یک سیستم مدیریت محتوای معمولی به یک پلتفرم توسعه‌پذیر تبدیل کرده‌اند. بدون آن‌ها، هر تغییر نیازمند دستکاری هسته بود.

چرا هوک‌ها ستون فقرات توسعه وردپرس هستند؟

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

هوک‌ها این مشکل را به‌صورت بنیادین حل می‌کنند. با فراهم کردن نقاط دخالت، وردپرس به توسعه‌دهندگان اجازه می‌دهد بدون دستکاری هسته، رفتار سیستم را تغییر دهند. این اصل، در مهندسی نرم‌افزار با عنوان Open-Closed Principle (اصل باز-بسته) شناخته می‌شود: نرم‌افزار باید برای توسعه باز و برای تغییر بسته باشد.

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

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

تفاوت Action و Filter؛ مرز بنیادین

هوک‌ها در وردپرس به دو دسته تقسیم می‌شوند: Action (اکشن) و Filter (فیلتر). این تفاوت، بنیادی‌ترین مفهومی است که هر توسعه‌دهنده‌ی وردپرس باید درک کند. اشتباه گرفتن این دو، منبع بسیاری از باگ‌های ظریف و سخت‌دیباگ است.

Action یک نقطه‌ی اجرایی است. وقتی وردپرس به یک اکشن می‌رسد، همه‌ی توابعی که به آن متصل شده‌اند را اجرا می‌کند. اکشن‌ها هیچ مقداری بازنمی‌گردانند و صرفاً برای انجام یک عمل (Side Effect) استفاده می‌شوند. مثال‌های رایج: init، wp_loaded، save_post، wp_enqueue_scripts.

Filter یک نقطه‌ی تغییر داده است. وقتی وردپرس به یک فیلتر می‌رسد، داده را به همه‌ی توابع متصل پاس می‌دهد، آن‌ها داده را تغییر می‌دهند و نسخه‌ی نهایی را بازمی‌گردانند. فیلترها همیشه باید یک مقدار بازگردانند. مثال‌های رایج: the_content، the_title، excerpt_length، wp_nav_menu_items.

// Action: انجام یک کار
add_action('wp_footer', function () {
    echo '<script>console.log("footer loaded");</script>';
});

// Filter: تغییر یک داده
add_filter('the_content', function ($content) {
    return $content . '<p>ممنون از مطالعه شما.</p>';
});

نکته‌ی ظریف این است که اگر در یک فیلتر، مقدار را بازنگردانید، داده برای توابع بعدی null می‌شود و این می‌تواند فاجعه‌بار باشد. این اشتباه، یکی از رایج‌ترین باگ‌ها در پروژه‌های وردپرسی است. برای درک عمیق‌تر این تفاوت، مقاله تفاوت Action و Filter در وردپرس چیست را مطالعه کنید.

اگر تابع شما داده‌ای را تغییر می‌دهد، Filter است. اگر کاری انجام می‌دهد، Action است. مرز این دو، همان مرز بین «تغییر دادن» و «انجام دادن» است.

نحوه استفاده از add_action و add_filter

دو تابع اصلی برای اتصال به هوک‌ها وجود دارد: add_action() و add_filter(). ساختار هر دو تابع مشابه است اما معنای پارامترها تفاوت دارد. درک دقیق این ساختار، کلید استفاده‌ی حرفه‌ای از هوک‌ها است.

add_action($hook_name, $callback, $priority = 10, $accepted_args = 1);
add_filter($hook_name, $callback, $priority = 10, $accepted_args = 1);

پارامتر اول، نام هوک است. پارامتر دوم، نام تابعی است که باید اجرا شود. پارامتر سوم، اولویت است که در بخش بعدی به‌طور مفصل بررسی می‌شود. پارامتر چهارم، تعداد آرگومان‌هایی است که تابع کالبک انتظار دریافت آن‌ها را دارد.

یک نکته‌ی ظریف که در پروژه‌های واقعی بارها باعث اشتباه می‌شود، این است که $accepted_args به‌صورت پیش‌فرض ۱ است. اگر تابع شما دو پارامتر می‌گیرد، اما این مقدار را ۱ بگذارید، پارامتر دوم همیشه null خواهد بود. این باگ، به‌راحتی قابل تشخیص نیست و ساعت‌ها دیباگ می‌طلبد.

// نادرست: پارامتر دوم همیشه null است
add_filter('the_content', function ($content, $more_link_text) {
    return $content;
}, 10, 1);

// درست: هر دو پارامتر دریافت می‌شوند
add_filter('the_content', function ($content, $more_link_text) {
    return $content;
}, 10, 2);

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

اولویت (Priority) و کنترل ترتیب اجرا

وقتی چند تابع به یک هوک متصل می‌شوند، ترتیب اجرای آن‌ها توسط پارامتر اولویت (Priority) تعیین می‌شود. مقدار پیش‌فرض اولویت، عدد ۱۰ است. توابع با اولویت پایین‌تر، زودتر اجرا می‌شوند. یعنی اولویت ۵ قبل از اولویت ۱۰ و اولویت ۱۰ قبل از اولویت ۲۰ اجرا می‌شود.

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

// این تابع اول اجرا می‌شود
add_action('init', 'my_first_function', 5);

// این تابع پیش‌فرض اجرا می‌شود
add_action('init', 'my_default_function', 10);

// این تابع آخر اجرا می‌شود
add_action('init', 'my_last_function', 20);

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

برای درک عمیق‌تر این مفهوم، مقاله Priority در هوک‌های وردپرس چیست را مطالعه کنید. همچنین برای درک نحوه‌ی کنترل ترتیب اجرای چندین هوک، مقاله چگونه ترتیب اجرای هوک‌ها را مدیریت کنیم توصیه می‌شود.

پارامترها و آرگومان‌های هوک

هر هوک می‌تواند تعدادی پارامتر داشته باشد که به تابع کالبک پاس داده می‌شوند. تعداد این پارامترها، در فراخوانی هوک در هسته تعیین می‌شود. برای مثال، هوک save_post سه پارامتر دارد: $post_ID، $post و $update. اگر تابع شما فقط به $post_ID نیاز دارد، $accepted_args را روی ۱ بگذارید و بقیه را نادیده بگیرید.

add_action('save_post', function ($post_id, $post, $update) {
    // فقط وقتی نوشته جدید است، کاری انجام بده
    if ($update) {
        return;
    }
    // منطق شما
}, 10, 3);

نکته‌ی مهم این است که پارامترها همیشه بر اساس ترتیب فراخوانی هوک در هسته تعیین می‌شوند. برای دانستن اینکه یک هوک خاص چه پارامترهایی دارد، بهترین منبع، مستندات رسمی وردپرس است. هرگز پارامترها را حدس نزنید؛ زیرا این کار منجر به باگ‌های ظریفی می‌شود که دیباگ کردن آن‌ها دشوار است.

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

add_action('save_post', function ($post_id, $post, $update) {
    if (current_filter() === 'save_post') {
        // منطق مخصوص این هوک
    }
}, 10, 3);

برای درک عمیق‌تر نحوه‌ی شناخت پارامترها، مقاله چگونه پارامترهای هوک وردپرس را بشناسیم را مطالعه کنید.

هوک‌های مهم در توسعه قالب و افزونه

وردپرس صدها هوک در هسته دارد. شناخت مهم‌ترین آن‌ها، بخشی از مهارت پایه‌ی هر توسعه‌دهنده‌ی وردپرس است. برخی از این هوک‌ها در تقریباً هر پروژه‌ای به کار می‌آیند و برخی دیگر مخصوص سناریوهای خاص هستند.

در چرخه‌ی اجرای وردپرس، هوک‌هایی مثل muplugins_loaded، plugins_loaded، setup_theme، after_setup_theme، init، wp_loaded به‌ترتیب اجرا می‌شوند. درک ترتیب این هوک‌ها حیاتی است، زیرا در هر مرحله، بخش‌های مشخصی از وردپرس بارگذاری شده‌اند و بخش‌های دیگری هنوز نه. برای مثال، فراخوانی توابعی که به پست تایپ‌های سفارشی نیاز دارند، در هوک init انجام می‌شود، نه در plugins_loaded.

در بخش فرانت‌اند، هوک‌های wp_enqueue_scripts، wp_head، wp_body_open، wp_footer برای تزریق اسکریپت و استایل استفاده می‌شوند. هوک the_content برای تغییر محتوای نوشته‌ها و هوک wp_nav_menu_items برای تغییر آیتم‌های منو به کار می‌رود.

در بخش مدیریت، هوک‌های admin_menu، admin_init، admin_enqueue_scripts، add_meta_boxes، save_post برای ساخت پنل‌های مدیریتی سفارشی استفاده می‌شوند. برای درک عمیق‌تر این هوک‌ها، مقاله مهم‌ترین Action Hook های وردپرس و همچنین مهم‌ترین Filter Hook های وردپرس را مطالعه کنید.

دانستن اینکه هر هوک در چه مرحله‌ای از چرخه‌ی اجرای وردپرس قرار دارد، به اندازه‌ی دانستن خود هوک مهم است. یک هوک درست در جای اشتباه، کار نمی‌کند.

ساخت هوک سفارشی برای توسعه‌پذیری

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

برای ساخت یک اکشن سفارشی، از do_action() استفاده کنید. این تابع، یک نقطه‌ی اجرایی در کد شما ایجاد می‌کند که سایر کدها می‌توانند به آن متصل شوند.

function my_plugin_process_order($order) {
    // منطق پیش از پردازش
    do_action('my_plugin_before_process_order', $order);

    // منطق پردازش
    $result = process_order($order);

    // منطق پس از پردازش
    do_action('my_plugin_after_process_order', $order, $result);

    return $result;
}

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

function my_plugin_get_price($product) {
    $price = calculate_base_price($product);

    // اجازه تغییر قیمت به سایر کدها
    $price = apply_filters('my_plugin_product_price', $price, $product);

    return $price;
}

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

برای درک عمیق‌تر نحوه‌ی ساخت هوک سفارشی، مقاله چگونه یک Action سفارشی در وردپرس بسازیم و همچنین چگونه یک Filter سفارشی در وردپرس بسازیم را مطالعه کنید.

حذف و بررسی وجود هوک

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

// حذف یک اکشن
remove_action('wp_footer', 'my_footer_function', 10);

// حذف یک فیلتر
remove_filter('the_content', 'my_content_filter', 10);

نکته‌ی ظریف این است که حذف هوک باید در زمانی انجام شود که کالبک قبلاً ثبت شده باشد. اگر remove_action() را قبل از add_action() فراخوانی کنید، هیچ اتفاقی نمی‌افتد. بهترین زمان برای حذف هوک‌های ثبت‌شده توسط سایر افزونه‌ها، هوک init با اولویت بالا یا wp_loaded است.

برای بررسی اینکه یک هوک خاص دارای کالبک ثبت‌شده است یا نه، از توابع has_action() و has_filter() استفاده کنید. این توابع، اولویت کالبک را برمی‌گردانند یا false اگر هیچ کالبکی ثبت نشده باشد.

if (has_action('wp_footer', 'my_footer_function')) {
    // کالبک ثبت شده است
}

$priority = has_filter('the_content', 'my_content_filter');
if ($priority !== false) {
    // کالبک با اولویت $priority ثبت شده است
}

برای درک عمیق‌تر نحوه‌ی حذف هوک‌ها، مقاله چگونه یک Action هوک وردپرس را حذف کنیم و همچنین چگونه وجود یک هوک وردپرس را بررسی کنیم را مطالعه کنید.

دیباگ هوک‌ها و پیدا کردن مشکلات پنهان

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

اولین ابزار در دیباگ هوک‌ها، تابع current_filter() است که نام هوک در حال اجرا را برمی‌گرداند. این تابع، به شما اجازه می‌دهد تشخیص دهید کد شما در کدام نقطه اجرا می‌شود. ابزار دوم، متغیر سراسری $wp_filter است که تمام هوک‌های ثبت‌شده و کالبک‌های متصل به آن‌ها را در خود دارد. با var_dump($wp_filter) می‌توانید ببینید چه کالبک‌هایی به یک هوک خاص متصل هستند.

// نمایش همه کالبک‌های متصل به یک هوک
global $wp_filter;
if (isset($wp_filter['the_content'])) {
    var_dump($wp_filter['the_content']->callbacks);
}

نکته‌ی مهم این است که ساختار $wp_filter بسته به نسخه‌ی وردپرس ممکن است تفاوت داشته باشد. در نسخه‌های جدید، از کلاس WP_Hook استفاده می‌شود. بنابراین، برای دسترسی به کالبک‌ها، باید به ویژگی callbacks این شیء مراجعه کنید.

ابزار سوم، افزونه‌هایی مثل Query Monitor هستند که یک پنل کامل برای بررسی هوک‌ها، کوئری‌ها و سایر جنبه‌های اجرای وردپرس فراهم می‌کنند. این ابزار، به‌خصوص در پروژه‌های بزرگ که ده‌ها افزونه فعال است، بسیار ارزشمند است.

برای درک عمیق‌تر روش‌های دیباگ، مقاله دیباگ کردن Action و Filter در وردپرس را مطالعه کنید.

اشتباهات رایج در استفاده از هوک‌ها

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

اشتباه اول، فراموش کردن return در فیلتر. اگر تابع فیلتر مقدار را بازنگرداند، داده برای کالبک‌های بعدی null می‌شود. این اشتباه، به‌ظاهر کوچک، می‌تواند کل محتوای یک صفحه را از بین ببرد.

اشتباه دوم، تعیین $accepted_args نادرست. اگر تابع شما دو پارامتر می‌گیرد اما $accepted_args را ۱ بگذارید، پارامتر دوم همیشه null است. این باگ، به‌سختی قابل تشخیص است.

اشتباه سوم، استفاده از اولویت‌های تصادفی. تعیین اولویت بدون درک نیاز واقعی، می‌تواند باعث شود کد شما در زمان اشتباه اجرا شود. همیشه مستندات هوک را بررسی کنید و اولویت را بر اساس نیاز واقعی تعیین کنید.

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

اشتباه پنجم، عدم استفاده از پیشوند در نام توابع. اگر نام تابع شما با نام تابع دیگری در افزونه یا قالب هم‌نام باشد، به خطای Fatal Error منجر می‌شود. همیشه از پیشوند مخصوص پروژه استفاده کنید.

اشتباه ششم، استفاده از Closure در remove_action. اگر کالبک را به‌صورت Closure (تابع بی‌نام) ثبت کرده باشید، نمی‌توانید آن را حذف کنید. برای قابلیت حذف، همیشه از تابع نام‌دار استفاده کنید.

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

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

امنیت و هوک‌ها؛ نکات حیاتی

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

حوزه‌ی اول، اعتبارسنجی داده. اگر در یک کالبک، داده‌ای از کاربر دریافت می‌کنید، همیشه آن را اعتبارسنجی و پاک‌سازی کنید. حتی اگر داده در سمت کلاینت اعتبارسنجی شده باشد، هرگز به آن اعتماد نکنید. از توابعی مثل sanitize_text_field()، absint() و wp_kses_post() برای پاک‌سازی استفاده کنید.

add_action('save_post', function ($post_id) {
    if (!isset($_POST['my_custom_field'])) {
        return;
    }

    $value = sanitize_text_field($_POST['my_custom_field']);
    update_post_meta($post_id, 'my_custom_field', $value);
});

حوزه‌ی دوم، بررسی سطح دسترسی. قبل از انجام هر عملیات حساس در یک کالبک، بررسی کنید که کاربر جاری مجوز لازم را دارد. از توابعی مثل current_user_can() و wp_verify_nonce() استفاده کنید.

add_action('save_post', function ($post_id) {
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    if (!isset($_POST['my_nonce']) ||
        !wp_verify_nonce($_POST['my_nonce'], 'my_action')) {
        return;
    }

    // منطق شما
});

حوزه‌ی سوم، جلوگیری از اجرای تکراری. در هوک‌هایی مثل save_post که ممکن است چند بار در یک درخواست فراخوانی شوند، باید از اجرای تکراری منطق جلوگیری کنید. استفاده از یک متغیر استاتیک یا بررسی وضعیت پست، این مشکل را حل می‌کند.

برای درک عمیق‌تر مباحث امنیتی، مقاله هوک‌های وردپرس و افزایش امنیت کد را مطالعه کنید. همچنین برای درک مفاهیم پایه‌ای امنیت وب، مقاله امنیت وب چیست و چه اصولی دارد؟ توصیه می‌شود.

پرسش‌های پرتکرار درباره هوک‌های وردپرس

تفاوت اصلی Action و Filter چیست؟ اکشن‌ها برای انجام یک کار در نقطه‌ای مشخص استفاده می‌شوند و مقداری بازنمی‌گردانند. فیلترها داده‌ای را دریافت می‌کنند، تغییر می‌دهند و نسخه‌ی نهایی را بازمی‌گردانند. اگر تابع شما داده‌ای را تغییر می‌دهد، فیلتر است؛ اگر کاری انجام می‌دهد، اکشن است.

چگونه بفهمم یک هوک چه پارامترهایی دارد؟ بهترین منبع، مستندات رسمی وردپرس است. هر هوک در مستندات، لیست پارامترها و توضیح هر کدام را دارد. همچنین می‌توانید کد هسته را بررسی کنید و ببینید فراخوانی do_action() یا apply_filters() چند پارامتر پاس می‌دهد.

اولویت پیش‌فرض هوک‌ها چقدر است؟ مقدار پیش‌فرض اولویت، عدد ۱۰ است. توابع با اولویت کمتر، زودتر و توابع با اولویت بیشتر، دیرتر اجرا می‌شوند.

آیا می‌توانم یک هوک را در زمان اجرا حذف کنم؟ بله، با توابع remove_action() و remove_filter() می‌توانید کالبک‌های ثبت‌شده را حذف کنید. نکته‌ی مهم این است که باید اولویت و تعداد آرگومان‌های دقیق را مشخص کنید و حذف باید بعد از ثبت انجام شود.

چگونه یک هوک سفارشی بسازم؟ برای اکشن سفارشی، از do_action() و برای فیلتر سفارشی، از apply_filters() استفاده کنید. نام هوک باید یکتا و توصیفی باشد و استفاده از پیشوند مخصوص پروژه توصیه می‌شود.

آیا هوک‌ها روی کارایی سایت تأثیر دارند؟ هر هوک، یک فراخوانی تابع است که اگر تعداد آن‌ها زیاد باشد، می‌تواند بر کارایی تأثیر بگذارد. اما در عمل، تأثیر هوک‌ها در برابر عواملی مثل کوئری‌های سنگین یا فایل‌های حجیم، ناچیز است. با این حال، در پروژه‌های بزرگ، حذف هوک‌های غیرضروری می‌تواند به‌عنوان یک بهینه‌سازی در نظر گرفته شود.

چرا کالبک من اجرا نمی‌شود؟ دلایل متعددی وجود دارد: ممکن است هوک قبل از ثبت کالبک فراخوانی شده باشد، ممکن است نام هوک اشتباه باشد، ممکن است اولویت یا تعداد آرگومان‌ها اشتباه تنظیم شده باشد، یا ممکن است کالبک در فایل‌ای باشد که بارگذاری نشده است.

آیا می‌توانم کالبک را به‌صورت Closure ثبت کنم؟ بله، اما در این صورت نمی‌توانید آن را با remove_action() یا remove_filter() حذف کنید. اگر نیاز به قابلیت حذف دارید، از تابع نام‌دار استفاده کنید.

چگونه کالبک خود را قبل از یک افزونه خاص اجرا کنم؟ کافی است اولویت کالبک خود را کمتر از اولویت آن افزونه تعیین کنید. برای دانستن اولویت افزونه، می‌توانید از has_action() یا has_filter() استفاده کنید.

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

چگونه هوک‌های ثبت‌شده را مشاهده کنم؟ با var_dump($wp_filter) می‌توانید همه‌ی هوک‌های ثبت‌شده و کالبک‌های متصل را ببینید. افزونه‌هایی مثل Query Monitor هم این کار را به‌صورت گرافیکی انجام می‌دهند.

آیا استفاده از هوک‌ها امن است؟ خود مکانیزم هوک امن است، اما نحوه‌ی استفاده از آن می‌تواند ناامن باشد. همیشه داده‌های ورودی را اعتبارسنجی و پاک‌سازی کنید، سطح دسترسی کاربر را بررسی کنید و از nonce برای عملیات حساس استفاده کنید.

چگونه از هوک‌ها در توسعه قالب استفاده کنم؟ در قالب، می‌توانید با do_action() نقاط سفارشی برای توسعه‌دهندگان فرزند ایجاد کنید. برای درک عمیق‌تر، مقاله هوک‌های مناسب برای تغییر خروجی قالب را مطالعه کنید.

آیا هوک‌ها در REST API وردپرس هم کار می‌کنند؟ بله، REST API وردپرس از هوک‌های مخصوص خود مثل rest_api_init، rest_prepare_post و rest_authentication_errors پشتیبانی می‌کند. این هوک‌ها به شما اجازه می‌دهند رفتار API را سفارشی کنید.

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

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

اگر در پروژه‌ای واقعی با چالشی در استفاده از هوک‌ها برخورد کرده‌اید که در این مقاله به آن اشاره نشده — مثلاً یک مورد خاص از تداخل اولویت‌ها یا یک سناریوی پیچیده در ساخت هوک سفارشی — برایم جالب است بدانید. به‌خصوص اگر راه‌حل خلاقانه‌ای برای یک مسئله‌ی معماری پیدا کرده‌اید که می‌تواند به خواننده‌ی بعدی کمک کند. تجربه‌ی خودتان را در دیدگاه‌ها بنویسید؛ چه درباره‌ی دیباگ هوک‌ها، چه درباره‌ی طراحی هوک‌های سفارشی، و چه درباره‌ی اشتباهاتی که در مسیر یادگیری مرتکب شده‌اید و درس ارزشمندی از آن‌ها گرفته‌اید.