در فهرست پرتکرارترین تماس‌های پشتیبانی، تعارضِ قالب و افزونه همیشه در سه رتبهٔ اول است. جمله‌ای که پشتش پنهان می‌شود همیشه شبیه هم است: «سایت را تازه آپدیت کردم و این صفحه سفید شد». آنچه در واقعیت رخ می‌دهد، این است که دو لایهٔ نمایشی (پوسته و افزونه) هم‌زمان روی یک قلاب یا یک کلاس PHP نشسته‌اند و رفتارشان به هم می‌ریزد. تجربه‌ام می‌گوید بخش بزرگی از این طوفان‌ها با یک پیش‌سنجیِ سی‌دقیقه‌ای قابل پیشگیری است. این مقاله، همان پروتکل سی‌دقیقه‌ای است: نه فقط «چه‌کار کنیم که تعارض پیش نیاید»، بلکه «اگر پیش آمد، چطور در چند دقیقه آن را پیدا کنیم». پیش از هر چیز، اگر با مفاهیم پایه آشنا نیستید، قالب وردپرس چیست و افزونه وردپرس چیست را بخوانید.

چرا تعارض رخ می‌دهد؟

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

  • تصاحب نام تابع/کلاس: افزونه‌ای تابعی با نام عمومی مثل custom_function() تعریف می‌کند؛ افزونه/قالب دوم همان نام را می‌خواهد؛ PHP، قاتل می‌شود.
  • تزریق اسکریپت در جای نادرست: قالبی فرض می‌کند jQuery را خودش لود کرده؛ افزونه‌ای هم لود می‌کند و ترتیب به هم می‌ریزد.
  • سازگاری با صفحه‌ساز: افزونه‌ای با صفحه‌ساز اختصاصی قالب تعارض دارد یا آن را نادیده می‌گیرد.
  • دست‌کاری چرخهٔ رندر: افزونه‌ای روی the_content چیزی سوار می‌کند و قالب، همان فیلتر را در جای اشتباه مصرف می‌کند.

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

هر افزونه، یک قلمرو پنهان روی هوک‌های وردپرس می‌سازد. تعارض، لحظهٔ تلاقیِ دو قلمروی ناهم‌ساز است.

نقاط شایعِ تعارض

در تجربه، بیشترین تعارض‌ها در این نقاط رخ می‌دهد — یعنی این‌ها را باید در اولویتِ سنجش قرار دهید:

نقطهٔ تعارضنشانهافزونه/لایهٔ معمول
حلقۀ اصلی نمایشصفحهٔ بایگانی خالی می‌شودقالب + افزونۀ صفحات سفارشی
صفحهٔ محصول ووکامرسگالری/دکمه از کار می‌افتدقالب + ووکامرس + افزونۀ گالری
صفحه‌ساز اختصاصیویرایشگر صفحه بارگذاری نمی‌شودقالب + Elementor/Divi
فیلتر محتوامحتوا دوبار رندر می‌شودافزونۀ محتوا + قالب
enqueue اسکریپتمنوی موبایل باز نمی‌شودقالب + افزونۀ minify

همین جدول، ستونِ «اولویتِ تست» شماست. اگر پیش از انتشار به این پنج نقطه دست بزنید، ۸۰٪ تعارض‌های شایع را قبل از کاربرِ واقعی کشف می‌کنید. توجه داشته باشید که تعارض، همیشه «خطا» نیست — گاهی فقط «به‌هم‌ریختگی» است؛ همان بدترین حالت، چون ابزارها آن را با صدای بلند اعلام نمی‌کنند. نقش افزونه‌ها بر سرعت سایت هم از همین جنس است و پیشنهاد می‌کنم پیش از تست، آن را مرور کنید.

محیط پیش‌سنجی: استیجینگ بدون بهانه

قبل از هر پروتکلِ فنی، باید محیطی داشته باشید که خرابی روی آن، هزینه نداشته باشد. سه راه، از ارزان به حرفه‌ای: سایت دوم روی همان هاست در subdomain، محیط محلی با LocalWP، و استیجینگ یک‌کلیکی هاست‌های وردپرس‌محور. اگر با هیچ‌کدام آشنا نیستید، پیش از ادامه این بخش را یک بار اجرا کنید. یک نکتهٔ عملی که تجربه‌ام بر آن تأکید دارد: استیجینگ باید «دیتای واقعی» داشته باشد، نه لورم ایپسوم. چون بخش عمدهٔ تعارض‌ها روی محتوای واقعی و روی حجم بالای داده رخ می‌دهد. نحوهٔ بردنِ دیتای واقعی به استیجینگ، در همان مقالۀ بهترین روش تست قالب مرحله‌به‌مرحله آمده.

پروتکل سی‌دقیقه‌ای پیش‌سنجی

این پروتکل، همان ترتیبی است که در پروژه‌های خودم اجرا می‌کنم و در اکثر موارد، پیش از انتشار، تعارض‌ها را لو می‌دهد:

  1. پشتیبان‌گیری و مستندسازی: از دیتابیس و فایل‌ها بکاپ کامل بگیرید. در فایل متنی، فهرستِ افزونه‌های فعال و نسخهٔ آن‌ها را یادداشت کنید. اگر بحران شد، این فهرست، نقشهٔ بازگشت شماست.
  2. حالت تک‌متغیر: قالب جدید را فعال کنید و همهٔ افزونه‌ها را خاموش نگه دارید. یک صفحهٔ ساده را باز کنید. این گام، حداقلِ سیستم است: اگر همین صفحه کار نمی‌کند، مشکل در قالب است.
  3. افزونه‌های حیاتی، یک‌به‌یک: حالا افزونه‌های حیاتی (سئو، امنیت، کش، فرم، ووکامرس) را یکی‌یکی روشن کنید. بین هر روشن‌کردن، همان صفحه‌ها را رفرش کنید. به محض دیدن شکست، مقصر را در فهرست یادداشت کنید و بگذارید کنار.
  4. پنج نقطهٔ شایع: همان جدول بالا. صفحهٔ بایگانی، صفحهٔ محصول، صفحه‌ساز، یک نوشتهٔ بلند، و یک صفحه با minify فعال.
  5. سنجش سرعت و CWV: پس از پایداری، Core Web Vitals چیست را مرور کنید و روی سه صفحهٔ نمونه PageSpeed بگیرید. اگر LCP افت کرد، تعارض سرعت دارید — حتی اگر پیام خطایی نباشد.
  6. ثبت نتیجه: فهرست «سازگار/ناستگار» را در مستندات پروژه ذخیره کنید. این فهرست، در آپدیت بعدی، دارایی شماست.

در تجربه‌ام، سه چهارمِ تعارض‌ها در گام دوم یا سوم لو می‌روند. اگر تا گام چهارم رسیدید و تعارضی ندیدید، با احتمالی بالا قالب با اکوسیستم شما سازگار است.

سازگاری، ویژگی نیست؛ نتیجهٔ «تستِ مرحله‌ایِ منظم» است. قالب خوب هم بدون تست، روزی سایت شما را می‌خواباند.

عیب‌یابی در زمانِ بحران

اگر تعارض در سایت زنده رخ داد — مثلاً پس از یک آپدیت — این مسیرِ تشخیص سریع را اجرا کنید:

  1. تیترِ خطا را از لاگ بگیرید: فعال‌سازی موقت WP_DEBUG و WP_DEBUG_LOG در wp-config.php، سپس نگاه به wp-content/debug.log.
  2. غیرفعال‌سازی دسته‌ای افزونه‌ها: اگر پیشخوان هم باز نمی‌شود، پوشهٔ wp-content/plugins را با FTP به plugins-disabled تغییر نام دهید تا همه خاموش شوند.
  3. غیرفعال‌سازی موقت قالب از دیتابیس: اگر تعارض از قالب است، با جدول wp_options و کلید template و stylesheet، به قالب پیش‌فرض برگردید.
  4. ترتیب بازگرداندن: ابتدا افزونه، سپس قالب. هر مرحله با تستِ یک صفحه.
  5. ثبتِ پرونده: افزونهٔ متخلف را مشخص و برای سازنده گزارش کنید — با اسکرین‌شات، فهرست کامل افزونه‌ها و نسخهٔ وردپرس.

نکتهٔ مهم: هرگز در حالتِ بحران، کدِ افزونه یا قالب را مستقیم ویرایش نکنید. اولین عکس‌العمل باید «غیرفعال‌کردن» باشد؛ «ترمیم»، مرحلهٔ بعدی است.

دید مهندسی: چرا تعارض‌ها به PHP می‌رسند

برای توسعه‌دهندگانِ سطح بالا، منبعِ ریشه‌ایِ تعارض‌ها در معماری مشترکِ PHP و وردپرس نهفته است: وردپرس یک فضایِ نامِ سراسری (global namespace) دارد و اکوسیستمِ افزونه‌ها/قالب‌ها به‌طور قراردادی، فقط با پیشوندِ دلخواه از هم جدا می‌شوند. برخلافِ معماری‌های مبتنی بر dependency injection، در وردپرس هیچ «مکانیزمِ قطعیِ حل‌وفصل وابستگی» در زمان اجرا وجود ندارد. به همین دلیل، «تعارضِ نام» و «تعارضِ ترتیب اجرا» به‌طور طبیعی ممکن است. راهکار در سطح کد، دو الگو است: پیشوند اجباری برای تمام توابع/کلاس‌ها (مثلاً mytheme_، myplugin_) و تعریفِ محافظت‌شده با function_exists() برای توابعی که ممکن است قالب یا افزونهٔ دیگری هم تعریف کرده باشد. الگوی سوم که کمتر استفاده می‌شود ولی در پروژه‌های بزرگ، بازیِ تیم را عوض می‌کند: تاخیرِ قلاب‌ها. با تنظیم $priority در add_action و add_filter، می‌توان ترتیب اجرا را در برابر تغییرات اکوسیستم مقاوم کرد — به‌ویژه در فیلترهایی که بیش از یک افزونه روی آن‌ها نشسته. یک نکتهٔ فنی که تجربه‌اش را زیاد دیده‌ام: تعارض در پیشخوانِ مدیریت بیشتر از front-end رخ می‌دهد. چون در پیشخوان، ابزارهایی مثل فرم‌ساز، صفحه‌ساز و افزونه‌های سئو هم‌زمان روی اسکریپت‌های اصلی وردپرس سوار می‌شوند و رقابت برای enqueue بالا می‌گیرد. بنابراین بخش مهمی از پروتکل تست، باید در پیشخوان اجرا شود، نه فقط در front.

پیشگیریِ بلندمدت

سازگاری، وضعیت نیست؛ عادت است. چهار عادت را در تیم‌ها اجرا می‌کنم که در تجربه، بیشترین پیشگیری را با کمترین هزینه ساخته‌اند: یک — آپدیتِ مرحله‌ای: هرگز همهٔ افزونه‌ها را در یک لحظه آپدیت نکنید. دو — فهرستِ «افزونه‌های امن» که در مستندات پروژه نگه می‌دارید و افزونه‌های متفرقه را در آن راه نمی‌دهید. سه — تست دوره‌ای استیجینگ، پیش از هر آپدیتِ بزرگ. چهار — پیش از خرید قالب، یک بخشِ کوچک از پروتکلِ این مقاله را اجرا کنید. همین عادت چهارم، در تجربه‌ام بیشترین جلوگیری را از تعارض داشته. برای دیدنِ مسیرهای مرتبط، پیشنهاد می‌کنم امکانات قالب حرفه‌ای، چایلد تم و نقش آن در مقاوم‌سازی، و تشخیص قالب استاندارد را یک بار مرور کنید. اگر هم قصد تغییر قالب دارید، تغییر امن قالب را قبل از اجرای پروتکل این مقاله بخوانید. و در نهایت، برای سنجش اثر افزونه‌های حیاتی روی اکوسیستم، افزونه‌های ضروری وردپرس، افزونه‌های سئو، افزونه‌های امنیتی و افزونه‌های کش را مرجع بگیرید.

جمع‌بندی

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