ویژگی تصویر

آموزش تابع is_category() در وردپرس و کاربرد آن

  /  وردپرس   /  تابع is_category در وردپرس
بنر تبلیغاتی الف
wp - wordpress - وردپرس

تابع is_category() یک conditional tag در وردپرس است که بررسی می‌کند آیا صفحهٔ نمایش‌داده‌شده، آرشیو دسته‌بندی (category archive) است یا خیر. این تابع برای ساخت قالب‌های شرطی، بارگذاری استایل یا اسکریپت‌های خاص، تغییر پرس‌و‌جو (query) و بهینه‌سازی نمایش محتوا در صفحات دسته‌بندی بسیار مفید است.

رفتار کلی و انواع پارامترها

  • بدون پارامتر: is_category() زمانی true بازمی‌گرداند که صفحهٔ فعلی یک آرشیو دسته‌بندی باشد.
  • پارامتر رشته‌ای (slug یا name): is_category(‘news’) اگر آرشیو دسته‌ای با slug یا نام ‘news’ باشد true خواهد بود.
  • پارامتر عددی (ID): is_category(5) اگر آرشیو دسته‌ای با شناسهٔ 5 باشد true می‌شود.
  • آرایه: is_category(array(‘news’,’sports’,5)) برای مقایسهٔ چند مقدار استفاده می‌شود.
نوع پارامترمثالنتیجه
بدون پارامترis_category()بررسی آرشیو دستهٔ جاری
نصب شدهis_category(‘news’)آرشیو دسته با slug = ‘news’
آرایهis_category(array(3,’tutorials’))هر یک از دسته‌های مشخص‌شده

مثال‌های عملی در قالب‌ها

/* در فایل category.php یا هر قالب مشابه */if ( is_category() ) {
    echo '<h1>آرشیو دسته‌بندی</h1>';
}

if ( is_category('news') ) {
    // نمایش ویژه برای دسته news
    get_template_part('template-parts/category','news');
}

در این مثال ساده، قسمت اول بررسی می‌کند که صفحهٔ فعلی یک آرشیو دسته است و عنوانی چاپ می‌کند. قسمت دوم فقط اگر آرشیو دسته با slug برابر ‘news’ باشد، یک بخش تمپلیت خاص را بارگذاری می‌کند.

تفاوت is_category() و in_category()

  • is_category() برای بررسی صفحهٔ آرشیو دسته کاربرد دارد.
  • in_category() برای بررسی این‌که یک پست خاص آیا به دسته‌ای تعلق دارد یا نه (معمولاً داخل The Loop) هست.

برای مثال: داخل single.php اگر بخواهید ببینید پستی در دستهٔ ‘news’ است یا خیر از in_category(‘news’) استفاده کنید، اما برای قالب آرشیو دسته باید از is_category() بهره ببرید.

نکات پیشرفته و خطاهای رایج

  • is_category() فقط در زمان‌هایی که کوئری اصلی (main query) مقداردهی شده، نتیجهٔ درست می‌دهد. در هوک‌هایی که خیلی زود اجرا می‌شوند ممکن است مقدار اشتباه برگرداند.
  • برای تغییر پرس‌و‌جو در آرشیو دسته باید از هوک pre_get_posts استفاده کنید، اما مراقب باشید از is_category() درست داخل همین هوک استفاده کنید (نمونهٔ اصلاح‌شده در ادامه).
  • وقتی در صفحهٔ آرشیو دستهٔ فرزند هستید، is_category(‘parent-slug’) به صورت خودکار true نخواهد بود. برای تشخیص سلسله‌مراتب دسته‌ها از cat_is_ancestor_of() یا توابع مشابه استفاده کنید.

نمونهٔ اشتباه و اصلاح‌شده در pre_get_posts

/* نادرست: استفاده از is_category() کلی ممکن است به نتایج نادرست منجر شود */function wrong_modify_query($query) {
    if ( !is_admin() && is_category('news') ) {
        $query->set('posts_per_page', 5);
    }
}
add_action('pre_get_posts','wrong_modify_query');

توضیح: در این حالت ممکن است is_category() براساس کوئری پیش‌فرض کار نکند زیرا pre_get_posts قبل از تنظیم کامل Query اجرا می‌شود. همچنین باید بررسی کنید که $query همان کوئری اصلی باشد.

/* درست: بررسی is_admin و کوئری اصلی با $query->is_main_query() */function correct_modify_query($query) {
    if ( is_admin() ) return;
    if ( $query->is_main_query() && $query->is_category('news') ) {
        $query->set('posts_per_page', 5);
    }
}
add_action('pre_get_posts','correct_modify_query');

در نسخهٔ اصلاح‌شده از $query->is_main_query() استفاده شده تا فقط کوئری اصلی تحت تأثیر قرار گیرد و از $query->is_category(‘news’) که مخصوص همین شیء کوئری است برای اطمینان از نتیجهٔ صحیح بهره گرفته شده است.

نمونهٔ کاربردی: افزودن کلاس به body برای استایل‌دهی خاص

function my_body_classes($classes) {
    if ( is_category('tutorials') ) {
        $classes[] = 'category-tutorials';
    }
    return $classes;
}
add_filter('body_class','my_body_classes');

این کد در فایل functions.php افزوده می‌شود و اگر بازدیدکننده در آرشیو دستهٔ ‘tutorials’ باشد، کلاس دلخواه به body افزوده می‌شود تا بتوانید CSS مخصوصی را اعمال کنید.

کاربردهای متداول و توصیه‌های بهینه‌سازی

  • ساخت تمپلیت‌های متفاوت برای دسته‌های مهم (category-{slug}.php یا category-{id}.php).
  • بارگذاری سبک‌ها یا اسکریپت‌های اختصاصی برای یک دسته خاص.
  • تنظیم فیلترها یا ترتیب نمایش نوشته‌ها در آرشیوهای دسته با استفاده از pre_get_posts (همیشه is_main_query را چک کنید).
  • ترکیب is_category() با توابعی مثل get_queried_object() برای گرفتن اطلاعات دسته جاری (نام، ID، parent و …).

مثال: گرفتن اطلاعات دسته جاری

$cat = get_queried_object();
if ( is_category() && $cat ) {
    $cat_id = $cat->term_id;
    $cat_name = $cat->name;
    // می‌توانید متادیتای دسته یا تصویر دسته را هم بخوانید
}

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

خلاصه و جمع‌بندی

is_category() تابعی ساده اما قدرتمند برای تشخیص صفحات آرشیو دسته در وردپرس است. با ترکیب صحیح آن در قالب و هوک‌هایی مانند pre_get_posts می‌توانید تجربهٔ کاربری و ساختار وب‌سایت را بهبود دهید. به تفاوت‌های آن با in_category() و محدودیت‌های زمانی اجرای conditional tags توجه کنید و همیشه کوئری اصلی را هنگام تغییر پرس‌و‌جو بررسی نمایید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: