چرا دستهبندیها در قالب وردپرس نمایش داده نمیشوند و چگونه آن را اصولی برطرف کنیم؟
راهنمای عمیق و تجربهمحور برای شناسایی، تحلیل و رفع خطای عدم نمایش دستهبندیها در قالب وردپرس؛ از کالبدشکافی category.php و سلسلهمراتب آرشیو تا نقش register_taxonomy، پیوندهای یکتا، پرمالینک، و تعارض با افزونهها در سایتهای وردپرسی و ووکامرسی.
category.php، یک شرط نادرست برای is_paged() گذاشته بود که صفحه اول دستهبندی را خالی نشان میداد. آن روز یاد گرفتم که در وردپرس، «نبود نمایش دستهبندی» میتواند پنج لایه مختلف داشته باشد: لایه ثبت تاکسونومی، لایه تنظیمات پرمالینک، لایه سلسلهمراتب قالب، لایه کوئری، و لایه کش.
در این مقاله میخواهم دقیقاً بگویم این خطا از کجا میآید، چطور باید ریشهاش را پیدا کنید، و چه الگویی برای ساختار قالب و نامگذاری وجود دارد که احتمال بروز این مشکل را در بلندمدت به حداقل برساند.
عدم نمایش دستهبندیها دقیقاً به چه معناست؟
وقتی میگوییم دستهبندیها در قالب نمایش داده نمیشوند، در واقع یکی از این پنج سناریو رخ داده است: لینک دستهبندی در سایت وجود دارد اما با خطای ۴۰۴ مواجه میشود، آرشیو دستهبندی بارگذاری میشود اما هیچ نوشتهای در آن نیست، دستهبندی در فهرست دستهبندیها (مثلاً در سایدبار یا فوتر) نمایش داده نمیشود، دستهبندی در ویرایشگر نوشته قابل انتخاب نیست، یا دستهبندی در منوی سایت غایب است. تشخیص این پنج سناریو از هم، اولین قدم در حل مشکل است.
در وردپرس، دستهبندی (Category) یکی از دو تاکسونومی پیشفرض است (تاکسونومی دیگر، برچسب یا Tag است). برخلاف برچسبها که ساختار تخت دارند، دستهبندیها سلسلهمراتبی (Hierarchical) هستند — یعنی میتوانند والد و فرزند داشته باشند. این تفاوت ماهوی، منبع بسیاری از سردرگمیهاست، بهخصوص در قالبهایی که توسعهدهنده این ساختار سلسلهمراتبی را در نمایش رعایت نکرده است. برای درک دقیقتر تفاوت دستهبندی و برچسب، مقاله تاکسونومی وردپرس را عمیق یاد بگیرید را توصیه میکنم.
یک سوءبرداشت رایج این است که تصور کنیم دستهبندیها بهطور خودکار در همه قالبها نمایش داده میشوند. اینطور نیست. وردپرس برای هر دستهبندی، به یک سری فایل قالب مشخص رجوع میکند که از سلسلهمراتب (Template Hierarchy) تبعیت میکنند. اگر این فایلها در قالب وجود نداشته باشند، وردپرس به فایل بعدی در سلسلهمراتب میرود و در نهایت به index.php میرسد. اما اگر فایل انتخابشده خطا داشته باشد یا حلقه اصلی را نداشته باشد، آرشیو ممکن است خالی نمایش داده شود. برای درک جایگاه این مکانیزم در معماری کلی، مقاله قالب وردپرس چیست و چگونه انتخاب کنیم نقطه شروع خوبی است.
نکته دوم: «عدم نمایش دستهبندی» همیشه بهمعنی «نبود دستهبندی» نیست. گاهی ریشه در ساختار پرمالینک، در تنظیمات صفحه اصلی، در فایلهای قالب، یا در تعارض با افزونههای سئو و کش است. برای فهم بهتر ساختار WordPress و مکانیزم تاکسونومی، ویکیپدیا نقطه شروع خوبی است.
دستهبندیای که در پیشخوان هست اما در سایت دیده نمیشود، لزوماً پاک نشده؛ به احتمال زیاد در یک سلسلهمراتب نامناسب، منتظر رندر شدن است.
هشت ریشه اصلی این خطا
در تجربهام، این خطا تقریباً همیشه یکی از هشت ریشه زیر را دارد. هر کدام امضای مشخص خودش را در رفتار سایت یا لاگ دارد:
۱. مشکل در پرمالینک و ساختار URL
شایعترین علت. اگر ساختار پرمالینک شامل %category% باشد اما نوشتهها دستهبندی نداشته باشند، یا اگر ساختار بهدرستی ذخیره نشده باشد، آرشیو دستهبندی با خطای ۴۰۴ مواجه میشود. این حالت بعد از مهاجرت سایت بین سرورها، یا بعد از تغییر تنظیمات پرمالینک، بسیار شایع است. راهحل سریع، رفتن به «تنظیمات ← پیوندهای یکتا» و ذخیره مجدد بدون هیچ تغییری است. برای مطالعه بیشتر، مقاله URL را حرفهای بسازید: ساختار و سئو را ببینید.
۲. مشکل در فایل category.php قالب
اگر قالب شما فایل category.php داشته باشد اما در آن، حلقه اصلی (while ( have_posts() )) نباشد یا شرطهای اشتباهی اضافه شده باشد، آرشیو دستهبندی خالی نمایش داده میشود. این حالت در قالبهایی که توسعهدهنده از صفر همهچیز را نوشته، یا در چایلد تمهایی که فایل ناقصی کپی شده، بسیار شایع است. برای مطالعه بیشتر، مقاله قالب وردپرس چایلد چیست و چه زمانی به آن نیاز داریم را ببینید.
۳. عدم ثبت صحیح تاکسونومی سفارشی
اگر دستهبندیهای شما تاکسونومی سفارشی هستند (مثلاً در ووکامرس یا در CPT سفارشی)، ممکن است در تابع register_taxonomy پارامتری مثل public، hierarchical، یا rewrite بهدرستی تنظیم نشده باشد. مثلاً اگر rewrite روی false باشد، لینک دستهبندی کار نمیکند. اگر public روی false باشد، دستهبندی در پیشخوان نمایش داده نمیشود. برای مطالعه بیشتر، مقاله ساخت طبقهبندی سفارشی در وردپرس را توصیه میکنم.
۴. تعارض با افزونههای سئو
افزونههایی مثل Yoast SEO یا Rank Math گاهی بهطور پیشفرض آرشیو دستهبندیها را noindex میکنند یا حتی در sitemap قرار نمیدهند. اگر این تنظیمات بهدرستی مدیریت نشوند، کاربر تصور میکند که دستهبندی در سایت نمایش داده نمیشود. این حالت در سایتهایی که بدون بازبینی، افزونه سئو نصب کردهاند، شایع است. برای مطالعه دقیقتر، مقاله بهترین افزونههای سئو وردپرس را توصیه میکنم.
۵. مشکل در ساختار قالب یا فایلهای جانبی
اگر قالب شما از فایلهایی مثل archive.php یا taxonomy.php استفاده میکند، و این فایلها شرطهای اضافی (مثل is_category() && ! is_paged()) داشته باشند، ممکن است آرشیو در صفحه دوم به بعد خالی شود. این حالت بهخصوص در قالبهای خبری که روی پیجینیشن کار میکنند، شایع است.
۶. تعارض با افزونههای مدیریت کاربری
افزونههایی مثل Members یا User Role Editor میتوانند دسترسی به تاکسونومیها را بر اساس نقش کاربری محدود کنند. اگر این تنظیمات با قالب جدید تعارض داشته باشند، ممکن است دستهبندیها برای کاربران ناشناس یا غیرمجاز ناپدید شوند. این حالت در سایتهای عضویتمحور یا فروشگاهی که نقشهای کاربری مختلف دارند، شایع است.
۷. مشکل در کش یا CDN
افزونههای کش مثل WP Rocket یا LiteSpeed Cache، صفحات آرشیو دستهبندی را بهعنوان HTML استاتیک ذخیره میکنند. اگر این کش بهدرستی مدیریت نشود، بعد از افزودن نوشتههای جدید به یک دستهبندی، آرشیو همچنان نسخه قدیمی را نمایش میدهد. برای مطالعه بیشتر، مقاله بهترین افزونههای کش وردپرس را ببینید.
۸. مشکل در دیتابیس تاکسونومی
در موارد نادر، جدولهای wp_terms، wp_term_taxonomy، یا wp_term_relationships میتوانند خراب شوند یا رکوردهای ناسازگار داشته باشند. اگر شمارنده count در جدول wp_term_taxonomy اشتباه باشد، ممکن است دستهبندی خالی نمایش داده شود. برای مطالعه بیشتر درباره دیتابیس، مقاله تأثیر دیتابیس بر سرعت سایت را توصیه میکنم.
دستهبندی در وردپرس سه هویت متفاوت دارد: یک رکورد در دیتابیس، یک تاکسونومی در حافظه، و یک آرشیو در قالب؛ وقتی یکی از این سه ناهماهنگ باشد، نمایش میشکند.
نشانهها و علائم تشخیص
این خطا در همه موارد بهشکل یک پیام صریح ظاهر نمیشود. در تجربهام، این نشانهها ظاهر میشوند و اگر به آنها توجه کنید، میتوانید بهموقع اقدام کنید:
- خطای ۴۰۴ در آرشیو دستهبندی: اگر URL یک دستهبندی مثل
example.com/category/news/خطای ۴۰۴ میدهد، مشکل در پرمالینک یا rewrite rules است. - خالی بودن آرشیو دستهبندی: اگر آرشیو بارگذاری میشود اما هیچ نوشتهای در آن نیست، احتمالاً فایل
category.phpیا شرطهای اضافی مقصر است. - نبود دستهبندی در فهرست سایدبار: اگر از ویجت دستهبندیها استفاده میکنید و دستهبندی جدیدی اضافه نمیشود، احتمالاً کوئری کش شده یا جدول
wp_term_taxonomyمشکل دارد. - نبود دستهبندی در منوی سایت: اگر دستهبندی در پیشخوان هست اما در منوی سایت غایب است، احتمالاً منو بهدرستی به آن متصل نشده است.
- نمایش قالب اشتباه: اگر آرشیو دستهبندی با قالب نوشته یا برگه نمایش داده میشود، یعنی سلسلهمراتب قالب بهدرستی اجرا نمیشود.
- نبود دستهبندی در sitemap: اگر دستهبندیها در sitemap نیستند اما در سایت نمایش داده میشوند، مشکل در تنظیمات افزونه سئو است.
- نمایش ناهماهنگ در مرورگرهای مختلف: اگر دستهبندی در یک مرورگر نمایش داده میشود و در دیگری نه، مشکل در کش مرورگر یا CDN است.
نکته مهم: نبود دستهبندی در سایت، همیشه بهمعنی «نبود دستهبندی در دیتابیس» نیست. اگر دستهبندی در بخش «نوشتهها ← دستهها» پیشخوان دیده میشود، یعنی در دیتابیس موجود است و مشکل در لایه نمایش یا کوئری است. این تشخیص ساده، اولین قدم در حل مسئله است. برای مطالعه بیشتر درباره عیبیابی سیستماتیک، مقاله چگونه خطای قالب وردپرس را عیبیابی کنیم را توصیه میکنم.
پروتکل تشخیص گامبهگام
برای رسیدن به ریشه مشکل، این پروتکل را در تجربهام مفید یافتهام. مرحلهبهمرحله پیش بروید:
گام اول: بررسی پیشخوان
به پیشخوان وردپرس بروید، مسیر «نوشتهها ← دستهها» را باز کنید. اگر دستهها را در این فهرست میبینید و تعداد نوشتههای آنها بیشتر از صفر است، یعنی در دیتابیس موجودند. حالا باید بررسی کنید که چرا در سایت نمایش داده نمیشوند.
گام دوم: بررسی لینک دستهبندی
در فهرست دستهها، روی نام دسته کلیک کنید تا لینک آرشیو آن را ببینید. اگر URL درست به نظر میرسد اما ۴۰۴ میدهد، مشکل در پرمالینک یا rewrite rules است. به «تنظیمات ← پیوندهای یکتا» بروید و بدون هیچ تغییری، روی «ذخیره تغییرات» کلیک کنید. این کار قوانین بازنویسی را دوباره میسازد.
گام سوم: بررسی فایلهای قالب
با FTP یا File Manager، به پوشه قالب فعلی بروید. بهترتیب بررسی کنید که آیا این فایلها وجود دارند:
category-{slug}.php— قالب اختصاصی برای یک دسته خاصcategory-{id}.php— قالب اختصاصی برای یک دسته با شناسه مشخصcategory.php— قالب عمومی همه دستههاarchive.php— قالب عمومی همه آرشیوهاindex.php— نقطه بازگشت نهایی
اگر فایل سطح بالاتر مشکل دارد (مثلاً حلقه اصلی ندارد یا شرط اشتباه دارد)، وردپرس به سطح پایینتر نمیرود و همان فایل مشکلدار را نمایش میدهد. برای مطالعه بیشتر درباره ساختار فایل قالب، مقاله ساختار فایلهای یک قالب استاندارد وردپرس را توصیه میکنم.
گام چهارم: بررسی حلقه اصلی در فایل قالب
فایل category.php یا archive.php را باز کنید و مطمئن شوید که شامل حلقه اصلی است:
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<article>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<div><?php the_excerpt(); ?></div>
</article>
<?php endwhile; ?>
<?php the_posts_pagination(); ?>
<?php else : ?>
<p>هیچ نوشتهای یافت نشد.</p>
<?php endif; ?>
اگر have_posts() یا the_post() در فایل نبود، احتمالاً آرشیو خالی نمایش داده میشود. همچنین بررسی کنید که شرطهای اضافی مثل is_paged() یا is_category() بهدرستی اعمال شدهاند یا نه.
گام پنجم: بررسی تاکسونومی سفارشی
اگر دستهبندیهای شما تاکسونومی سفارشی هستند (مثلاً در ووکامرس، دسته محصولات)، تابع register_taxonomy را بررسی کنید. مطمئن شوید که این پارامترها بهدرستی تنظیم شدهاند:
register_taxonomy( 'product_cat', 'product', array(
'hierarchical' => true,
'public' => true,
'rewrite' => array( 'slug' => 'product-category' ),
'show_in_rest' => true,
) );
اگر public روی false باشد، دستهبندی در پیشخوان نمایش داده نمیشود. اگر rewrite روی false باشد، لینک دستهبندی کار نمیکند. برای مطالعه بیشتر، مقاله ساخت طبقهبندی سفارشی در وردپرس را ببینید.
گام ششم: بررسی تنظیمات افزونه سئو
به تنظیمات افزونه سئو بروید و بخش «انواع محتوا» یا «Content Types» را بررسی کنید. مطمئن شوید که دستهبندیها در sitemap و برای ایندکس فعال هستند. اگر افزونه سئو آرشیو دستهها را noindex کرده، این تنظیم را تغییر دهید.
گام هفتم: تعویض قالب به قالب پیشفرض
اگر مشکل حل نشد، قالب را به یکی از قالبهای پیشفرض وردپرس (مثل Twenty Twenty-Five) تغییر دهید و سایت را بررسی کنید. اگر دستهبندیها در قالب پیشفرض نمایش داده میشوند، مطمئن میشوید که مقصر خودِ قالب فعلی است. اگر مشکل ادامه داشت، احتمالاً یک افزونه یا تنظیمات سراسری مقصر است.
گام هشتم: بررسی کش
اگر همهچیز در دیتابیس و قالب درست است، کش را پاک کنید. ترتیب اصولی: کش مرورگر، کش افزونه، کش سرور، و در نهایت کش CDN. همیشه بعد از پاک کردن کش مرورگر (با Ctrl+Shift+R) شروع کنید.
تفاوت با خطاهای مشابه
عدم نمایش دستهبندیها اغلب با خطاهای دیگری قاطی میشود. این جدول به شما کمک میکند تفاوتها را سریع تشخیص دهید:
| خطا | علت اصلی | نشانه کلیدی |
|---|---|---|
| عدم نمایش دستهبندیها | پرمالینک، فایل قالب، یا تاکسونومی | دسته در پیشخوان هست اما آرشیو خالی است |
| عدم نمایش نوشتهها | تنظیمات خواندن یا حلقه اصلی | مشکل مشابه، ولی در لایه نوشته |
| عدم نمایش برگهها | تنظیمات یا فایل page.php | مشکل مشابه، ولی در لایه برگه |
| خطای ۴۰۴ در آرشیو | پرمالینک یا rewrite rules | URL اشتباه یا ۴۰۴ مستقیم |
| خطای ۴۰۴ در تاکسونومی سفارشی | نبود rewrite یا flush نشدن | نیاز به بازنشانی پرمالینک |
| عدم نمایش برچسبها | مشکل مشابه در تاکسونومی Tag | مشکل مشابه، ولی در لایه برچسب |
| عدم نمایش منو | نبود register_nav_menus | منو در پیشخوان تعریف شده اما نمایش داده نمیشود |
نکته ظریف: عدم نمایش دستهبندی و عدم نمایش برچسب، اگرچه از نظر ظاهری مشابهند اما از نظر ریشهای متفاوتند. دستهبندیها ساختار سلسلهمراتبی دارند و از فایلهای category.php و category-{slug}.php استفاده میکنند، در حالی که برچسبها ساختار تخت دارند و از فایل tag.php استفاده میکنند. برای مطالعه دقیقتر، مقاله دستهبندی، برچسب یا تاکسونومی سفارشی؟ را ببینید.
راهحلهای عملی برای هر ریشه
حالا که مقصر را شناسایی کردید، وقت درمان است. راهحلها را بر اساس ریشه مشکل دستهبندی کردهام:
راهحل ریشه اول: اصلاح پرمالینک
به «تنظیمات ← پیوندهای یکتا» بروید و بررسی کنید که کدام ساختار انتخاب شده است. ساختار «نام نوشته» (Post Name) سادهترین و کمتعارضترین گزینه است. اگر ساختار شامل %category% است، مطمئن شوید که همه نوشتهها حداقل یک دسته دارند. بعد از تغییر، بدون کلیک روی ذخیره، برگردید و یکبار دیگر ذخیره کنید تا rewrite rules بازسازی شوند.
راهحل ریشه دوم: بازسازی فایل category.php
اگر فایل category.php مشکل دارد، آن را با یک نسخه استاندارد جایگزین کنید:
<?php get_header(); ?>
<main id="primary" class="site-main">
<?php if ( have_posts() ) : ?>
<header class="page-header">
<?php the_archive_title( '<h1 class="page-title">', '</h1>' ); ?>
<?php the_archive_description( '<div class="archive-description">', '</div>' ); ?>
</header>
<?php while ( have_posts() ) : the_post(); ?>
<?php get_template_part( 'template-parts/content', get_post_type() ); ?>
<?php endwhile; ?>
<?php the_posts_pagination(); ?>
<?php else : ?>
<?php get_template_part( 'template-parts/content', 'none' ); ?>
<?php endif; ?>
</main>
<?php get_sidebar(); ?>
<?php get_footer(); ?>
اگر میخواهید تغییرات را در چایلد تم اعمال کنید، همان اصل را رعایت کنید: فایل والد را کپی کنید و تغییرات را روی نسخه چایلد اعمال کنید. برای مطالعه بیشتر، مقاله چگونه قالب آماده را سفارشی کنیم را توصیه میکنم.
راهحل ریشه سوم: بازنشانی rewrite rules تاکسونومی سفارشی
اگر تاکسونومی سفارشی شما در آرشیو نمایش داده نمیشود، ممکن است نیاز به بازنشانی rewrite rules داشته باشید. راهحل موقت در functions.php چایلد تم:
function my_theme_flush_rewrite_rules() {
flush_rewrite_rules();
}
add_action( 'after_switch_theme', 'my_theme_flush_rewrite_rules' );
بعد از اجرا، این کد را حذف کنید. اجرای دائمی flush_rewrite_rules() در هر بار بارگذاری، عملکرد سایت را بهشدت کاهش میدهد. برای مطالعه بیشتر، مقاله توابع وردپرس چیست و چگونه از آنها استفاده کنیم را ببینید.
راهحل ریشه چهارم: مدیریت تعارض افزونهها
اگر افزونهای مثل Yoast یا Rank Math دستهها را noindex علامتگذاری کرده، به تنظیمات افزونه بروید و بخش «انواع محتوا» (Content Types) را بررسی کنید. مطمئن شوید که دستهها در sitemap و برای ایندکس فعال هستند. اگر افزونهای مانند Members یا User Role Editor دسترسی به دستهها را محدود کرده، تنظیمات نقشهای کاربری را بررسی کنید.
راهحل ریشه پنجم: رفع خطای PHP
اگر خطای PHP در لاگ میبینید، ابتدا با فعال کردن حالت دیباگ در wp-config.php، خطا را دقیقتر پیدا کنید:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
سپس فایل wp-content/debug.log را بررسی کنید. برای مطالعه دقیقتر درباره دیباگ، مقاله دیباگ کردن کدهای سفارشی وردپرس را توصیه میکنم.
راهحل ریشه ششم: پاک کردن کش
ترتیب اصولی پاک کردن کش: کش مرورگر، کش افزونه، کش سرور، و در نهایت کش CDN. اگر از افزونه کش استفاده میکنید، حتماً صفحات آرشیو دستهبندی را در تنظیمات آن پیدا کنید و دستی پاکشان کنید. برای مطالعه بیشتر، مقاله بهینهسازی سرعت سایت چیست را ببینید.
راهحل ریشه هفتم: بازسازی شمارنده دستهها
اگر شمارنده نوشتههای یک دسته در پیشخوان اشتباه است یا آرشیو خالی نمایش داده میشود، ممکن است شمارنده در جدول wp_term_taxonomy اشتباه باشد. با استفاده از افزونههایی مثل WP Term Management یا با کوئری مستقیم در phpMyAdmin، میتوانید شمارندهها را بازسازی کنید. برای مطالعه بیشتر درباره دیتابیس، مقاله بهینهسازی جداول MySQL برای سرعت بیشتر را توصیه میکنم.
راهحل ریشه هشتم: مدیریت سلسلهمراتب دستهها
اگر دستههای فرزند شما در آرشیو نمایش داده نمیشوند، بهطور پیشفرض وردپرس نوشتههای زیرمجموعه را در آرشیو والد نمایش نمیدهد. اگر این رفتار را میخواهید تغییر دهید، از کد زیر در functions.php چایلد تم استفاده کنید:
function my_theme_include_children_in_category( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_category() ) {
$query->set( 'include_children', true );
}
}
add_action( 'pre_get_posts', 'my_theme_include_children_in_category' );
در حل مشکل نمایش دستهبندی، همیشه از لایه پرمالینک شروع کنید، سپس لایه قالب، و در نهایت لایه تاکسونومی؛ چون این ترتیب، از ارزان به گران میرود.
کالبدشکافی تاکسونومی: از register_taxonomy تا پرمالینک
برای درک عمیق این مشکل، باید بدانید وردپرس چطور تاکسونومیها را مدیریت میکند. تاکسونومی در وردپرس، یک ساختار سهجدولی است که در دیتابیس ذخیره میشود:
- wp_terms: رکوردهای خام دستهها و برچسبها (name، slug، term_group)
- wp_term_taxonomy: اتصال هر ترم به یک تاکسونومی خاص (term_id، taxonomy، description، parent، count)
- wp_term_relationships: اتصال هر ترم به نوشتههای مربوطه (object_id، term_taxonomy_id، term_order)
این ساختار سهجدولی، در نگاه اول پیچیده به نظر میرسد اما یک هدف دارد: اجازه میدهد یک ترم (مثلاً «اخبار») در چندین تاکسونومی مختلف استفاده شود، بدون اینکه دادهها تکرار شوند. برای مثال، یک ترم میتواند هم در دستهبندی نوشتهها استفاده شود، هم در تاکسونومی سفارشی محصولات.
نکته کلیدی در این ساختار، ستون count است. این ستون، تعداد نوشتههای هر ترم را نگه میدارد و وردپرس در کوئری آرشیو، از آن برای نمایش تعداد نوشتهها استفاده میکند. اگر این ستون اشتباه باشد — مثلاً بهخاطر مهاجرت ناقص یا حذف نادرست نوشتهها — آرشیو ممکن است خالی نمایش داده شود، حتی اگر نوشتهها در جدول wp_term_relationships موجود باشند. برای رفع این مشکل، میتوانید از تابع wp_update_term_count() استفاده کنید:
$terms = get_terms( array( 'taxonomy' => 'category', 'hide_empty' => false ) );
foreach ( $terms as $term ) {
wp_update_term_count( $term->term_taxonomy_id, 'category' );
}
این کد، همه شمارندههای دستهبندی را بازسازی میکند. برای مطالعه بیشتر درباره بهینهسازی دیتابیس، مقاله بهینهسازی کوئریهای وردپرس با کدنویسی را توصیه میکنم.
نکته دوم: پرمالینک تاکسونومی، در زمان ثبت آن تعیین میشود. اگر پارامتر rewrite روی false باشد، هیچ URL اختصاصی برای آرشیو تاکسونومی ساخته نمیشود و لینکها به یک پارامتر کوئری معمولی مثل ?taxonomy=category&term=news تبدیل میشوند. اگر میخواهید URL تمیز داشته باشید، باید rewrite را روی یک ساختار مشخص تنظیم کنید. اما بعد از هر تغییر در rewrite، باید rewrite rules را بازنشانی کنید. برای مطالعه بیشتر، مقاله ساخت طبقهبندی سفارشی در وردپرس را ببینید.
نکته سوم و بسیار مهم: در وردپرس، تاکسونومیها بهطور پیشفرض در هوک init ثبت میشوند. اگر تاکسونومی سفارشی خود را در اولویت اشتباه ثبت کنید (مثلاً با اولویت بالاتر از ۱۰)، ممکن است rewrite rules تاکسونومی شما هرگز ساخته نشوند. همیشه از اولویت پیشفرض یا کمی بالاتر (مثلاً ۱۰) استفاده کنید — همان اصلی که در اولویت در هوکهای وردپرس چیست توضیح دادهام.
سلسلهمراتب قالب: نقشه راه درست دستهبندیها
برای درک عمیق این مشکل، باید سلسلهمراتب قالب وردپرس برای دستهبندیها را بشناسید. وردپرس بسته به بافت آرشیو دستهبندی، بهترتیب زیر دنبال فایل قالب میگردد و اولین فایلی که پیدا کند را بارگذاری میکند:
category-{slug}.php— قالب اختصاصی برای یک دسته با slug مشخصcategory-{id}.php— قالب اختصاصی برای یک دسته با شناسه مشخصcategory.php— قالب عمومی همه دستههاarchive.php— قالب عمومی همه آرشیوهاindex.php— نقطه بازگشت نهایی
نکته کلیدی: اگر فایل قالب در سطح بالای سلسلهمراتب وجود دارد اما خطا دارد یا حلقه اصلی را ندارد، وردپرس به سطح بعدی نمیرود. یعنی اگر category.php وجود دارد اما خالی است، وردپرس به archive.php برنمیگردد — بلکه همان فایل خالی را نمایش میدهد. این رفتار، یکی از شایعترین دلایل نمایش نیافتن دستهبندیها است.
نکته دوم: در قالبهای FSE (Full Site Editing)، بهجای فایلهای PHP، از فایلهای HTML در پوشه templates استفاده میشود. در این حالت، فایلهایی مثل archive.html، category.html، و index.html نقش فایلهای PHP را ایفا میکنند. اگر این فایلها بهدرستی ساخته نشده باشند، دستهبندیها نمایش داده نمیشوند. برای مطالعه بیشتر درباره گوتنبرگ و آینده ویرایش محتوا در وردپرس، این مقاله را توصیه میکنم.
نکته سوم: تفاوت بین category.php و archive.php را جدی بگیرید. اگر archive.php ساختار خاصی داشته باشد (مثلاً فقط برای برچسبها طراحی شده باشد) و category.php نداشته باشید، آرشیو دستهبندی با همان قالب archive.php نمایش داده میشود که ممکن است ساختار مناسبی برای دستهبندی نداشته باشد. راهحل اصولی، همیشه داشتن یک category.php اختصاصی است، حتی اگر محتوایش شبیه archive.php باشد.
استراتژیهای پیشگیری در بلندمدت
پیشگیری از این خطا، نیازمند نظم در چرخه توسعه و انتخاب است. در تجربهام، رعایت این نکات بیشترین بازدهی را داشته:
۱. نگهداری استاندارد فایلهای قالب
همیشه فایلهای category.php، archive.php، و index.php را در قالب خود داشته باشید. این فایلها بهعنوان نقطه بازگشت عمل میکنند و اگر بافتی فایل اختصاصی نداشت، به این فایلها رجوع میشود.
۲. استفاده از چایلد تم برای سفارشیسازی
هرگونه تغییر در ساختار قالب را در چایلد تم انجام دهید. این کار تضمین میکند که با آپدیت والد، تغییرات شما باقی میماند و در صورت بروز مشکل، میتوانید با غیرفعال کردن چایلد تم، به حالت اولیه برگردید — همان اصلی که در قالب وردپرس چایلد چیست و چه زمانی به آن نیاز داریم توضیح دادهام.
۳. مدیریت صحیح pرمالینک
ساختار پرمالینک را ساده نگه دارید. ساختار «نام نوشته» (Post Name) سادهترین و کمتعارضترین گزینه است. از ساختارهایی مثل /%category%/%postname%/ استفاده کنید اگر حتماً نیاز دارید، اما بدانید که این ساختار نیازمند دقت بیشتر در مدیریت دستههاست.
۴. بازبینی تنظیمات افزونه سئو
هر بار که افزونه سئو را نصب یا آپدیت میکنید، تنظیمات انواع محتوا را بررسی کنید. مطمئن شوید که دستهها برای ایندکس و sitemap فعال هستند. اگر نمیخواهید آرشیو دستهها ایندکس شوند، حداقل مطمئن شوید که برای کاربران نمایش داده میشوند.
۵. مستندسازی تاکسونومیهای سفارشی
اگر قالب شما از تاکسونومی سفارشی استفاده میکند، یک فایل مستندات ساده در قالب خود داشته باشید که در آن مشخص شده باشد هر تاکسونومی چه کاربردی دارد، چه پارامترهایی در register_taxonomy استفاده میکند و در چه فایلهایی نمایش داده میشود.
۶. استفاده از ابزارهای حرفهای
افزونههایی مثل Query Monitor یا Debug Bar به شما نشان میدهند که کدام فایل قالب بارگذاری شده و کوئری دستهبندی چه بوده است. این اطلاعات در عیبیابی سریع بسیار ارزشمند است. برای مطالعه بیشتر، مقاله افزونههای ضروری مرورگر برای توسعهدهندگان را ببینید.
۷. مدیریت کش با درایت
اگر از افزونه کش استفاده میکنید، صفحات آرشیو دستهبندی را در فهرست استثنا (Exclude) قرار دهید تا در حین توسعه، تغییرات بلافاصله اعمال شوند. بعد از اتمام توسعه، این استثنا را حذف کنید.
۸. تست بعد از هر تغییر تنظیمات
هر بار که پرمالینک، تاکسونومی، یا قالب را تغییر میدهید، سایت را در incognito تست کنید. کش میتواند تغییرات را پنهان کند و شما را به اشتباه بیندازد.
پرسشهای پرتکرار درباره نمایش دستهبندیها
چرا دستهبندیها در پیشخوان میبینم اما در سایت نمایش داده نمیشوند؟
سه احتمال: مشکل در پرمالینک، مشکل در فایل category.php قالب، یا مشکل در شمارنده دستهها. ابتدا پرمالینک را بازنشانی کنید، سپس فایل قالب را بررسی کنید.
چرا آرشیو دستهبندی خالی نمایش داده میشود؟
چهار احتمال: فایل category.php خطا دارد، شمارنده دسته اشتباه است، شرطهای اضافی در قالب اعمال شده، یا یک کوئری سفارشی روی آرشیو سوار شده است. با افزونه Query Monitor، کوئری اصلی را بررسی کنید.
تفاوت دستهبندی و برچسب در وردپرس چیست؟
دستهبندیها ساختار سلسلهمراتبی دارند (والد و فرزند) و از فایلهای category.php و category-{slug}.php استفاده میکنند. برچسبها ساختار تخت دارند و از فایل tag.php استفاده میکنند. هر دو، تاکسونومی هستند اما ساختار متفاوتی دارند.
آیا مشکل میتواند از افزونه سئو باشد؟
بله، اگر افزونه سئو آرشیو دستهها را noindex کرده باشد یا در sitemap قرار نداده باشد، کاربر ممکن است تصور کند که دستهبندی نمایش داده نمیشود. تنظیمات «انواع محتوا» در افزونه سئو را بررسی کنید.
چطور بفهمم کدام فایل قالب برای آرشیو دسته من بارگذاری میشود؟
از افزونه Query Monitor یا Debug Bar استفاده کنید. در بخش Template، نام فایل قالب بارگذاریشده را میبینید. همچنین میتوانید در فایل functions.php از هوک template_include استفاده کنید تا فایل قالب فعلی را در نوار ابزار نمایش دهید.
آیا استفاده از قالبهای FSE میتواند باعث این مشکل شود؟
بله. در قالبهای FSE، آرشیوها از فایلهای HTML در پوشه templates استفاده میکنند. اگر این فایلها وجود نداشته باشند یا خطا داشته باشند، دستهبندیها نمایش داده نمیشوند. فایلهای archive.html و category.html را بررسی کنید.
چرا شمارنده دستهبندی من اشتباه است؟
این مشکل معمولاً ناشی از شمارنده اشتباه در ستون count جدول wp_term_taxonomy است. با تابع wp_update_term_count() میتوانید شمارندهها را بازسازی کنید. افزونههایی مثل WP Term Management هم این کار را خودکار انجام میدهند.
آیا نوشتهها میتوانند بدون دستهبندی باقی بمانند؟
بله، در وردپرس، نوشتهها الزاماً نیازی به دسته ندارند. اگر ساختار پرمالینک شما شامل %category% باشد اما نوشته دستهبندی نداشته باشد، ممکن است خطای ۴۰۴ بگیرد. همیشه برای نوشتههایتان حداقل یک دستهبندی تعیین کنید.
چرا دستهبندی فرزند در آرشیو والد نمایش داده نمیشود؟
بهطور پیشفرض، وردپرس نوشتههای زیرمجموعه را در آرشیو والد نمایش نمیدهد. برای تغییر این رفتار، از هوک pre_get_posts و پارامتر include_children استفاده کنید — همان اصلی که در بخش راهحلها توضیح دادم.
کالبدشکافی فنی: وردپرس چطور آرشیو دستهبندی را رندر میکند؟
برای درک عمیق این مکانیزم، باید بدانید وردپرس چطور یک درخواست آرشیو دستهبندی را پردازش میکند. وقتی کاربری URL یک آرشیو مثل example.com/category/news/ را وارد میکند، این چرخه طی میشود:
- URL Parsing: مرورگر درخواست را به سرور ارسال میکند. سرور (معمولاً Apache یا Nginx) درخواست را به
index.phpریشه سایت هدایت میکند. - WP Bootstrap: فایل
wp-load.phpبارگذاری میشود که خودشwp-settings.phpرا فراخوانی میکند. - URL Rewriting: وردپرس از قوانین بازنویسی URL (که در جدول
wp_optionsبا کلیدrewrite_rulesذخیره شده) استفاده میکند تا URL درخواست را به پارامترهای کوئری تبدیل کند — در اینجا،category_name=news. - Query Parsing: وردپرس یک شیء
WP_Queryمیسازد و بر اساس پارامترها، نوع محتوای درخواستی را تشخیص میدهد — در اینجا، یک آرشیو دستهبندی. - Query Execution: کوئری اصلی اجرا میشود و نوشتههای منطبق با آن دسته استخراج میشوند. این کوئری در متغیر گلوبال
$wp_queryذخیره میشود. - Template Resolution: وردپرس از تابع
get_category_template()استفاده میکند تا بر اساس slug یا id دسته، فایل مناسبی برای رندر انتخاب کند. - Template Loading: فایل انتخابشده بارگذاری میشود. این فایل باید شامل
get_header()، حلقه اصلی (while ( have_posts() ))، وget_footer()باشد. - Output Rendering: خروجی به HTML تبدیل و به کاربر ارسال میشود.
نکته مهم و کمتر شناختهشده: در مرحله سوم، اگر قوانین بازنویسی URL بهدرستی ذخیره نشده باشند، URL آرشیو بهدرستی به پارامترهای کوئری تبدیل نمیشود و وردپرس نمیتواند تشخیص دهد که درخواست برای یک دسته است. در این حالت، بهجای آرشیو دسته، یک ۴۰۴ یا صفحه اصلی نمایش داده میشود. این مشکل بعد از هر تغییر در پرمالینک، تاکسونومی، یا مهاجرت بین سرورها شایع است.
نکته دوم: در مرحله پنجم، وردپرس یک کوئری با پارامترهای متعدد اجرا میکند. برای آرشیو دسته، این پارامترها شامل cat یا category_name، تعداد نوشتهها در هر صفحه، ترتیب نمایش، و تعداد صفحات است. اگر تعداد نوشتههای برگشتی صفر باشد، وردپرس پیام «هیچ نوشتهای یافت نشد» را نمایش میدهد — که نشانهای برای مشکل شمارنده یا نبود نوشتههای دسته است.
نکته سوم و بسیار مهم: در مرحله ششم، اگر وردپرس فایل قالب مناسبی پیدا نکند، به ترتیب سلسلهمراتب به عقب برمیگردد. اگر در نهایت به index.php برسد و این فایل هم حلقه اصلی را نداشته باشد، صفحه خالی نمایش داده میشود. این موضوع، یکی از شایعترین دلایل نمایش نیافتن دستهبندیها در قالبهای سفارشی است.
نکته چهارم: در وردپرس، تابع get_the_category() برای دریافت دستههای یک نوشته و تابع get_categories() برای دریافت فهرست دستهها استفاده میشود. اگر در قالب شما این توابع بهدرستی فراخوانی نشوند یا پارامترهایشان اشتباه باشد، دستهها نمایش داده نمیشوند. برای مطالعه بیشتر درباره این توابع، مقاله توابع وردپرس برای کار با دستهبندیها را توصیه میکنم.
نکته پنجم و بسیار مهم برای توسعهدهندگان پیشرفته: در وردپرس، تاکسونومیها از طریق مکانیزم WP_Taxonomy و WP_Term مدیریت میشوند. اگر قالب شما از تابع get_terms() با پارامترهای سفارشی استفاده میکند، باید دقت کنید که پارامتر taxonomy بهدرستی تنظیم شده باشد. اگر نام تاکسونومی اشتباه باشد، خروجی خالی برگردانده میشود. برای مطالعه بیشتر درباره چرخه هوکها، مقاله ساختار هسته وردپرس چگونه کار میکند را توصیه میکنم.
مطالعه موردی: احیای دستهبندیهای یک سایت خبری
یک سایت خبری با حدود ۱۵۰۰۰ خبر و ۵۰ دستهبندی مختلف، بعد از مهاجرت به سرور جدید، با مشکل جدی مواجه شد: تمام صفحات آرشیو دستهبندی با خطای ۴۰۴ مواجه میشدند، در حالی که نوشتهها و دستهبندیها در پیشخوان سالم به نظر میرسیدند.
علائم:
- آرشیو همه دستهبندیها ۴۰۴ میداد
- دستهبندیها در پیشخوان نمایش داده میشدند
- نوشتهها در پیشخوان و در آرشیو تاریخ کار میکردند
- هیچ خطای PHP در لاگ نبود
- مشکل بعد از مهاجرت به سرور جدید ظاهر شد
تشخیص:
با بررسی دقیق، مشخص شد که فایل .htaccess در سرور جدید، قوانین بازنویسی URL مربوط به دستهبندیها را نداشت. علت این بود که سرور جدید از Nginx استفاده میکرد (نه Apache) و در پیکربندی Nginx، rewrite rules مربوط به دستهبندیها بهدرستی تنظیم نشده بود. در نتیجه، URLهای example.com/category/news/ بهدرستی به پارامترهای کوئری تبدیل نمیشدند و وردپرس ۴۰۴ برمیگرداند.
درمان:
- ابتدا به «تنظیمات ← پیوندهای یکتا» رفتیم و بدون تغییر، ذخیره کردیم — اما این فقط برای Apache کار میکند.
- سپس با دسترسی به SSH، فایل پیکربندی Nginx را بررسی کردیم و قوانین rewrite rules مربوط به وردپرس را اضافه کردیم.
- در نهایت، سرویس Nginx را ریستارت کردیم و آرشیو دستهبندیها بلافاصله شروع به کار کرد.
درسآموخته:
مهاجرت بین Apache و Nginx، همیشه نیازمند بازبینی قوانین rewrite است. وردپرس در Apache از فایل .htaccess استفاده میکند، اما در Nginx از پیکربندی سرور. اگر این تنظیمات بهدرستی منتقل نشوند، آرشیوها — بهخصوص دستهبندیها — با خطای ۴۰۴ مواجه میشوند. برای مطالعه موردی مشابه، مقاله چگونه سایت وردپرسی را به هاست جدید منتقل کنیم را توصیه میکنم.
روایت پایانی: تاکسونومی سالم، معماری سالم
عدم نمایش دستهبندیها در قالب وردپرس، در نگاه اول یک خطای ناامیدکننده است، اما در واقع یک پیام دقیق معماری است: یکی از پنج لایه ثبت تاکسونومی، تنظیمات پرمالینک، سلسلهمراتب قالب، کوئری، یا کش در جایی پاره شده. سؤال درست این نیست «چطور دستهبندیها را برگردانم»، بلکه این است «کدام لایه از این زنجیره در پروژه من ضعیف است».
از تجربهام، هفت اصل عملی بیشترین بازدهی را داشتهاند: اول، همیشه از لایه پرمالینک شروع کنید — بازنشانی rewrite rules با ذخیره تنظیمات پیوندهای یکتا، سادهترین و ارزانترین راهحل است. دوم، فایل category.php را در قالب خود داشته باشید، حتی اگر از فایلهای اختصاصی استفاده میکنید. سوم، در مهاجرت بین سرورها، تنظیمات rewrite rules را برای سرور مقصد (Apache یا Nginx) بهدرستی تنظیم کنید. چهارم، برای تاکسونومیهای سفارشی، پارامترهای public، hierarchical، و rewrite را با دقت تنظیم کنید. پنجم، بعد از هر تغییر در تاکسونومی یا پرمالینک، rewrite rules را بازنشانی کنید (اما نه در هر بار بارگذاری). ششم، شمارندههای دستهها را دورهای بازسازی کنید تا آرشیوها خالی نمایش داده نشوند. هفتم، همیشه از چایلد تم برای سفارشیسازی استفاده کنید و بعد از هر تغییر، سایت را در incognito تست کنید.
در نهایت، اگر روی پروژهای با حجم بالای دستهبندی و تاکسونومی سفارشی کار میکنید — مثل یک فروشگاه ووکامرسی یا یک سایت خبری بزرگ — توصیه میکنم ساختار تاکسونومیها را در یک فایل مستندات ثبت کنید. این مستندسازی، در آینده به شما کمک میکند که در صورت تغییر قالب یا مهاجرت بین سرورها، هیچ تاکسونومی گم نشود. برای مطالعه دقیقتر درباره تاکسونومی و ساختار داده، مقاله تاکسونومی وردپرس را عمیق یاد بگیرید را توصیه میکنم.
اگر روی پروژهای با این مشکل مواجه شدهاید و روش خاصی برای حلش پیدا کردهاید — بهخصوص اگر با تاکسونومی سفارشی، قالبهای FSE، یا مهاجرت بین Apache و Nginx سر و کار داشتهاید — خوشحال میشوم تجربهتان را بشنوم. بگویید در آن پروژه، مقصر اصلی چه بود: پرمالینک، فایل قالب، شمارنده دسته، یا تعارض با افزونه سئو؟ و اگر در تشخیص آن به نکتهای رسیدید که در این مقاله نبود، بگویید تا در نسخه بعدی همان زاویه را عمیقتر باز کنم. 🗂️