دموی رایگان

چرا تداخل افزونه‌های وردپرس نتیجه نمی‌دهد؟ علت‌های پنهان

دلوین خیری مقدم خواندن ~۹ دقیقه افزونه‌ها و قالب‌ها
چرا تداخل افزونه‌های وردپرس نتیجه نمی‌دهد؟ علت‌های پنهان
تداخل افزونه‌های وردپرس وقتی حل‌شده حساب می‌شود که مشکل دیگر برنگردد؛ اما به تجربهٔ ما در حدود نیمی از پرونده‌هایی که بعد از یک رفع ناموفق به دستمان می‌رسد، ریشه، همان چیزی نبوده که بسته شده بود. پنج علت پنهانِ این برگشت الگوی تکراری دارند: دو افزونه با یک کتابخانهٔ مشترک، هوک تکراری و نبرد اولویت‌ها، کش و CDN قدیمی، ویرایش مستقیم قالب والد و به‌روزرسانی ناهماهنگ. در ادامه هر علت را با نشانهٔ مخصوصش باز می‌کنیم و روش تشخیص ایزوله را در پنج قدم می‌دهیم.

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

ابعاد مسئله را یک عدد نشان می‌دهد: بر پایهٔ دادهٔ W3Techs، وردپرس نزدیک به ۴۳ درصد از کل وب‌سایت‌های جهان را پشتیبانی می‌کند (تاریخ گردآوری: آبان ۱۴۰۵)؛ یعنی میلیون‌ها سایت، ترکیبی از ده‌ها هزار افزونه و قالب مستقل را اجرا می‌کنند و هیچ سازنده‌ای نمی‌تواند همهٔ ترکیب‌های ممکن را پیش از نصب شما آزمایش کند. به تجربهٔ ما به همین دلیل، تداخل پدیدهٔ استثنایی نیست؛ پیامد طبیعی اکوسیستم باز است. سایت‌هایی که فرایند تشخیص ایزوله و قواعد پیشگیری دارند، از همین وضعیت کم‌ضررتر عبور می‌کنند.

چرا تداخل افزونه‌های وردپرس بعد از «رفع» برمی‌گردد؟

نشانهٔ سطحی در برابر ریشهٔ پنهان
نشانه را نبندید؛ ردیف ریشه را پیدا کنید و آزمایش را به همان سمت ببرید.

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

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

علت پنهان اول؛ دو افزونه، یک کتابخانه

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

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

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

علت پنهان دوم؛ هوک تکراری و نبرد اولویت‌ها

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

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

و چرا برگشت؟ چون غیرفعال‌سازی یکی از دو افزونه، ترتیب اجرا را موقتاً مرتب می‌کند؛ اما به‌روزرسانی بعدی همان دو افزونه، اولویت‌ها را دوباره جابه‌جا می‌کند و نبرد از سر می‌گیرد. ریشه‌ای بسته می‌شود که یکی از دو کارکرد تکراری را حذف کنید — معمولاً افزونه‌ای که کارش را دیگری هم انجام می‌دهد — نه اینکه هر دو را نگه دارید و انتظار داشته باشید ترتیب اجرا همیشه به نفع شما بماند.

علت پنهان سوم؛ کش و CDN قدیمی

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

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

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

علت پنهان چهارم و پنجم؛ ویرایش قالب والد و به‌روزرسانی ناهماهنگ

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

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

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

تشخیص ایزوله؛ غیرفعال‌سازی گام‌به‌گام، لاگ خطا و سایت استیجینگ

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

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

دو ابزار، چشم شما در این آزمایش‌اند: لاگ خطا و کنسول مرورگر. ثابت اشکال‌زدایی در فایل پیکربندی وردپرس، خطاها را در فایل debug.log با زمان دقیق رخداد ثبت می‌کند؛ کنسول مرورگر سمت کاربر، خطاهای جاوااسکریپت و فایل مقصر را نشان می‌دهد. زمانِ خطاهای لاگ را با زمان فعال‌سازی هر افزونه تطبیق دهید؛ هر جا این دو زمان هم‌پوشانی دارند، متهم است.

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

پیشگیری و جمع‌بندی؛ قواعدی که تداخل را کم می‌کند

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

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

دموی رایگان پلتفرم

پلن بینش — ۲٫۹ میلیون تومان/ماه (ممیزی + ۱۰ محتوای سئو)

دموی رایگان پلتفرم

رصد ما، رشد شما.

سؤالات پرتکرار

چرا بعد از غیرفعال‌کردن افزونهٔ مقصر، مشکل دوباره برمی‌گردد؟

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

چطور بفهمم دو افزونه کتابخانهٔ مشترک دارند؟

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

آیا آزمایش غیرفعال‌سازی روی سایت زنده خطرناک است؟

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

لاگ خطای وردپرس چیست و چطور فعال می‌شود؟

ثابت اشکال‌زدایی در فایل پیکربندی وردپرس است که خطاها را با زمان دقیق در فایل debug.log ثبت می‌کند؛ زمان خطاها را با زمان فعال‌سازی هر افزونه تطبیق می‌دهید و بعد از تشخیص، خاموشش کنید.

چند افزونه برای یک سایت وردپرسی منطقی است؟

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