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

چرا هرگز هسته را ویرایش نکنیم؟

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

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

راه اصلی: هوک‌ها و فیلترها

وردپرس با طراحی هوک‌ها، اجازه می‌دهد بدون تغییر هسته، رفتار سایت را تغییر دهید. دو نوع: Action: اجرای یک تابع در لحظهٔ مشخص. Filter: تغییر یک داده در لحظهٔ مشخص. مثال — تغییر متن فوتر بدون ویرایش هسته:

add_filter( 'admin_footer_text', function( $text ) {
    return 'ساخته‌شده با ❤️ در تیم ما';
} );

مثال — تغییر طول خلاصهٔ نوشته:

add_filter( 'excerpt_length', function( $length ) {
    return 25;
} );

مثال — افزودن قابلیت به ویرایشگر:

add_action( 'init', function() {
    add_theme_support( 'post-thumbnails' );
} );

راهنمای کامل در هوک‌های وردپرس، تفاوت اکشن و فیلتر، نحوهٔ استفاده از add_action، و نحوهٔ استفاده از add_filter. تجربه‌ام: در ۹۵٪ نیازها، هوک‌ها کافی‌اند. حتی برای کارهایی مثل تغییر ساختار URL، حذف بخشی از پیشخوان، یا تغییر رفتار فرم‌ها.

لایهٔ دوم: چایلد تم

اگر تغییری به ظاهر یا template قالب مربوط است، چایلد تم انتخاب درست است. مثال — تغییر چیدمان کارت محصول در ووکامرس: به‌جای ویرایش فایل والد، همان فایل را در چایلد کپی و ویرایش کنید. مثال — افزودن استایل سفارشی: به‌جای @import در فایل والد، در style.css چایلد بنویسید. راهنمای کامل در قالب چایلد چیست، توسعه با چایلد تم، و ساخت چایلد تم امن. نکته: چایلد تم، همیشه بعد از والد بارگذاری می‌شود، بنابراین استایل‌های شما اولویت دارند. الگوی enqueue در افزودن کد سفارشی.

لایهٔ سوم: mu-plugins

پوشهٔ wp-content/mu-plugins/ برای کدی است که باید همیشه و بدون امکان خاموش‌شدن توسط کاربر اجرا شود. مثال‌های مناسب: ریدایرکت‌های حیاتی، مکانیزم لاگ امنیتی، تنظیمات ثابت اختصاصی سایت. مثال — غیرفعال‌کردن ویرایش فایل در پیشخوان:

<?php
// wp-content/mu-plugins/disable-file-editor.php
if ( ! defined( 'DISALLOW_FILE_EDIT' ) ) {
    define( 'DISALLOW_FILE_EDIT', true );
}

نکته: mu-plugins در پوشهٔ ریشه لود می‌شوند؛ اگر داخل پوشهٔ تودرتو باشند، به‌طور خودکار لود نمی‌شوند. الگوی فنی در ساختار فایل‌های افزونهٔ استاندارد. تجربه‌ام: در پروژه‌های شرکتی، کد زیرساختی که نباید کاربر سایت خاموشش کند، همیشه در mu-plugins می‌نشیند.

لایهٔ چهارم: افزونهٔ اختصاصی

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

لایهٔ پنجم: wp-config

بعضی تنظیمات جایشان در wp-config.php است، نه در کد افزونه. مثال‌های رایج:

// غیرفعال‌کردن ویرایش فایل در پیشخوان
define( 'DISALLOW_FILE_EDIT', true );

// غیرفعال‌کردن آپدیت خودکار افزونه‌ها
define( 'AUTOMATIC_UPDATER_DISABLED', false );

// افزایش حافظهٔ PHP
define( 'WP_MEMORY_LIMIT', '256M' );

// حالت دیباگ
// در محیط توسعه فعال، در Production غیرفعال
define( 'WP_DEBUG', false );

راهنمای کامل در امن‌سازی wp-config. نکته: هرگز این فایل را در Git Commit نکنید؛ در عوض، از یک فایل نمونه با مقادیر Placeholder استفاده کنید و در استقرار، مقادیر واقعی را جایگزین کنید. الگو در ساختاربندی پروژه.

موارد پرتکرار و راه‌حل تمیز

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

نیازویرایش غلطراه‌حل تمیز
تغییر متن فوتر پیشخوانویرایش wp-admin/admin-footer.phpفیلتر admin_footer_text
افزودن متا به هدرویرایش header.php قالبAction wp_head در چایلد/افزونه
تغییر تعداد نوشته‌های صفحهویرایش هستهفیلتر pre_get_posts
سفارشی‌سازی لاگینویرایش wp-login.phpAction login_enqueue_scripts
افزودن قابلیت به ویرایشگرویرایش post.phpAction init + add_theme_support

الگوی دقیق هر کدام در هوک‌های وردپرس و راهنمای حرفه‌ای هوک‌ها. تجربه‌ام: با فهرست بالا، ۸۰٪ موارد ویرایش هسته در پروژه‌ها حذف می‌شود.

اگر قبلاً هسته را ویرایش کرده‌اید

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

دید مهندسی: معماری افزونه‌پذیر

برای توسعه‌دهنده‌های سطح بالا، پرهیز از ویرایش هسته، بخشی از یک اصل بزرگ‌تر است: معماری افزونه‌پذیر. سه لایه در این معماری: یک — کدِ هسته، ثابت. دست‌نخورده می‌ماند تا همیشه آپدیت‌پذیر باشد. دو — کدِ قالب، لایهٔ باریک. فقط ظاهر؛ منطق ندارد. سه — کدِ افزونه، منطقِ افزوده. هر قابلیت، در افزونهٔ خودش. در این معماری، «تغییر» از طریق هوک‌ها و APIها انجام می‌شود، نه با ویرایش کدهای موجود. مزیت: هر آپدیت، بی‌خطر است؛ هر تغییر، قابل بازگشت است؛ هر انتقال به تیم دیگر، بدون درد است. تجربه‌ام: در پروژه‌ای که این معماری رعایت شده بود، در سه سال و در پنج آپدیت بزرگ وردپرس، حتی یک ساعت downtime نداشتیم. در پروژه‌ای که این معماری رعایت نشده بود، هر آپدیت، یک هفته استرس بود. الگوی معماری در استانداردهای کدنویسی، ساختاربندی پروژه، و افزودن کد سفارشی. یک نکتهٔ فنی: در پروژه‌های سازمانی، برخی تیم‌ها به‌جای ویرایش هسته، از Fork استفاده می‌کنند — یعنی نسخهٔ خودشان از وردپرس، که به‌صورت دوره‌ای با نسخهٔ رسمی merge می‌شود. این روش در پروژه‌های خیلی بزرگ منطقی است، ولی برای ۹۹٪ پروژه‌ها، Over-Engineering است. برای اکثر پروژه‌ها، هوک + افزونهٔ اختصاصی، انتخاب درست است.

اشتباهات رایج

  • ویرایش مستقیم فایل‌های هسته: بزرگ‌ترین اشتباه ممکن — اشتباهات رایج توسعه.
  • ویرایش wp-config بدون بکاپ: خطای کوچک، سایت را از دسترس خارج می‌کند. امن‌سازی wp-config.
  • قرار دادن منطق در چایلد تم: با تغییر قالب از دست می‌رود — چایلد تم.
  • استفاده از اسنیپت برای کدهای بزرگ: ساختاردهی سخت و بدون تست. اسنیپت‌ها.
  • نادیده‌گرفتن هوک‌های موجود: با پرسیدن «آیا وردپرس این کار را با هوک انجام می‌دهد؟» می‌شود از ویرایش هسته پرهیز کرد. هوک‌ها.
  • نادیده‌گرفتن Git برای کد سفارشی: بازگشت پس از خطا دشوار. گیت در وردپرس.
  • نبود تست روی محیط لوکال: ریسک روی سایت زنده. محیط لوکال.
  • نبود مستندسازی کد سفارشی: در انتقال به تیم بعدی، همه‌چیز بازنویسی می‌شود. ساختاربندی پروژه.
  • نادیده‌گرفتن استانداردهای کدنویسی: کد غیرقابل نگهداری. استانداردها.
  • اعتماد به «تغییر کوچک»: حتی یک خط تغییر در هسته، در روز آپدیت، از دست می‌رود. جایگزین هوکی.

جمع‌بندی

افزودن کد سفارشی به وردپرس، بدون ویرایش هسته، پنج لایه دارد: هوک‌ها، چایلد تم، mu-plugins، افزونهٔ اختصاصی، و wp-config. قاعدهٔ طلایی: هرگز فایل‌های هسته را دست نزنید. اگر امروز فقط یک کار می‌کنید: در پروژهٔ فعلی خود، هر تغییر کوچکی که در هسته یا قالب والد انجام داده‌اید را به یکی از این پنج لایه منتقل کنید. تجربهٔ خودتان از ویرایش هسته یا از یک آپدیت بدون دردسر، در دیدگاه‌ها ارزشمند است. 🛡️