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

اولویت هوک، از نگاه مفهوم

اولویت هوک، همان‌طور که اسمش می‌گوید، یک معیار ترتیب است. وقتی یک هوک در وردپرس اجرا می‌شود — مثلاً the_content، init، یا wp_enqueue_scripts — وردپرس باید تصمیم بگیرد که توابع متصل‌شده به آن را به چه ترتیبی صدا بزند. این تصمیم بر اساس عدد اولویت انجام می‌شود: هرچه عدد کوچک‌تر، اجرای زودتر.

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

درک این مفهوم در سطح بنیادی، سه پیامد عملی دارد که در پروژه‌های واقعی بارها به آن‌ها برخورده‌ام:

  • اولویت، ابزار هماهنگی با افزونه‌های دیگر است، نه ابزار افزایش قدرت افزونهٔ شما.
  • اولویت، ابزار ایمن‌سازی رفتار در برابر ترتیب تصادفی نصب افزونه‌ها است.
  • اولویت، ابزار مستندسازی نیّت شما است؛ هر عدد باید بگوید «من می‌خواهم این‌جا اجرا شوم، به این دلیل».
اولویت هوک، در واقع یک جملهٔ کوتاه است که شما برای وردپرس می‌نویسید: «من می‌خواهم در این لحظه اجرا شوم.» طول این جمله با یک عدد سنجیده می‌شود و هزینهٔ اشتباه در آن، می‌تواند ساعت‌ها دیباگ باشد.

آناتومی داخلی: وردپرس اولویت را چطور ذخیره و مرتب می‌کند

برای این‌که انتخاب عدد از حالت حدس خارج شود، ارزش دارد بدانید وردپرس در پشت صحنه چه کار می‌کند. کلاس مرکزی این کار WP_Hook است که برای هر تگ (نام هوک) یک نمونه ساخته می‌شود و در آن، hook handlerها را در یک ساختار درختی با کلید اولویت ذخیره می‌کند.

ساختار ساده است: برای هر تگ، وردپرس یک آرایه دارد که کلیدهایش اعداد اولویت هستند و مقادیر، آرایه‌ای از hook handlerهای آن اولویت. وقتی هوک اجرا می‌شود، این آرایه با ksort مرتب می‌شود و سپس به‌ترتیب پیمایش می‌شود. معنی این ساختار، سه نکتهٔ مهم را در خود دارد:

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

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

نکتهٔ سوم: وردپرس محدودیتی روی بزرگی عدد ندارد؛ می‌توانید از PHP_INT_MAX برای «آخرین اجرا» استفاده کنید. این مقدار در افزونه‌های پایش یا پاک‌سازی نهایی مفید است.

// نمونه ساده از یک hook handler با اولویت صریح
add_action( 'init', 'wphk_init_early', -5 );
add_action( 'init', 'wphk_init_default' );           // پیش‌فرض: 10
add_action( 'init', 'wphk_init_late', 50 );
add_action( 'init', 'wphk_init_last', PHP_INT_MAX );

در این نمونه، چهار hook handler داریم که در چهار مرحلهٔ متفاوت اجرا می‌شوند: wphk_init_early پیش از همه، wphk_init_default در میانه، wphk_init_late بعد از بیشتر افزونه‌ها، و wphk_init_last در انتهای صف. اگر این ساختار را در ذهن داشته باشید، انتخاب عدد دیگر حدس نیست؛ یک تصمیم آگاهانه است. نحوۀ افزودن این‌گونه hook handlerها در نحوه استفاده از add_action در وردپرس و نحوه استفاده از add_filter در وردپرس با جزئیات آمده است.

زبان اعداد: بازه‌ها و معانی رایج آن‌ها

در اکوسیستم وردپرس، بازه‌های عددی به‌طور غیررسمی معانی خاصی پیدا کرده‌اند. شناخت این زبان، به شما کمک می‌کند عددی انتخاب کنید که با انتظارات سایر توسعه‌دهنده‌ها هماهنگ باشد.

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

یک تذکر مهم: این جدول، قواعد سخت‌گیرانه نیست؛ یک زبان مشترک است. وردپرس شما را مجبور نمی‌کند بین ۲۰ و ۵۰ بمانید یا از ۹۹ نگذرید. اما وقتی در اکوسیستمی کار می‌کنید که همه به این زبان وفادارند، انتخاب عدد در همان بازه‌ها، احتمال تعارض با افزونه‌های دیگر را به‌طور محسوس پایین می‌آورد. توضیح تکمیلی این جدول و مثال‌های بیشتر در Priority در هوک‌های وردپرس چیست آمده است.

وقتی دو hook handler هم‌اولویت می‌شوند

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

این وابستگی به «ترتیب فعال‌شدن» منبع بی‌پایان رفتارهای غیرقابل پیش‌بینی است. در پروژه‌ای که چند افزونه داشتیم، رفتار یک صفحه بسته به این‌که کدام افزونه اول فعال شده بود، تفاوت داشت. اگر مدیر افزونهٔ A را غیرفعال و دوباره فعال می‌کرد، ترتیب برعکس می‌شد و ظاهر سایت تغییر می‌کرد. این نوع رفتار، سخت‌ترین نوع دیباگ است چون مسئله در کد نیست؛ در نحوهٔ نصب افزونه‌ها است.

راه‌حل قطعی این مشکل، عدم اتکا به هم‌اولویتی است. اگر افزونهٔ شما منطقاً باید بعد از افزونهٔ دیگری اجرا شود، صریحاً عدد بزرگ‌تری انتخاب کنید — حتی با یک واحد تفاوت، مثل ۲۰ به‌جای ۱۰. این تفاوت کوچک، رفتار شما را از تصادف نجات می‌دهد. این نکته در اشتباهات رایج هنگام استفاده از هوک‌ها با مثال‌های بیشتر توضیح داده شده است.

وقتی دو hook handler هم‌اولویت می‌شوند، برندهٔ صف، شانس است؛ و شانس، پایدارترین معیار طراحی نرم‌افزار نیست.

انتخاب عدد مناسب در عمل: چارچوب پنج‌سوالی

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

سوال اول: آیا کد من پیش از منطق هسته باید اجرا شود یا بعد از آن؟

اگر پاسخ «پیش از هسته» است — مثلاً برای آماده‌سازی داده یا تغییر پارامترها قبل از پردازش استاندارد — عدد کمتر از ۱۰ (یا حتی منفی) انتخاب می‌کنم. اگر پاسخ «بعد از هسته» است، بازهٔ ۱۰ تا ۵۰ منطقی‌تر است.

سوال دوم: آیا کد من به خروجی افزونهٔ مشخصی وابسته است؟

اگر می‌دانم افزونهٔ خاصی روی این هوک کار می‌کند و من می‌خواهم بعد از آن اجرا شوم، عددی بزرگ‌تر از اولویت آن افزونه انتخاب می‌کنم. مثال: اگر افزونهٔ سئو در اولویت ۱۰ روی the_content کار می‌کند، من از اولویت ۲۰ یا ۲۵ استفاده می‌کنم.

سوال سوم: آیا کد من طول اجرای قابل توجهی دارد؟

اگر کد من کوئری سنگین یا پردازش طولانی دارد، بهتر است در مرحله‌ای اجرا شود که حتی اگر کند باشد، تجربهٔ کاربر را مختل نکند. مثلاً اجرای کوئری سنگین روی wp_loaded با اولویت بالا، بهتر از اجرای آن روی init با اولویت پایین است. چرا که در اولی، زمان بیشتری برای آماده‌سازی وجود دارد. مسیر دقیق این انتخاب را در چگونه ترتیب اجرای هوک‌ها را مدیریت کنیم آورده‌ام.

سوال چهارم: آیا افزونه‌های دیگر روی همان بازه کار می‌کنند؟

اگر می‌دانم چند افزونهٔ محبوب در بازهٔ ۱۰ تا ۲۰ کار می‌کنند، انتخاب ۲۵ یا ۳۰ مرا از رقابت با آن‌ها دور می‌کند. الگوی رایج در اکوسیستم وردپرس این است که افزونه‌های پرکاربرد در ۱۰، افزونه‌های جانبی در ۲۰، و افزونه‌های خاص در ۵۰ به بالا کار می‌کنند.

سوال پنجم: اگر فردا لازم شد چیزی بین کد من و افزونهٔ دیگر اضافه شود، جا دارم؟

این سوال، احتمالاً مهم‌ترین سوال است. اگر عدد ۱۱ را انتخاب کنم، و فردا بخواهم چیزی بین افزونهٔ اولویت ۱۰ و کد خودم اضافه کنم، فقط یک جای خالی دارم. اگر عدد ۲۵ را انتخاب کنم، چندین عدد خالی دارم و می‌توانم بی‌دغدغه توسعه بدهم.

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

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

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

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

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

  • افزونه‌های سئو (Yoast، Rank Math، AIOSEO): معمولاً در بازهٔ ۵ تا ۲۰ کار می‌کنند تا متادیتا پیش از رندر قالب آماده شود.
  • افزونه‌های کش و بهینه‌ساز (WP Rocket، LiteSpeed Cache): در اولویت‌های بالای ۹۹ یا با هوک‌های اختصاصی، پس از آماده شدن کامل HTML.
  • افزونه‌های فرم‌ساز (CF7، WPForms، Gravity Forms): در بازهٔ ۱۰ تا ۲۰ روی هوک‌های پردازش فرم.
  • افزونه‌های ووکامرس و افزونه‌های جانبی: در بازهٔ ۱۰ تا ۳۰ روی هوک‌های محصول، سبد و سفارش.
  • قالب‌ها: معمولاً استایل و اسکریپت خود را در اولویت ۲۰ یا ۲۵ بارگذاری می‌کنند تا استایل‌های افزونه‌ها پیش از آن‌ها اضافه شود.
  • افزونه‌های شخصی‌سازی: در بازهٔ ۲۰ تا ۵۰ برای هماهنگی با لایهٔ نمایش.

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

مقدار پیش‌فرض ۱۰: چرا این عدد؟

سؤال رایجی که در جلسات پرسیده می‌شود: چرا وردپرس عدد ۱۰ را به‌عنوان پیش‌فرض انتخاب کرده و نه ۱ یا ۱۰۰؟ پاسخ دقیق این سؤال در تصمیم‌های اولیهٔ وردپرس است و به این برمی‌گردد که هستهٔ وردپرس در ابتدا احتیاج داشت به hook handlerها اجازه دهد در دو جهت حرکت کنند: پیش از منطق پایه (با اعداد کمتر از ۱۰) و پس از آن (با اعداد بزرگ‌تر از ۱۰). عدد ۱۰ به‌عنوان نقطهٔ تعادل انتخاب شد تا فضای کافی در دو طرف باقی بماند.

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

بازه‌های پیشرفته: عدد منفی، PHP_INT_MAX و مقادیر بحرانی

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

عدد منفی

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

// تغییر مقدار پیش‌فرض پیش از هر افزونهٔ دیگری
add_filter( 'pre_option_blogname', 'wphk_pre_override_site_name', -99 );

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

مقدار PHP_INT_MAX

عدد PHP_INT_MAX بزرگ‌ترین عدد صحیح قابل نمایش در PHP است. اگر می‌خواهید hook handler شما آخرین چیز اجراشده در یک هوک باشد، این مقدار ابزار مناسبی است. کاربرد اصلی این حالت در پایش و پاک‌سازی نهایی است؛ مثلاً تابعی که در پایان هر اجرای init آمار جمع‌آوری می‌کند:

// آخرین hook handler در هوک init
add_action( 'init', 'wphk_collect_stats', PHP_INT_MAX );

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

مقادیر بحرانی برای تعامل با افزونه‌های شناخته‌شده

گاهی عدد خاصی را باید انتخاب کنید که با یک افزونهٔ شناخته‌شده هماهنگ باشد. مثلاً برخی افزونه‌های سئو در اولویت ۱۵ روی the_content کار می‌کنند. اگر می‌خواهید کد شما بعد از آن‌ها اجرا شود، ۱۵ را انتخاب نکنید؛ ۲۰ یا ۲۵ انتخاب کنید. این نکتهٔ ظریف، در بهترین افزونه‌های سئو وردپرس و مهم‌ترین Filter Hook های وردپرس قابل بررسی بیشتر است.

سه پرونده واقعی که با تغییر یک عدد حل شدند

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

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

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

پروندهٔ دوم: هزینهٔ اضافهٔ سبد خرید که دو بار محاسبه می‌شد

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

پروندهٔ سوم: تزریق اسکیما که با افزونهٔ سئو تعارض داشت

در یک سایت با افزونهٔ سئوی شناخته‌شده، تزریق کد اسکیمای اختصاصی ما گاهی با اسکیمای افزونهٔ سئو تداخل می‌کرد و در Rich Results، خروجی معیوب بود. راه‌حل: هوک ما از wp_head با اولویت ۱۰ به اولویت ۲۰ منتقل شد و پیش از تزریق، شرط is_singular( "product" ) اضافه شد. نتیجه: هر دو اسکیما در head قرار گرفتند، اما ترتیب و شرایط دقیقاً منطبق با انتظار بود. جزئیات این سناریو در نقش Schema در AEO نیز باز شده است.

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

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

در بازبینی ده‌ها افزونه و چایلد تم، شش الگوی تکراری را در این حوزه دیده‌ام:

اشتباهپیامد واقعیاصلاح
عدم تعیین صریح اولویتتعارض تصادفی با افزونه‌های دیگرتعیین عدد صریح با کامنت توضیحی
انتخاب اعداد بسیار نزدیک به همجای مانور آینده از دست می‌رودفواصل معنادار (۵، ۲۰، ۵۰، ۹۹)
اتکا به ترتیب ثبت hook handlerهارفتار وابسته به ترتیب فعال‌سازی افزونه‌هااولویت صریح با عدد بزرگ‌تر
استفاده بی‌رویه از اعداد منفیدیباگ‌ناپذیری و رفتار غیرقابل انتظاراستفاده از منفی فقط در موارد ضروری و مستند
تغییر اولویت بدون مستندسازیتوسعه‌دهندهٔ بعدی دلیل را نمی‌داندکامنت توضیحی در کنار هر add_action/add_filter
نبود تست بازهٔ کامل پس از تغییر اولویتمشکلات جدید در گوشه‌های سایتتست چک‌لیست قبل از انتشار

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

لایهٔ تصمیم‌گیری حرفه‌ای: چه زمانی اولویت را انتخاب کنیم و چه زمانی نه

یک نکتهٔ مهم که کمتر گفته می‌شود: هر hook handler نیاز به اولویت صریح ندارد. در برخی موارد، انتخاب عدد، انتخاب درست نیست؛ انتخاب خودِ هوک، یا انتخاب نکردن این hook handler در این مسیر، تصمیم بهتر است.

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

حالت اول: اولویت صریح الزامی است

وقتی کد شما با افزونه‌های دیگر روی همان هوک کار می‌کند، انتخاب اولویت صریح لازم است. مثال‌ها: the_content، wp_head، woocommerce_cart_calculate_fees. در این حالت، هر hook handler بدون اولویت صریح، یک ریسک بالقوه است.

حالت دوم: اولویت پیش‌فرض کافی است

وقتی کد شما روی هوکی کار می‌کند که معمولاً هیچ افزونهٔ دیگری روی آن نیست، اولویت پیش‌فرض ۱۰ کافی است. مثال‌ها: هوک‌های اختصاصی که خودتان تعریف کرده‌اید، هوک‌های داخلی استفاده‌نشدهٔ وردپرس. در این حالت، انتخاب عدد بزرگ‌تر، صرفاً پیچیدگی کد را افزایش می‌دهد.

حالت سوم: مسئلهٔ شما هوک نیست

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

قاعدهٔ عملی من: هر وقت برای اولین بار روی یک هوک کار می‌کنم، به فهرست hook handlerهای موجود نگاه می‌کنم — با Query Monitor یا با جستجو در کد افزونه‌های فعال — و بعد تصمیم می‌گیرم. این نگاه اولیه، چند دقیقه وقت می‌گیرد، ولی همان چند دقیقه، ساعت‌ها دیباگ بعدی را از بین می‌برد. توضیح ابزارهای این بررسی در دیباگ کردن Action و Filter در وردپرس آمده است.

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

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

سخن آخر و مسیر عملی پیشنهادی

اولویت هوک در وردپرس، عددی است که تعیین می‌کند کد شما در چه لحظه‌ای از چرخهٔ اجرای هر هوک، به‌کار گرفته می‌شود. داخلیِ وردپرس، این اعداد را در یک ساختار درختی ذخیره می‌کند و بر اساس مرتب‌سازی آن‌ها، hook handlerها را به‌ترتیب صدا می‌زند. عدد کوچک‌تر، اجرای زودتر؛ عدد بزرگ‌تر، اجرای دیرتر. بازه‌های اعداد در اکوسیستم وردپرس، معانی غیررسمی مشخصی دارند و انتخاب در همان بازه‌ها، احتمال تعارض را پایین می‌آورد. در انتخاب عدد، پنج سؤال کلیدی — وابستگی به هسته، وابستگی به افزونهٔ دیگر، طول اجرا، رقابت با افزونه‌های موجود، و فضای مانور آینده — شما را از حدس‌زدن دور می‌کند. و در نهایت، مستندسازی دلیل انتخاب، به همان اندازهٔ انتخاب مهم است.

گام بعدی عملی که پیشنهاد می‌کنم: در همین امروز، فایل functions.php چایلد تم خود را باز کنید و ببینید چند add_action و add_filter بدون اولویت صریح نوشته‌اید. اگر بیشتر از سه یا چهار مورد است، احتمالاً در برخی از آن‌ها، رفتار سایت به ترتیب نصب افزونه‌ها وابسته است. برای هرکدام که در حوزهٔ پرترافیک (مثل the_content، wp_head، یا هوک‌های ووکامرس) کار می‌کند، یک عدد صریح انتخاب کنید و در کنارش یک کامنت کوتاه بنویسید که چرا این عدد. این تمرین یک‌ساعته، هم کد را حرفه‌ای‌تر می‌کند و هم آگاهی شما را از رفتار سایت بالا می‌برد. اگر در پروژه‌ای با تعارض اولویت‌ها روبه‌رو شده‌اید و راه‌حل جالبی پیدا کرده‌اید، برای من جالب است بدانید کدام دو hook handler بود و چگونه با تغییر عدد یا منطق، مشکل را حل کردید — تجربهٔ خودتان را در دیدگاه‌ها بنویسید؛ به‌ویژه اگر روشی پیدا کرده‌اید که بدون تغییر عدد، ساختار کد را از وابستگی به ترتیب رها می‌کند. 🔢