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

عدم نمایش منو دقیقاً به چه معناست؟

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

در وردپرس، سیستم منوها (Navigation Menus) یکی از مکانیزم‌های کلیدی برای ساختاردهی محتواست. این سیستم از سه لایه تشکیل شده است: لایه ثبت موقعیت (register_nav_menus)، لایه ساخت منو در پیشخوان، و لایه فراخوانی در قالب (wp_nav_menu). هر یک از این لایه‌ها اگر به‌درستی کار نکند، منو در سایت نمایش داده نمی‌شود. برای درک دقیق‌تر جایگاه منو در معماری قالب، مقاله قالب وردپرس چیست و چگونه انتخاب کنیم را توصیه می‌کنم.

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

نکته دوم: «عدم نمایش منو» همیشه به‌معنی «نبود منو» نیست. گاهی ریشه در تنظیمات موقعیت‌ها، در فایل‌های قالب، در کش، یا در تعارض با افزونه‌های منو است. برای فهم بهتر ساختار WordPress و مکانیزم منوها، ویکی‌پدیا نقطه شروع خوبی است.

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

هشت ریشه اصلی این خطا

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

۱. نبود register_nav_menus در قالب جدید

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

۲. تغییر نام موقعیت منو

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

۳. فراخوانی نکردن wp_nav_menu در فایل قالب

موقعیت منو درست ثبت شده، اما قالب در فایل‌های خود (مثل header.php) هرگز wp_nav_menu را فراخوانی نمی‌کند. در این حالت، منوها در پیشخوان قابل تنظیم هستند اما در سایت نمایش داده نمی‌شوند. این حالت در قالب‌هایی که با پنل‌های اختصاصی کار می‌کنند و منو را از طریق آن پنل کنترل می‌کنند، شایع است. برای مطالعه بیشتر درباره ساختار فایل قالب، مقاله ساختار فایل‌های یک قالب استاندارد وردپرس را توصیه می‌کنم.

۴. تعارض با افزونه‌های مدیریت منو

افزونه‌هایی مثل Max Mega Menu یا Menu Icons، سیستم منوی وردپرس را با افزونه‌های خودشان جایگزین می‌کنند. اگر این افزونه‌ها با قالب جدید تعارض داشته باشند، منوها در سایت ناپدید می‌شوند. این حالت در سایت‌هایی که از مگامنو استفاده می‌کنند، بسیار شایع است.

۵. مشکل در کش یا CDN

افزونه‌های کش مثل WP Rocket یا LiteSpeed Cache، صفحات را به‌عنوان HTML استاتیک ذخیره می‌کنند. اگر این کش به‌درستی مدیریت نشود، بعد از تغییرات در منو، سایت همچنان نسخه قدیمی را نمایش می‌دهد. این حالت شایع‌ترین دلیل «مشکل در ساعات پیک» است — همان چیزی که در بهترین افزونه‌های کش وردپرس به آن پرداخته‌ام.

۶. تعارض با افزونه‌های امنیتی یا عضویت

افزونه‌هایی مثل Members یا User Role Editor می‌توانند دسترسی به منوها را بر اساس نقش کاربری محدود کنند. اگر این تنظیمات با قالب جدید تعارض داشته باشند، ممکن است منوها برای کاربران ناشناس یا غیرمجاز ناپدید شوند. این حالت در سایت‌های عضویت‌محور یا فروشگاهی که نقش‌های کاربری مختلف دارند، شایع است.

۷. مشکل در ساختار قالب یا فایل‌های جانبی

اگر قالب شما از فایل‌هایی مثل header.php یا template-parts/header/navigation.php استفاده می‌کند و این فایل‌ها شرط‌های اضافی (مثل has_nav_menu()) داشته باشند یا حلقه منو را محدود کنند، ممکن است منو نمایش داده نشود. این حالت در قالب‌های مدرن که از ساختار ماژولار استفاده می‌کنند، شایع است.

۸. مشکل در دیتابیس یا شمارنده منو

در موارد نادر، جدول‌های wp_terms، wp_term_taxonomy، یا wp_term_relationships می‌توانند خراب شوند یا رکوردهای ناسازگار داشته باشند. اگر شمارنده count در جدول wp_term_taxonomy اشتباه باشد، ممکن است منوها در پیشخوان نمایش داده شوند اما در سایت نه. برای مطالعه بیشتر درباره دیتابیس، مقاله تأثیر دیتابیس بر سرعت سایت را توصیه می‌کنم.

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

نشانه‌ها و علائم تشخیص

این خطا در همه موارد به‌شکل یک پیام صریح ظاهر نمی‌شود. در تجربه‌ام، این نشانه‌ها ظاهر می‌شوند و اگر به آن‌ها توجه کنید، می‌توانید به‌موقع اقدام کنید:

  • خالی بودن بخش منوی سایت: اگر header سایت کاملاً خالی است و هیچ آیتمی نمایش داده نمی‌شود، احتمالاً wp_nav_menu فراخوانی نشده یا موقعیت منو ثبت نشده است.
  • نبود گزینه موقعیت در «نمایش ← فهرست‌ها»: اگر در بخش مدیریت منوها، هیچ موقعیتی برای انتخاب نمایش داده نمی‌شود، یعنی قالب فعلی هیچ موقعیت منویی ثبت نکرده است.
  • نمایش پیام «هیچ منویی تخصیص داده نشده»: اگر در بخش مدیریت منوها این پیام را می‌بینید، یعنی موقعیت ثبت شده اما منویی به آن متصل نشده است.
  • نمایش منو فقط برای مدیر سایت: اگر منو فقط برای کاربران وارد‌شده نمایش داده می‌شود، مشکل در تنظیمات دسترسی است.
  • نمایش ناهماهنگ در مرورگرهای مختلف: اگر منو در یک مرورگر نمایش داده می‌شود و در دیگری نه، مشکل در کش مرورگر یا CDN است.
  • نمایش منو با استایل نادرست: اگر منو نمایش داده می‌شود اما با استایل نادرست یا نامرتب، احتمالاً مشکل در CSS یا در ساختار HTML منو است.
  • نمایش منو فقط در بعضی صفحات: اگر منو در صفحه اصلی نمایش داده می‌شود اما در صفحات داخلی نه، احتمالاً مشکل در شرط‌های قالب است.

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

پروتکل تشخیص گام‌به‌گام

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

گام اول: بررسی وضعیت پیشخوان

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

گام دوم: بررسی functions.php قالب

فایل functions.php قالب را باز کنید و به‌دنبال register_nav_menus یا register_nav_menu بگردید. اگر این تابع در قالب تعریف نشده، یعنی قالب هیچ موقعیت منویی را ثبت نمی‌کند. این حالت به‌ویژه در قالب‌های سفارشی که توسعه‌دهنده فراموش کرده این تابع را اضافه کند، شایع است.

نمونه درست ثبت:

function my_theme_register_menus() {
    register_nav_menus( array(
        'primary'   => __( 'منوی اصلی', 'my-theme' ),
        'secondary' => __( 'منوی پایین', 'my-theme' ),
        'footer'    => __( 'منوی فوتر', 'my-theme' ),
    ) );
}
add_action( 'after_setup_theme', 'my_theme_register_menus' );

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

فایل‌های قالب مثل header.php، footer.php، و template-parts/header/navigation.php را باز کنید و به‌دنبال wp_nav_menu بگردید. اگر این تابع در هیچ‌کدام از فایل‌ها فراخوانی نشده، یعنی قالب هیچ‌گاه منوها را نمایش نمی‌دهد، حتی اگر موقعیت‌ها ثبت شده باشند.

<?php
wp_nav_menu( array(
    'theme_location' => 'primary',
    'container'      => 'nav',
    'container_class' => 'primary-navigation',
    'menu_class'     => 'menu',
    'fallback_cb'    => false,
) );
?>

نکته مهم: وجود fallback_cb روی false تضمین می‌کند که اگر منویی به موقعیت متصل نبود، هیچ منوی پیش‌فرضی نمایش داده نشود. این الگو در همه قالب‌های حرفه‌ای رعایت می‌شود — همان اصلی که در بررسی مهم‌ترین امکانات یک قالب حرفه‌ای توضیح داده‌ام.

گام چهارم: بررسی اتصال منو به موقعیت

در پیشخوان، به «نمایش ← فهرست‌ها» بروید. در بالای صفحه، بخشی به نام «نمایش موقعیت» یا «Display location» وجود دارد. مطمئن شوید که منوی مورد نظر به موقعیت ثبت‌شده در قالب متصل شده است. اگر این تیک فعال نباشد، منو در سایت نمایش داده نمی‌شود.

گام پنجم: بررسی دیتابیس

اگر در پیشخوان منوها را می‌بینید اما در سایت ناپدید شده‌اند، وضعیت را در دیتابیس بررسی کنید. منوها در جدول wp_terms با term_group خاص ذخیره می‌شوند و در جدول wp_term_taxonomy با taxonomy = 'nav_menu' مشخص می‌شوند:

SELECT t.name, t.slug, tt.term_taxonomy_id, tt.count
FROM wp_terms t
INNER JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
WHERE tt.taxonomy = 'nav_menu';

خروجی این کوئری، همه منوها را نشان می‌دهد. اگر منویی در این فهرست نیست، یعنی در دیتابیس ثبت نشده است.

گام ششم: بررسی کش

اگر همه‌چیز در دیتابیس و قالب درست است، کش را پاک کنید. ترتیب اصولی: کش مرورگر (با Ctrl+Shift+R)، کش افزونه، کش سرور، و در نهایت کش CDN.

گام هفتم: تعویض قالب به قالب پیش‌فرض

اگر مشکل حل نشد، قالب را به یکی از قالب‌های پیش‌فرض وردپرس (مثل Twenty Twenty-Five) تغییر دهید و سایت را بررسی کنید. اگر منو در قالب پیش‌فرض نمایش داده می‌شود، مطمئن می‌شوید که مقصر خودِ قالب فعلی است. اگر مشکل ادامه داشت، احتمالاً یک افزونه یا تنظیمات سراسری مقصر است.

گام هشتم: غیرفعال‌سازی افزونه‌ها

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

تفاوت با خطاهای مشابه

عدم نمایش منو اغلب با خطاهای دیگری قاطی می‌شود. این جدول به شما کمک می‌کند تفاوت‌ها را سریع تشخیص دهید:

خطاعلت اصلینشانه کلیدی
عدم نمایش منونبود register_nav_menus یا wp_nav_menuمنو در پیشخوان هست اما در سایت نه
عدم نمایش ابزارک‌هانبود register_sidebarسایدبار خالی می‌شود
عدم نمایش برگه‌هاتنظیمات یا فایل page.phpمشکل مشابه، ولی در لایه برگه
عدم نمایش نوشته‌هاتنظیمات خواندن یا حلقه اصلیمشکل مشابه، ولی در لایه نوشته
عدم نمایش دسته‌بندی‌هاپرمالینک یا فایل قالبمشکل مشابه، ولی در لایه دسته
عدم نمایش دیدگاه‌هانبود comments_templateبخش دیدگاه‌ها خالی است
عدم بارگذاری استایل قالبنبود enqueue صحیح CSSقابل تشخیص در Network مرورگر

نکته ظریف: عدم نمایش منو و عدم نمایش ابزارک‌ها، اگرچه از نظر ظاهری مشابهند اما از نظر ریشه‌ای متفاوتند. منوها از تابع register_nav_menus و wp_nav_menu استفاده می‌کنند، در حالی که ابزارک‌ها از register_sidebar و dynamic_sidebar. برای مطالعه دقیق‌تر، مقاله خطای عدم نمایش ابزارک‌ها در قالب را ببینید.

راه‌حل‌های عملی برای هر ریشه

حالا که مقصر را شناسایی کردید، وقت درمان است. راه‌حل‌ها را بر اساس ریشه مشکل دسته‌بندی کرده‌ام:

راه‌حل ریشه اول: افزودن register_nav_menus به قالب

اگر قالب شما فاقد register_nav_menus است، این تابع را به functions.php اضافه کنید. همان الگویی که در بخش «تشخیص» نشان دادم، اصولی‌ترین روش است. نکته کلیدی: همیشه از پیشوند اختصاصی قالب در نام موقعیت استفاده کنید تا با سایر کدها تعارض نکند — همان اصلی که در کدنویسی اختصاصی برای قالب وردپرس توضیح داده‌ام.

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

اگر قالب جدید، موقعیتی با نام متفاوت از قالب قبلی ثبت کرده، می‌توانید منوهای قدیمی را به موقعیت جدید منتقل کنید. راه‌حل اصولی‌تر، این است که در قالب جدید، هم نام جدید و هم نام قدیمی را ثبت کنید:

register_nav_menus( array(
    'primary' => __( 'منوی اصلی', 'my-theme' ),
    // ثبت نام قدیمی به‌عنوان alias
    'main-menu' => __( 'منوی اصلی (مهاجرت)', 'my-theme' ),
) );

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

راه‌حل ریشه سوم: افزودن wp_nav_menu

اگر موقعیت‌ها ثبت شده‌اند اما قالب آن‌ها را فراخوانی نمی‌کند، باید wp_nav_menu را به فایل‌های قالب اضافه کنید. معمولاً این کد در header.php یا در فایل‌های ماژولار قرار می‌گیرد. همان الگویی که در بخش «تشخیص» نشان دادم، استاندارد است:

<?php
if ( has_nav_menu( 'primary' ) ) {
    wp_nav_menu( array(
        'theme_location' => 'primary',
        'container'      => 'nav',
        'container_class' => 'primary-navigation',
        'menu_class'     => 'menu',
        'fallback_cb'    => false,
        'depth'          => 3,
    ) );
}
?>

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

راه‌حل ریشه چهارم: رفع تعارض افزونه‌های مدیریت منو

اگر افزونه‌ای مثل Max Mega Menu یا Menu Icons دارید، بررسی کنید که با قالب جدید سازگار است یا نه. اگر سازگار نیست، افزونه را غیرفعال کنید یا قالب را به نسخه‌ای که با افزونه سازگار است تغییر دهید. در صورت نیاز، افزونه‌های جایگزین را از مخزن رسمی وردپرس انتخاب کنید.

راه‌حل ریشه پنجم: تغییر وضعیت منوها

اگر منوها در پیشخوان هستند اما به موقعیت متصل نیستند، به «نمایش ← فهرست‌ها» بروید و در بخش «نمایش موقعیت»، تیک مربوط به موقعیت را فعال کنید. برای تأیید، در سایت صفحه را رفرش کنید و منو را ببینید.

راه‌حل ریشه ششم: پاک کردن کش

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

راه‌حل ریشه هفتم: بازبینی شرط‌های قالب

اگر قالب شما از شرط‌های اضافی مثل is_front_page() یا is_user_logged_in() استفاده می‌کند، مطمئن شوید که این شرط‌ها به‌درستی اعمال شده‌اند. برای مثال، اگر از if ( is_user_logged_in() ) برای نمایش منو استفاده می‌کنید، کاربران مهمان منو را نمی‌بینند.

راه‌حل ریشه هشتم: بازسازی شمارنده منوها

اگر شمارنده منوها اشتباه است، می‌توانید آن را بازسازی کنید. با تابع wp_update_term_count() می‌توانید شمارنده‌ها را بازسازی کنید:

$menus = wp_get_nav_menus();
foreach ( $menus as $menu ) {
    wp_update_term_count( $menu->term_taxonomy_id, 'nav_menu' );
}

این کد، شمارنده همه منوها را بازسازی می‌کند. برای مطالعه بیشتر درباره بهینه‌سازی دیتابیس، مقاله بهینه‌سازی کوئری‌های MySQL را توصیه می‌کنم.

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

کالبدشکافی register_nav_menus: نقشه راه درست منوها

برای درک عمیق این مشکل، باید بدانید تابع register_nav_menus چطور کار می‌کند. این تابع در فایل wp-includes/nav-menu.php تعریف شده و وظیفه‌اش ثبت موقعیت‌های منو در متغیر گلوبال $_wp_registered_nav_menus است. وقتی این تابع فراخوانی می‌شود، مراحل زیر را طی می‌کند:

  1. بررسی اولیه: بررسی می‌کند که آیا موقعیت‌ها قبلاً ثبت شده‌اند یا خیر. اگر بله، آن‌ها را ادغام می‌کند.
  2. ذخیره در متغیر گلوبال: هر موقعیت با نام و توضیحاتش در متغیر گلوبال $_wp_registered_nav_menus ذخیره می‌شود.
  3. ثبت در Theme Support: اگر این اولین بار باشد، add_theme_support('menus') را فعال می‌کند.
  4. ثبت در هوک: این تابع باید در هوک after_setup_theme فراخوانی شود تا موقعیت‌ها قبل از رندر منو در دسترس باشند.

نکته مهم و کمتر شناخته‌شده: اگر register_nav_menus را در هوک اشتباه (مثلاً init یا wp_loaded) فراخوانی کنید، ممکن است موقعیت‌ها هرگز در پیشخوان نمایش داده نشوند. همیشه از هوک after_setup_theme استفاده کنید — همان اصلی که در نحوه استفاده صحیح از هوک‌های وردپرس توضیح داده‌ام.

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

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

سلسله‌مراتب قالب: نقشه راه درست نمایش منو

برای درک عمیق این مشکل، باید بدانید وردپرس در کدام فایل‌ها منو را فراخوانی می‌کند. برخلاف آرشیوها که سلسله‌مراتب دارند، منوها معمولاً در فایل‌های ثابت مثل header.php یا footer.php فراخوانی می‌شوند. اما برخی قالب‌های مدرن، ساختار ماژولار دارند و منو را در فایل‌های جداگانه مثل template-parts/header/navigation.php قرار می‌دهند. اگر این فایل‌ها وجود نداشته باشند یا خطا داشته باشند، منو نمایش داده نمی‌شود.

نکته کلیدی: اگر فایل header.php در قالب شما وجود ندارد، وردپرس از نسخه پیش‌فرض wp-includes/theme-compat/header.php استفاده می‌کند. این فایل پیش‌فرض، ساختار ساده‌ای دارد اما ممکن است منو را به شکلی نمایش دهد که با طراحی شما همخوان نباشد. به همین دلیل، همیشه توصیه می‌کنم فایل header.php را در قالب خود داشته باشید.

نکته دوم: در قالب‌های FSE (Full Site Editing)، فایل header.php وجود ندارد. به‌جای آن، وردپرس از فایل‌های HTML در پوشه templates و بلوک‌هایی مثل «Navigation» استفاده می‌کند. اگر این بلوک‌ها در قالب HTML شما وجود نداشته باشند، منو نمایش داده نمی‌شود. برای مطالعه بیشتر درباره گوتنبرگ و آینده ویرایش محتوا در وردپرس، این مقاله را توصیه می‌کنم.

نکته سوم: تابع wp_nav_menu پارامترهای متعددی دارد که به شما اجازه می‌دهد ساختار HTML منو را تغییر دهید. مهم‌ترین پارامترها عبارتند از:

  • theme_location — نام موقعیت منو که در register_nav_menus ثبت شده است
  • menu — نام، slug یا ID منو (در صورت نیاز به فراخوانی مستقیم)
  • container — تگ HTML برای احاطه منو (مثلاً nav یا div)
  • container_class — کلاس CSS برای container
  • menu_class — کلاس CSS برای ul منو
  • fallback_cb — تابع بازگشتی در صورت نبود منو (معمولاً false)
  • depth — حداکثر عمق زیرمنوها
  • items_wrap — الگوی HTML برای احاطه آیتم‌ها

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

استراتژی‌های پیشگیری در بلندمدت

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

۱. نگهداری استاندارد فایل‌های قالب

همیشه فایل header.php را در قالب خود داشته باشید و در آن، wp_nav_menu را فراخوانی کنید. این فایل به‌عنوان نقطه اصلی نمایش منو عمل می‌کند و اگر بافتی فایل اختصاصی نداشت، به این فایل رجوع می‌شود.

۲. استفاده از چایلد تم برای سفارشی‌سازی

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

۳. مدیریت صحیح پرمالینک و rewrite rules

ساختار پرمالینک را ساده نگه دارید. ساختار «نام نوشته» (Post Name) ساده‌ترین و کم‌تعارض‌ترین گزینه است. بعد از هر تغییر در پرمالینک یا تاکسونومی، به «تنظیمات ← پیوندهای یکتا» بروید و بدون تغییر، ذخیره کنید.

۴. بازبینی تنظیمات افزونه‌های منو

هر بار که افزونه منو را نصب یا آپدیت می‌کنید، تنظیمات آن را بررسی کنید. مطمئن شوید که با قالب فعلی سازگار است. اگر افزونه‌ای باعث تعارض شد، آن را غیرفعال کنید یا قالب را تغییر دهید.

۵. مستندسازی موقعیت‌های منو

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

۶. استفاده از ابزارهای حرفه‌ای

افزونه‌هایی مثل Query Monitor یا Debug Bar به شما نشان می‌دهند که کدام فایل قالب بارگذاری شده و کوئری منو چه بوده است. این اطلاعات در عیب‌یابی سریع بسیار ارزشمند است. برای مطالعه بیشتر، مقاله افزونه‌های ضروری مرورگر برای توسعه‌دهندگان را ببینید.

۷. مدیریت کش با درایت

اگر از افزونه کش استفاده می‌کنید، صفحات را در فهرست استثنا (Exclude) قرار دهید تا در حین توسعه، تغییرات بلافاصله اعمال شوند. بعد از اتمام توسعه، این استثنا را حذف کنید.

۸. تست بعد از هر تغییر تنظیمات

هر بار که موقعیت منو، منو، یا قالب را تغییر می‌دهید، سایت را در incognito تست کنید. کش می‌تواند تغییرات را پنهان کند و شما را به اشتباه بیندازد.

پرسش‌های پرتکرار درباره نمایش منو

چرا منو در پیشخوان می‌بینم اما در سایت نمایش داده نمی‌شود؟

سه احتمال: نبود register_nav_menus در قالب، نبود wp_nav_menu در فایل header، یا مشکل در اتصال منو به موقعیت. ابتدا موقعیت‌ها را بررسی کنید، سپس فایل قالب.

چرا در «نمایش ← فهرست‌ها» هیچ موقعیتی برای انتخاب نمی‌بینم؟

این یعنی قالب فعلی هیچ موقعیت منویی ثبت نکرده است. راه‌حل: تابع register_nav_menus را به functions.php اضافه کنید.

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

منوها برای ساختاردهی به لینک‌های ناوبری استفاده می‌شوند و از تابع register_nav_menus و wp_nav_menu استفاده می‌کنند. ابزارک‌ها برای نمایش محتوای جانبی (مثل آخرین نوشته‌ها، دسته‌بندی‌ها، جستجو) و از register_sidebar و dynamic_sidebar استفاده می‌کنند.

آیا مشکل می‌تواند از افزونه مگامنو باشد؟

بله، افزونه‌هایی مثل Max Mega Menu می‌توانند با قالب جدید تعارض داشته باشند. برای تشخیص، افزونه را موقتاً غیرفعال کنید و سایت را تست کنید.

چطور بفهمم کدام فایل قالب منو را نمایش می‌دهد؟

از افزونه Query Monitor یا Debug Bar استفاده کنید. در بخش Template، نام فایل قالب بارگذاری‌شده را می‌بینید. همچنین می‌توانید در فایل functions.php از هوک wp_nav_menu_args استفاده کنید.

آیا استفاده از قالب‌های FSE می‌تواند باعث این مشکل شود؟

بله. در قالب‌های FSE، منوها از بلوک «Navigation» استفاده می‌کنند. اگر این بلوک در قالب HTML شما وجود نداشته باشد، منو نمایش داده نمی‌شود. فایل header.html را بررسی کنید.

چرا منو در موبایل نمایش داده نمی‌شود اما در دسکتاپ می‌شود؟

این مشکل معمولاً به CSS مربوط است، نه به وردپرس. مطمئن شوید که منوی موبایل در CSS قالب به‌درستی تعریف شده و دکمه همبرگری به‌درستی کار می‌کند. برای مطالعه بیشتر، مقاله قالب ریسپانسیو چیست را ببینید.

آیا می‌توانم منوها را برای همه نوشته‌ها به‌طور گروهی فعال کنم؟

منوها به‌طور خودکار برای همه نوشته‌ها فعال نیستند، اما می‌توانید با استفاده از کوئری زیر در phpMyAdmin، فیلد comment_status همه نوشته‌ها را روی open تنظیم کنید:

UPDATE wp_posts
SET comment_status = 'open'
WHERE post_type = 'post' AND post_status = 'publish';

قبل از اجرای این کوئری، حتماً از دیتابیس بکاپ بگیرید.

کالبدشکافی فنی: وردپرس چطور منوها را رندر می‌کند؟

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

  1. URL Parsing: مرورگر درخواست را به سرور ارسال می‌کند. سرور درخواست را به index.php ریشه سایت هدایت می‌کند.
  2. WP Bootstrap: فایل wp-load.php بارگذاری می‌شود که خودش wp-settings.php را فراخوانی می‌کند.
  3. Load Core: فایل‌های هسته وردپرس بارگذاری می‌شوند.
  4. Load Plugins: تمام افزونه‌های فعال به ترتیب حروف الفبا بارگذاری می‌شوند.
  5. Load Theme: قالب فعال بارگذاری می‌شود. فایل functions.php قالب فراخوانی می‌شود و register_nav_menus در هوک after_setup_theme اجرا می‌شود.
  6. Template Loading: فایل header.php بارگذاری می‌شود. این فایل wp_nav_menu را فراخوانی می‌کند.
  7. Menu Rendering: تابع wp_nav_menu با بررسی موقعیت و پارامترها، منو را از دیتابیس می‌خواند و خروجی HTML می‌سازد.
  8. Output Rendering: خروجی به HTML تبدیل و به کاربر ارسال می‌شود.

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

نکته دوم: در وردپرس، جدول wp_term_taxonomy برای منوها از taxonomy = 'nav_menu' استفاده می‌کند. هر منو یک ترم با این تاکسونومی است و آیتم‌های منو در جدول wp_posts با post_type = 'nav_menu_item' ذخیره می‌شوند. این ساختار، به وردپرس اجازه می‌دهد که آیتم‌های منو را مانند نوشته‌ها مدیریت کند.

نکته سوم و بسیار مهم: در وردپرس، تابع wp_nav_menu از یک مکانیزم کش استفاده می‌کند. نتایج آن در wp_options با کلید _transient_* ذخیره می‌شود. اگر بعد از تغییرات در منو، خروجی قدیمی برگردانده شود، ممکن است به نظر برسد که تغییرات اعمال نشده است. راه‌حل: از تابع delete_transient( '*' ) استفاده کنید یا از افزونه‌های پاک‌سازی کش مانند WP Rocket استفاده کنید — همان اصلی که در افزونه‌های وردپرس چگونه روی سرعت سایت اثر می‌گذارند هم به آن اشاره کرده‌ام.

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

add_filter( 'wp_nav_menu_args', function( $args ) {
    if ( 'primary' === $args['theme_location'] ) {
        $args['menu_class'] = 'primary-menu custom-class';
        $args['depth'] = 2;
    }
    return $args;
} );

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

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

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

علائم:

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

تشخیص:

با بررسی دقیق، مشخص شد که قالب جدید فایل functions.php را با یک نسخه به‌روز جایگزین کرده. اما در نسخه جدید، توسعه‌دهنده نام موقعیت منو را از primary به main-menu تغییر داده بود. در نتیجه، منوی قبلی که به موقعیت primary متصل بود، دیگر در قالب جدید موقعیتی برای اتصال نداشت. تیم توسعه اصلاً متوجه تغییر نام نشده بود، چون در نسخه قدیمی این موقعیت با نام primary ثبت شده بود.

درمان:

  1. ابتدا در قالب جدید، موقعیت primary را به‌عنوان یک موقعیت مهاجرت ثبت کردیم.
  2. سپس با استفاده از بخش «نمایش ← فهرست‌ها»، منو را از موقعیت primary به main-menu منتقل کردیم.
  3. بعد از تأیید انتقال، موقعیت مهاجرت را حذف کردیم.
  4. در نهایت، یک تست جامع روی همه صفحات انجام دادیم.

درس‌آموخته:

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

سخن پایانی: منوی زنده، معماری منظم

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

از تجربه‌ام، هفت اصل عملی بیشترین بازدهی را داشته‌اند: اول، همیشه از لایه ثبت موقعیت شروع کنید — بیش از ۳۰٪ مشکلات در همین لایه پنهان است. دوم، فایل header.php را در قالب خود داشته باشید و در آن، wp_nav_menu را فراخوانی کنید. سوم، در مهاجرت قالب، نام موقعیت‌های منو را با diff مقایسه کنید و از موقعیت مهاجرت استفاده کنید. چهارم، از fallback_cb روی false استفاده کنید تا از نمایش منوی پیش‌فرض جلوگیری کنید. پنجم، همیشه از چایلد تم برای سفارشی‌سازی استفاده کنید. ششم، بعد از هر تغییر، کش را پاک کنید و در incognito تست کنید. هفتم، از ابزارهایی مثل Query Monitor برای دیدن فایل قالب فعلی استفاده کنید.

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

اگر روی پروژه‌ای با این مشکل مواجه شده‌اید و روش خاصی برای حلش پیدا کرده‌اید — به‌خصوص اگر با قالب‌های FSE، چایلد تم، یا افزونه‌های مگامنو سر و کار داشته‌اید — خوشحال می‌شوم تجربه‌تان را بشنوم. بگویید در آن پروژه، مقصر اصلی چه بود: نبود register_nav_menus، تغییر نام موقعیت، نبود wp_nav_menu، یا تعارض با افزونه مگامنو؟ و اگر در تشخیص آن به نکته‌ای رسیدید که در این مقاله نبود، بگویید تا در نسخه بعدی همان زاویه را عمیق‌تر باز کنم. 🧭