یکی از طولانی‌ترین دیباگ‌های عمر کاری‌ام، دو روز طول کشید و در نهایت به یک عدد ساده برنگشت: 10 در برابر 20. مشتری می‌گفت «متن پایین نوشته‌ها گاهی هست و گاهی نیست». بعد از ساعت‌ها بررسی، معلوم شد دو افزونه روی همان هوک the_content کار می‌کنند؛ یکی با اولویت پیش‌فرض ۱۰ محتوا را جایگزین می‌کند و دیگری با اولویت ۲۰ محتوا را می‌گیرد و روی نسخه‌ای کار می‌کند که افزونهٔ اول ساخته. نتیجه، یک رفتار تصادفی بود که فقط وقتی افزونهٔ اول دیرتر فعال می‌شد، از چشم‌ها پنهان می‌ماند. آن روز یاد گرفتم مدیریت ترتیب اجرای هوک‌های وردپرس یک تنظیم جانبی نیست؛ یک تصمیم معماری است که بدون آن، رفتار افزونه‌ها قابل پیش‌بینی نخواهد بود. اگر با مفهوم پایهٔ هوک آشنایی ندارید، پیش از ادامه هوک‌های وردپرس چیستند و چگونه کار می‌کنند را بخوانید تا پایه‌ها روشن باشد.

چرا ترتیب اجرای هوک‌ها یک دغدغهٔ روزمرهٔ توسعه‌دهنده است

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

اول، اثر تجمعی روی تجربهٔ کاربر. هر hook handler که روی the_content کار می‌کند، خروجی نهایی را تغییر می‌دهد. اگر ترتیب اجرا به‌درستی تنظیم نشود، خروجی نهایی چیزی نیست که انتظار داشتید — گاهی محتوا از دست می‌رود و گاهی کدهای اضافه در جای اشتباه ظاهر می‌شوند.

دوم، همکاری با اکوسیستم. در سایتی که ده افزونه فعال دارد، هر افزونهٔ نویس دیگر هم روی همان هوک‌ها نشسته. اگر اولویت‌های شما و آن‌ها هماهنگ نباشد، تعارض‌های عجیب شکل می‌گیرد. این تعارض‌ها معمولاً به شکل رفتار «گاهی درست، گاهی غلط» ظاهر می‌شوند که سخت‌ترین نوع دیباگ است.

سوم، نگهداری بلندمدت. اگر مستند نکنید که چرا یک اولویت خاص را انتخاب کرده‌اید، توسعه‌دهندهٔ بعدی نمی‌داند دست بزند یا نه. و همان عدد کوچک، به یک راز ناخوشایند در پروژه تبدیل می‌شود.

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

عدد اولویت: زبانی که وردپرس با آن ترتیب می‌سازد

وردپرس برای مدیریت ترتیب اجرا، یک سیستم ساده اما قدرتمند دارد: هر hook handler با یک عدد اولویت ثبت می‌شود و وردپرس بر اساس همین عدد، ترتیب اجرا را تعیین می‌کند. قاعدهٔ پایه این است: هرچه عدد کوچک‌تر باشد، زودتر اجرا می‌شود. مقادیر پیش‌فرض و رایج در وردپرس عبارتند از:

مقدار اولویتمعنای عملیکاربرد رایج
کمتر از ۱۰پیش از رفتار پیش‌فرض هستهآماده‌سازی داده پیش از اجرای منطق استاندارد
۱۰ (پیش‌فرض)هم‌سطح با رفتار پیش‌فرض هستهمقدار پیش‌فرض اگر عدد مشخص نکنید
بین ۱۰ و ۲۰بعد از هسته ولی پیش از اکثر افزونه‌هاافزودن محتوای مکمل بعد از تنظیمات پایه
بین ۲۰ و ۵۰در میانهٔ افزونه‌های استانداردافزونه‌های جانبی مثل سئو، فرم‌ساز
بالای ۹۹نزدیک به انتهای صفکارهای نهایی، لاگ‌گیری، پاک‌سازی
PHP_INT_MAXآخرین اجرای ممکن در صفپایش یا پاک‌سازی نهایی در سیستم‌های خاص

نکته‌ای که در تجربه‌ام بارها به‌کار آمده: اعداد میانی مثل ۱۰ یا ۲۰ انتخاب‌های «امن» نیستند؛ انتخاب‌های «پیش‌فرض» هستند. برای ترتیب دقیق، بهتر است عددی را انتخاب کنید که فاصلهٔ کافی از اطراف داشته باشد. مثلاً اگر می‌خواهید کد شما بعد از یک افزونهٔ مشخص اجرا شود و آن افزونه اولویت ۱۰ دارد، انتخاب ۲۵ یا ۳۰ منطقی‌تر از ۱۱ یا ۱۲ است. این فاصله، فضای مانور آینده را حفظ می‌کند.

add_action و add_filter در عمل: چه زمانی کدام عدد؟

سه الگوی پیشنهادی که در پروژه‌های خودم استفاده می‌کنم:

الگوی اول: پیش از منطق پیش‌فرض (اولویت کمتر از ۱۰)

اگر می‌خواهید پیش از آنکه منطق استاندارد وردپرس اجرا شود، داده‌ای را آماده یا اصلاح کنید، از اولویت کمتر از ۱۰ استفاده کنید. مثال رایج: تغییر پارامترهای کوئری پیش از اجرای WP_Query روی pre_get_posts. توضیح دقیق نحوهٔ افزودن این نوع هوک در نحوه استفاده از add_action در وردپرس آمده است.

الگوی دوم: همراستا با منطق استاندارد (اولویت ۱۰)

برای کارهایی که هم‌سطح هسته هستند، اولویت پیش‌فرض ۱۰ را نگه دارید. مثال: افزودن یک کلاس CSS به بدنه با استفاده از body_class. در این حالت، ترتیب دقیق اهمیت کمی دارد و می‌توانید با خیال راحت مقدار پیش‌فرض را نگه دارید.

الگوی سوم: پس از منطق افزونه‌های دیگر (اولویت بالای ۲۰)

وقتی می‌خواهید کد شما بعد از اجرای افزونه‌های دیگر روی همان هوک اجرا شود، اولویت بزرگ‌تر انتخاب کنید. مثال پرکاربرد: افزودن محتوا به انتهای the_content بعد از اینکه افزونه‌های دیگر محتوای خود را اضافه کردند. نحوهٔ اتصال این نوع هوک با پارامترهای اضافی در نحوه استفاده از add_filter در وردپرس توضیح داده شده است.

// افزودن یک پیام پس از تمام افزونه‌های دیگر روی the_content
add_filter( 'the_content', 'wphk_append_signature', 99 );

function wphk_append_signature( $content ) {
    if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
        return $content;
    }
    return $content . '<p class="signature">سپاس از همراهی شما.</p>';
}

انتخاب عدد ۹۹ در این مثال، آگاهانه است: عدد بزرگ‌تر از ۹۹، تقریباً همیشه نزدیک به انتهای صف است و باقی افزونه‌ها با اولویت‌های پایین‌تر، زودتر اجرا می‌شوند. برای مطالعهٔ دقیق‌تر این مقادیر و پیشنهادهای وردپرس، Priority در هوک‌های وردپرس چیست مرجع کاملی است.

دیدن ترتیب واقعی اجرا: چهار ابزار عملی

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

ابزار اول: افزونهٔ Query Monitor

این افزونه، در هر صفحهٔ بارگذاری‌شده، فهرست تمام hook handlerهای فعال را همراه با نام کلاس/تابع، فایل، خط و اولویت نمایش می‌دهد. حتی می‌توانید ببینید چند بار یک هوک خاص اجرا شده است. برای دیباگ سریع تعارض‌ها، این ابزار ارزش ساعت‌ها کار را دارد.

ابزار دوم: یک لاگ موقت در نقاط کلیدی

در مواقعی که به ابزار بصری دسترسی ندارید، یک error_log کوچک در ابتدای هر hook handler سفارشی، اطلاعات دقیق اولویت و زمان اجرا را در فایل لاگ می‌نویسد:

add_action( 'init', 'wphk_trace_init', 999 );

function wphk_trace_init() {
    if ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) {
        return;
    }
    error_log( sprintf( 'wphk: init fired, priority=999, time=%s', microtime( true ) ) );
}

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

ابزار سوم: پنل Network در DevTools

در front-end، سربرگ Network مرورگر به شما اجازه می‌دهد ترتیب دانلود فایل‌های استاتیک را ببینید. این ابزار برای تشخیص ترتیب اجرای اسکریپت‌ها و استایل‌ها مفید است؛ چون گاهی مسئلهٔ ظاهری، ریشه در بارگذاری نامناسب دارد.

ابزار چهارم: پایش منابع هاست

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

الگوهای رایج اولویت‌دهی در افزونه‌ها و قالب‌ها

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

  • هستهٔ وردپرس: اکثر هوک‌های هسته با اولویت پیش‌فرض ۱۰ ثبت می‌شوند. برخی موارد خاص مثل بارگذاری اسکریپت‌ها از اولویت ۱ یا ۲۰ استفاده می‌کنند.
  • افزونه‌های سئو (مانند Yoast و Rank Math): معمولاً در بازهٔ ۵ تا ۲۰ کار می‌کنند تا پیش از افزونه‌های نمایشی، متادیتا آماده باشد.
  • قالب‌ها: استایل و اسکریپت‌ها را معمولاً با اولویت ۲۰ و در پایان صف بارگذاری می‌کنند تا استایل‌های افزونه‌ها بعد از آن‌ها اضافه شود.
  • افزونه‌های کش و بهینه‌ساز: در اولویت‌های بالای ۹۹ یا با استفاده از هوک‌های اختصاصی مثل wp_loaded، بعد از سایر افزونه‌ها کار می‌کنند.
  • افزونه‌های شخصی‌سازی نمایشی: معمولاً در بازهٔ ۲۰ تا ۵۰ کار می‌کنند تا از داده‌های آمادهٔ سایرین استفاده کنند.

قاعدهٔ انگشتی من برای پروژه‌های خودم: اگر نمی‌دانم افزونهٔ دیگری با چه اولویتی کار می‌کند، از بازهٔ ۲۰ تا ۵۰ انتخاب می‌کنم. این بازه، احتمال تعارض را کم می‌کند و همچنان امکان پیشی‌گرفتن از افزونه‌های پرمصرف (که معمولاً در ۱۰ کار می‌کنند) را می‌دهد. جزئیات این تصمیم را در راهنمای حرفه‌ای کار با هوک‌های وردپرس باز کرده‌ام.

تعارض دو افزونه روی یک هوک: تشخیص و رفع

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

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

نشانه‌های تعارض آشکار: محتوایی که باید در صفحه باشد غایب است، HTML سایت به‌هم می‌ریزد، یا پیام خطای PHP در لاگ ظاهر می‌شود.

روش من در دیباگ این تعارض‌ها، چهار گام دارد:

  1. غیرفعال‌سازی موقت یک افزونه: اگر مشکل با غیرفعال‌سازی حل شد، مقصر مشخص است.
  2. تغییر اولویت افزونهٔ خودمان: اگر نمی‌خواهیم افزونهٔ دیگر را غیرفعال کنیم، اولویت افزونهٔ خودمان را تغییر می‌دهیم. این تغییر کوچک در بسیاری از موارد مشکل را حل می‌کند.
  3. حذف هوک افزونهٔ دیگر: در موارد پیچیده‌تر، می‌توانیم هوک افزونهٔ دیگر را با remove_action حذف کنیم و به‌جایش یک نسخهٔ سفارشی خودمان اضافه کنیم.
  4. گزارش به توسعه‌دهندهٔ افزونه: اگر تعارض از سمت افزونهٔ دیگری است، مستند کردن و ارسال گزارش، مسیر بلندمدت درست است.

این چهار گام را در چگونه افزونه مشکل‌ساز وردپرس را پیدا کنیم با جزئیات بیشتر آورده‌ام.

حذف و جابه‌جایی هوک‌های دیگران با remove_action و remove_filter

یکی از قدرتمندترین قابلیت‌های وردپرس، امکان حذف یک hook handler است که افزونه یا قالب دیگری ثبت کرده. این ابزار وقتی به‌کار می‌آید که:

  • افزونه‌ای چیزی به صفحه اضافه می‌کند که در پروژهٔ شما نامطلوب است.
  • ترتیب اجرای افزونهٔ دیگری با ساختار شما هماهنگ نیست.
  • می‌خواهید رفتار افزونهٔ دیگری را با نسخهٔ سفارشی خودتان جایگزین کنید.

دو نکتهٔ فنی مهم در این زمینه. اول، برای حذف یک hook handler، باید دقیقاً همان نام تابع و همان اولویتی را که افزونهٔ دیگر استفاده کرده به remove_action یا remove_filter بدهید. اگر اولویت اشتباه باشد، حذف موفق نمی‌شود. دوم، زمان حذف مهم است: باید حذف بعد از ثبت هوک افزونهٔ دیگر و قبل از اجرای هوک اتفاق بیفتد. معمولاً در init یا wp_loaded این کار انجام می‌شود.

add_action( 'wp_loaded', 'wphk_remove_other_plugin_hook' );

function wphk_remove_other_plugin_hook() {
    remove_action( 'the_content', 'other_plugin_add_banner', 10 );
    // حالا می‌توانید نسخهٔ سفارشی خودتان را اضافه کنید
    add_filter( 'the_content', 'wphk_custom_banner', 10 );
}

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

وابستگی بین هوک‌ها: الگوها و تله‌ها

در پروژه‌های واقعی، وابستگی بین هوک‌ها یکی از پرتکرارترین منابع باگ است. مثال کلاسیک: یک hook handler روی init که فرض می‌کند نوع نوشتهٔ سفارشی ثبت شده، در حالی که آن نوع نوشته در اولویت بالاتری روی همان init ثبت می‌شود. نتیجه: گاهی کار می‌کند، گاهی نمی‌کند.

سه الگوی رایج این وابستگی و راه‌حل هرکدام:

الگوی اول: ثبت نوع نوشته و استفاده از آن در همان هوک

اگر می‌خواهید بعد از ثبت یک نوع نوشتهٔ سفارشی روی init، همان لحظه از آن استفاده کنید، ترتیب را با اولویت مدیریت کنید:

add_action( 'init', 'wphk_register_post_type', 5 );
add_action( 'init', 'wphk_use_post_type', 20 );

function wphk_register_post_type() {
    register_post_type( 'wphk_book', array(
        'public' => true,
        'label'  => 'کتاب‌ها',
    ) );
}

function wphk_use_post_type() {
    // اطمینان از اینکه نوع نوشته در دسترس است
    if ( ! post_type_exists( 'wphk_book' ) ) {
        return;
    }
    // منطق استفاده
}

نکتهٔ کلیدی: اولویت ۵ برای ثبت، اولویت ۲۰ برای استفاده. این ترتیب، ترتیب منطقی کار را تضمین می‌کند.

الگوی دوم: وابستگی به ترتیب بین هوک‌های مختلف

گاهی یک تابع در init نیاز به داده‌ای دارد که در wp_loaded تولید می‌شود. اینجا دیگر ترتیب اولویت کافی نیست؛ باید هوک درست انتخاب شود. قواعد کلی ترتیب هوک‌ها در چرخهٔ وردپرس این‌گونه است: muplugins_loaded → plugins_loaded → setup_theme → after_setup_theme → init → wp_loaded → template_redirect → wp_head → wp_footer.

شناخت این ترتیب، در بسیاری از موارد تفاوت بین کدی که «کار می‌کند» و کدی که «قابل اتکا است» را می‌سازد. اگر در انتخاب هوک تردید دارید، هوک‌های وردپرس در توسعه افزونه چه کاربردی دارند نقشهٔ خوبی می‌دهد.

الگوی سوم: وابستگی حلقه‌ای

گاهی دو افزونه به‌طور ناخواسته به هم وابسته می‌شوند؛ افزونهٔ A انتظار دارد B در اولویت پایین اجرا شود و B انتظار دارد A در اولویت بالا. این حالت نادر است ولی وقتی رخ می‌دهد، حلش آسان نیست. راه‌حل عملی: افزونه‌ای که در اختیار دارید، اولویتش را تغییر دهید تا حلقه شکسته شود. اگر هر دو افزونه از بیرون می‌آیند، از هوک remove_action استفاده کنید.

سه سناریوی واقعی از پروژه‌های گذشته

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

سناریوی اول: هدر تکراری در سایت خبری

در یک سایت خبری، مدیر گزارش داد که گاهی بالای صفحه اصلی، یک متن اطلاع‌رسانی دوبار ظاهر می‌شود. بعد از بررسی، معلوم شد دو افزونه روی wp_head در اولویت‌های متفاوت، همان متن را تزریق می‌کنند. راه‌حل نهایی: حذف هوک افزونهٔ دوم و نگه‌داشتن نسخهٔ اول، و مستندسازی علت برای توسعه‌دهندهٔ بعدی. زمان تشخیص: حدود یک ساعت. زمان رفع: پنج دقیقه.

سناریوی دوم: تخفیف دو بار در سبد خرید

در یک فروشگاه، گاهی تخفیف ۱۰٪ روی سبد اعمال می‌شد و گاهی ۲۰٪. پس از تحلیل با Query Monitor، معلوم شد دو افزونه در اولویت ۱۰ و ۲۰ روی woocommerce_before_calculate_totals مشغول کار بودند و هر دو شرایط تخفیف را در همان سفارش معتبر می‌دیدند. راه‌حل: افزونهٔ اول به اولویت ۵ منتقل شد تا پیش از افزونهٔ دوم شرط‌های تخفیف را ثبت کند. نتیجه: تخفیف ثابت و قابل پیش‌بینی. تجربهٔ مشابه در رفع خطاهای رایج ووکامرس هم آمده است.

سناریوی سوم: صفحهٔ محصول که سرعتش نوسان داشت

در یک فروشگاه بزرگ، صفحهٔ محصول گاهی زیر دو ثانیه بارگذاری می‌شد و گاهی بیش از پنج ثانیه. با پایش منابع هاست و بررسی ترتیب هوک‌ها، مشخص شد یک افزونهٔ شخصی‌سازی نمایشی در wp (هوک پس از wp_loaded) کوئری سنگینی اجرا می‌کند که با یک افزونهٔ کش رقابت می‌کند. راه‌حل: انتقال کوئری به wp_loaded، کش کردن نتیجه با transient و حذف فراخوانی‌های تکراری. نتیجه: صفحهٔ محصول در همهٔ ساعات پایداری سرعت پیدا کرد. مسیر رفع کندی مشابه در رفع مشکلات سرعت سایت آمده است.

سه سناریوی بالا، تصادفی انتخاب نشده‌اند. در هر سه، مشکل از «کار کردن» یا «کار نکردن» نبود؛ از «گاهی درست، گاهی نادرست» بود. و ریشهٔ این نوع مشکلات، تقریباً همیشه در ترتیب اجرا و اولویت است.

اشتباهات رایج در مدیریت اولویت

در بازبینی صدها پروژه، شش الگوی تکراری را در این حوزه دیده‌ام:

اشتباهپیامد واقعیاصلاح
عدم تعیین اولویت و تکیه بر مقدار پیش‌فرض ۱۰تعارض تصادفی با افزونه‌های دیگراولویت صریح با عدد آگاهانه
انتخاب اعداد نزدیک به هم (۱۱، ۱۲، ۱۳)جای مانور آینده از دست می‌روداستفاده از فواصل معنادار (۵، ۲۰، ۵۰)
حذف هوک افزونهٔ دیگر بدون بررسی اولویتحذف موفق نمی‌شودبررسی دقیق اولویت پیش از remove_action
اجرای کوئری سنگین در هوک‌های پرمصرفکندی سایت در ساعات شلوغانتقال به هوک مناسب‌تر یا کش
عدم مستندسازی دلیل انتخاب یک اولویت خاصتوسعه‌دهندهٔ بعدی نمی‌داند دست بزندکامنت توضیحی در کنار هر add_action
تغییر اولویت بدون تست بازهٔ کامل کاربرمشکلات جدید در گوشه‌های سایتتست براساس چک‌لیست قبل از انتشار

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

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

چرا ترتیب اجرا، خودش یک تصمیم معماری است

در مقیاس کوچک، ترتیب اجرا یک تنظیم فنی است؛ در مقیاس بزرگ، یک تصمیم معماری. سه دلیل این ادعا:

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

دوم، ترتیب اجرا بر قابلیت نگهداری اثر می‌گذارد. در پروژه‌ای که چند توسعه‌دهنده روی آن کار می‌کنند، هر عدد اولویت بدون توضیح، یک هزینه در آینده است. توضیح کوتاه در کنار هر add_action یا add_filter، هزینهٔ ناچیزی دارد و ارزش بزرگی می‌سازد.

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

قاعدهٔ عملی من در پروژه‌های تیمی: هر add_action و add_filter یک کامنت کوتاه داشته باشد که بگوید «چرا این عدد». مثال:

// اولویت 25: بعد از افزونهٔ سئو (10) و پیش از افزونهٔ نمایشی (50)
add_filter( 'the_content', 'wphk_custom_block', 25 );

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

مسیر پیشنهادی و گام بعدی

مدیریت ترتیب اجرای هوک‌های وردپرس، از فهم عدد اولویت شروع می‌شود، با ابزارهای دیباگ پخته می‌شود، و با مستندسازی به بلوغ می‌رسد. قواعد کلیدی: هرچه عدد کوچک‌تر، اجرای زودتر؛ از فواصل معنادار استفاده کنید، نه اعداد نزدیک به هم؛ هر add_action یا add_filter با کامنت «چرا این عدد» همراه باشد؛ و پیش از حذف هوک افزونهٔ دیگری، اولویت دقیق آن را بررسی کنید. این پنج قاعده، تفاوت بین یک افزونهٔ «کارکننده» و یک افزونهٔ «قابل اتکا» را می‌سازد.

گام بعدی عملی که پیشنهاد می‌کنم: در همین امروز، فهرست تمام add_action و add_filterهای افزونه یا چایلد تم خود را باز کنید و کنار هرکدام یک کامنت توضیحی اضافه کنید. اگر جایی از انتخاب خود مطمئن نیستید، اولویت را در بازهٔ ۲۰ تا ۵۰ قرار دهید و بعد با افزونهٔ Query Monitor ترتیب واقعی اجرا را در صفحهٔ نمونه ببینید. همین تمرین یک‌ساعته، تجربه‌ای می‌سازد که در پروژهٔ بعدی، ساعت‌ها وقت ذخیره می‌کند. اگر در پروژه‌ای با تعارض ترتیب هوک‌ها روبه‌رو شده‌اید و راه‌حل جالبی پیدا کرده‌اید، برای من جالب است بدانید کدام دو افزونه بود و چگونه ترتیب را مدیریت کردید — تجربهٔ خودتان را در دیدگاه‌ها بنویسید؛ به‌ویژه اگر روشی پیدا کرده‌اید که بدون تغییر اولویت، منطق را طوری بازطراحی می‌کند که به ترتیب وابسته نباشد. ⚙️