تابع is_category چطور کار میکند؟
تابع is_category برای تشخیص آرشیو دسته در وردپرس؛ بررسی پارامترها، نکات کلیدی، تفاوت با is_tag و اشتباهات رایج در قالب.
چرا تشخیص آرشیو دسته اهمیت دارد؟
در وردپرس، دستهبندی (Category) یکی از دو تاکسونومی پیشفرض است که ساختار سلسلهمراتبی دارد. برخلاف برچسب که تخت است، دستهبندی میتواند والد و فرزند داشته باشد و به همین دلیل، نقش مهمی در معماری اطلاعات سایت ایفا میکند. هر دسته دارای یک صفحه آرشیو اختصاصی است که همه نوشتههای آن دسته را فهرست میکند. این صفحه برخلاف نوشته تکی، ماهیت فهرستمحور دارد و معمولاً ساختار نمایش متفاوتی میطلبد. اگر در قالب، آرشیو دسته از سایر آرشیوها تشخیص داده نشود، نمیتوان طراحی و تجربه کاربری مناسب برای آن پیاده کرد. تابعis_category() دقیقاً همین تشخیص را ممکن میکند.
تابع is_category چیست؟
تابعis_category() یک تابع شرطی در هسته وردپرس است که در فایل wp-includes/query.php تعریف شده است. این تابع بررسی میکند که آیا صفحه فعلی یک آرشیو دستهبندی است یا نه.
خروجی این تابع یک مقدار بولی است: true اگر صفحه فعلی آرشیو دسته باشد و false در غیر این صورت. اگر آرگومان ورودی داده شود، تابع فقط زمانی مقدار true برمیگرداند که دسته فعلی با مشخصه دادهشده مطابقت داشته باشد.
نکته مهم این است که این تابع تنها برای حلقه اصلی (Main Query) معتبر است. اگر از WP_Query سفارشی استفاده کنید، is_category() مقدار نادرست برمیگرداند. برای مطالعه بیشتر روی کوئری سفارشی، میتوانید به راهنمای WP_Query مراجعه کنید.
امضای تابع و پارامترها
امضای این تابع بهشکل زیر است:function is_category( $category = '' ) {
global $wp_query;
return $wp_query->is_category( $category );
}
پارامتر ورودی میتواند از چند نوع باشد:
- خالی: هر آرشیو دسته را شامل میشود
- عدد صحیح: شناسه (ID) دسته
- رشته: نامک (slug) دسته
- رشته با مسیر: مسیر کامل دسته (مثلاً tech/wordpress)
- آرایه: فهرستی از شناسهها یا نامکها
نکته مهم این است که اگر پارامتر رشتهای داده شود، وردپرس ابتدا آن را بهعنوان slug تفسیر میکند و در صورت عدم تطابق، بهعنوان نام دسته جستجو میکند. به همین دلیل، برای دقت بیشتر بهتر است از slug یا ID استفاده شود.
سازوکار داخلی تابع
تابعis_category() در واقع یک میانبر (Wrapper) برای متد is_category() روی شیء جهانی $wp_query است. این متد در کلاس WP_Query تعریف شده و بررسی میکند که آیا متغیر category_name یا cat در کوئری فعلی مقدار داشته باشد یا نه.
وقتی کاربر یک دسته را باز میکند، وردپرس با تجزیه URL و ساخت WP_Query، متغیر category_name یا cat را در کوئری اصلی تنظیم میکند. اگر این مقدار معتبر باشد، is_category() مقدار true برمیگرداند.
نکته مهم دیگر این است که وردپرس برای آرشیو دستهبندی، فایل category.php را در اولویت اول قرار میدهد. اگر این فایل وجود نداشته باشد، از archive.php و در نهایت index.php استفاده میکند.
تفاوت is_category با is_tag و is_archive
تابعis_archive() هر نوع آرشیو را شامل میشود، اما is_category() تنها آرشیو دستهبندی را. تفاوت is_category() با is_tag() نیز در ماهیت تاکسونومی است: دسته سلسلهمراتبی است و برچسب تخت.
این تفاوت در الگوهای شرطی اهمیت زیادی دارد. برای نمونه، اگر بخواهید استایل متفاوتی برای همه آرشیوها پیاده کنید، از is_archive() استفاده میکنید. اما اگر بخواهید فقط برای آرشیو دستهبندی رفتار خاصی پیاده کنید، از is_category() استفاده میکنید.
برای مطالعه دقیقتر روی این توابع، میتوانید به راهنمای is_tag، راهنمای is_archive و راهنمای is_single مراجعه کنید.
کاربردهای عملی در قالب
یکی از رایجترین کاربردهای این تابع، اضافه کردن کلاس CSS اختصاصی به بدنه است. میتوانید با استفاده از این تابع، استایل متفاوتی برای آرشیو دستهبندی پیاده کنید:add_filter( 'body_class', 'myplugin_body_classes' );
function myplugin_body_classes( $classes ) {
if ( is_category() ) {
$classes[] = 'category-archive-layout';
}
return $classes;
}
تابع body_class در راهنمای body_class به تفصیل بررسی شده است.
کاربرد دیگر، نمایش توضیحات دسته در بالای آرشیو است. تابع category_description() این کار را انجام میدهد:
if ( is_category() ) {
$cat_description = category_description();
if ( ! empty( $cat_description ) ) {
echo '' . wp_kses_post( $cat_description ) . '';
}
}
نکته مهم: category_description() خروجی HTML خام تولید میکند، بنابراین استفاده از wp_kses_post() برای پاکسازی مناسب است.
دسته والد و فرزند
یکی از مفاهیم مهم در دستهبندی وردپرس، سلسلهمراتب است. هر دسته میتواند دسته والد داشته باشد و به همین ترتیب، درخت دستهها شکل میگیرد. تابعis_category() برای تشخیص دسته فرزند میتواند مسیر کامل را بپذیرد:
if ( is_category( 'tech/wordpress' ) ) {
// کد فقط برای دسته wordpress که فرزند tech است
}
نکته مهم این است که اگر پارامتر دسته والد را بدهید، این تابع تنها زمانی true برمیگرداند که دقیقاً همان دسته والد در حال نمایش باشد، نه فرزندان آن. برای بررسی دسته والد بههمراه فرزندان، باید از توابع دیگری مانند cat_is_ancestor_of() استفاده کنید.
ارتباط با سلسلهمراتب قالب
وردپرس برای نمایش آرشیو دستهبندی، سلسلهمراتب قالب خاصی دارد. ابتدا بررسی میشود که آیا فایلcategory-{slug}.php وجود دارد (مثلاً category-tech.php). اگر وجود داشته باشد، از آن استفاده میشود. سپس category-{id}.php، بعد category.php، بعد archive.php و در نهایت index.php بررسی میشوند.
تابع is_category() در هر یک از این فایلها میتواند استفاده شود، اما در فایلهای اختصاصی دسته، این شرط زائد است. برای مطالعه دقیقتر درباره سلسلهمراتب قالب، میتوانید به راهنمای get_template_part مراجعه کنید.
نکات امنیتی و اشتباهات رایج
اشتباه اول، نبود شرط مناسب است. اگر در فایلcategory.php از is_category() بدون پارامتر استفاده کنید، شرط زائد است. اما اگر در فایل مشترک مانند archive.php استفاده میکنید، شرط ضروری است.
اشتباه دوم، نبود بررسی slug است. اگر بخواهید برای دستهای خاص استایل متفاوتی بدهید و slug را اشتباه بنویسید، شرط هرگز اجرا نمیشود. باید در محیط staging تست کنید.
اشتباه سوم، نبود escape در خروجی است. اگر توضیحات دسته را چاپ میکنید، باید از wp_kses_post() یا esc_html() استفاده کنید. راهنمای esc_html در صفحه esc_html آمده است.
اشتباه چهارم، نبود تست است. باید دستههای مختلف را در محیط staging تست کنید: دسته بدون نوشته، دسته با نوشته زیاد، دسته والد، دسته فرزند.
اشتباه پنجم، استفاده از این تابع در حلقه سفارشی است. این تابع تنها برای حلقه اصلی معتبر است.
اشتباه ششم، نبود توجه به سئو است. آرشیو دستهبندی میتواند محتوای باارزش یا نازک تولید کند. برای مطالعه بیشتر روی این موضوع، میتوانید به راهنمای سئوی صفحات دسته فروشگاهی مراجعه کنید.
تحلیل فنی پیشرفته
در نگاه مهندسی، تابعis_category() یک نقطه تصمیم (Decision Point) در لایه نمایش است که بر چند لایه معماری وردپرس اثر میگذارد. لایه اول لایه کوئری است. وردپرس با تجزیه URL و ساخت WP_Query، متغیر category_name یا cat را تنظیم میکند. سپس متد is_category() بر اساس این متغیر تصمیم میگیرد.
لایه دوم لایه قالب است. سلسلهمراتب قالب در دستهبندی امکان سفارشیسازی کامل را برای هر دسته فراهم میکند. این انعطاف در پروژههای بزرگ با دهها دسته، ارزش بالایی دارد.
لایه سوم لایه سئو است. آرشیو دستهبندی معمولاً بهعنوان بخش مهمی از معماری سئو در نظر گرفته میشود. برای مطالعه درباره ساختار URL و معماری اطلاعات، میتوانید به راهنمای معماری اطلاعات برای سئو مراجعه کنید.
لایه چهارم لایه کشینگ است. آرشیو دسته معمولاً کش میشود و این کش میتواند عمر طولانی داشته باشد، چرا که محتوای دسته بهندرت تغییر میکند. اما اگر محتوای شرطی داشته باشد (مانند نمایش محصولات پرطرفدار)، باید استراتژی کش مناسب انتخاب شود.
لایه پنجم لایه تست است. تستهای End-to-End باید هم دستههای ساده و هم دستههای سلسلهمراتبی را پوشش دهند. مفاهیم پایهای تاکسونومی در Taxonomy در ویکیپدیا توضیح داده شده است.
در معماری Headless WordPress، این تابع در سمت بکاند اجرا میشود و فرانتاند باید بر اساس نوع تاکسونومی، نمایش متفاوتی پیاده کند. برای مطالعه درباره REST API به راهنمای register_rest_route مراجعه کنید.
پرسشهای پرتکرار
تفاوتis_category و is_tag چیست؟ is_category آرشیو دستهبندی را هدف میگیرد و is_tag آرشیو برچسب را.
آیا is_category در حلقه سفارشی کار میکند؟ خیر، این تابع تنها بر پایه کوئری اصلی کار میکند.
چطور دسته فرزند را بررسی کنیم؟ با پاس دادن مسیر کامل مانند tech/wordpress.
آیا is_category در فایل category.php زائد است؟ بله، چون این فایل تنها برای آرشیو دسته بارگذاری میشود.
چطور میتوان بررسی کرد که کاربر در حال مشاهده یک دسته خاص است یا نه؟ با پاس دادن slug یا ID دسته به is_category.
نتیجه و مسیر ادامه
تابعis_category() یک ابزار دقیق برای تشخیص آرشیو دستهبندی در وردپرس است. استفاده درست از آن یعنی درک دقیق تفاوت دسته و برچسب، استفاده از توابع تخصصیتر در موارد خاص، توجه به escape در خروجی و تست همه حالتها. هر اشتباه کوچک میتواند به تجربه ضعیف کاربر یا مشکلات سئو منجر شود.
اگر این تابع را در پروژهای واقعی به کار بردهاید و رفتار غیرمنتظرهای دیدهاید — بهخصوص در ترکیب با کش یا در سایتهای فروشگاهی — تجربهتان میتواند راهگشای دیگران باشد. کدام بخش بیشترین زمان را از شما گرفت؟ دیدگاه خود را بنویسید.