ویژگی تصویر

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

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

تابع is_archive() در وردپرس یکی از Conditional Tags مهم است که برای تشخیص صفحات آرشیو (archive pages) استفاده می‌شود. منظور از صفحات آرشیو، صفحاتی مثل دسته‌بندی‌ها، برچسب‌ها، آرشیو نوع نوشته (post type archive)، تاریخ‌ها و آرشیو نویسنده است. در این مقاله به صورت عملی و با مثال‌های واقعی توضیح می‌دهیم که چه زمانی از is_archive() استفاده کنید، نکات مهم و اشتباهات رایج، و نمونه‌کدهایی برای بهینه‌سازی قالب و کوئری‌ها.

چه زمانی is_archive() مقدار true برمی‌گرداند؟

  • صفحات دسته‌بندی (category archives)
  • صفحات برچسب (tag archives)
  • آرشیوهای taxonomy سفارشی (custom taxonomy archives)
  • آرشیو نوع نوشتهٔ سفارشی (post type archive)
  • آرشیوهای تاریخ (date archives: year, month, day)
  • آرشیو نویسنده (author archives)

توجه: is_archive() شامل نتایج جستجو یا صفحهٔ خانه (home) نمی‌شود. همچنین در محیط ادمین (wp-admin) مقدار آن به طور معمول false است.

نکات کلیدی و کاربردهای متداول

  • کنترل ظاهر صفحات آرشیو (مثلاً بارگذاری استایل یا هدر متفاوت)
  • تغییر پارامترهای کوئری اصلی در hook ای مثل pre_get_posts
  • ایجاد Breadcrumb یا عنوان آرشیو با دادن شرایط خاص
  • بارگذاری اسکریپت/استایل فقط برای صفحات آرشیو برای بهینه‌سازی سرعت

نکات فنی و هشدارها

  • is_archive() بر پایهٔ وضعیتِ کوئری اصلی (main query) کار می‌کند. بنابراین در زمان‌هایی که کوئری اصلی هنوز پردازش نشده باشد (مثل قبل از WP_Query parsing) ممکن است نتیجه درست نگیرد.
  • درون hook هایی مانند pre_get_posts باید از $query->is_archive() استفاده کنید نه is_archive() جهانی، و همیشه بررسی کنید که $query->is_main_query() باشد تا تنها کوئری اصلی را تغییر دهید.
  • در Ajax یا REST API، بررسی این شرط ممکن است متفاوت یا بی‌معنی باشد؛ به جای آن از پارامترهای درخواست استفاده کنید.

مثال‌های عملی و کدهای کاربردی

1) بارگذاری استایل اختصاصی برای آرشیو نوع نوشتهٔ خاص

function enqueue_archive_styles() {
    if ( is_post_type_archive( 'product' ) ) {
        wp_enqueue_style( 'product-archive', get_template_directory_uri() . '/css/product-archive.css' );
    }
}
add_action( 'wp_enqueue_scripts', 'enqueue_archive_styles' );

در این مثال از is_post_type_archive(‘product’) استفاده شده چون می‌خواهیم استایل فقط برای آرشیو نوع نوشتهٔ «product» بارگذاری شود. توجه داشته باشید که is_post_type_archive() نیز زیرمجموعهٔ منطق آرشیو است.

2) تغییر تعداد پست‌ها در آرشیوها با pre_get_posts

function custom_archive_posts_per_page( $query ) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_archive() ) {
        $query->set( 'posts_per_page', 12 );
    }
}
add_action( 'pre_get_posts', 'custom_archive_posts_per_page' );

این کد تعداد آیتم‌های صفحه را برای همهٔ صفحات آرشیو به 12 تغییر می‌دهد. مهم است که در pre_get_posts از $query->is_main_query() استفاده کنیم تا فقط کوئری اصلی را تغییر دهیم و تاثیر ناخواسته روی کوئری‌های داخلی پنل مدیریت یا ویجت‌ها نداشته باشیم.

3) ترکیب is_archive() با is_paged() یا شروط دیگر

if ( is_archive() && is_paged() ) {
    // مثلاً فقط در صفحات آرشیوِ صفحه‌شماره‌دار تبلیغات خاصی نمایش دهیم
}

ترکیب شروط به شما انعطاف می‌دهد تا رفتارهای متفاوت برای صفحات اول آرشیو و صفحات بعدی داشته باشید (مثلاً نشان ندادن ویجت‌های سنگین در صفحات بعدی).

نمونه جدول: مقایسهٔ توابع شرطی مرتبط

تابعکاربرد
is_archive()همهٔ صفحات آرشیو (دسته، برچسب، taxonomy، post type، تاریخ، نویسنده)
is_category()فقط صفحات دسته‌بندی
is_tag()فقط صفحات برچسب
is_post_type_archive()آرشیو نوع نوشتهٔ مشخص (مثل product)
is_author()آرشیو نویسنده

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

  • همیشه بررسی کنید که تابع را در زمان مناسب فراخوانی می‌کنید (قالب‌ها، template_redirect، یا بعد از parse_query).
  • در پلاگین‌ها یا فانکشن‌هایی که ممکن است در محیط مدیریت اجرا شوند از is_admin() برای جداسازی استفاده کنید.
  • اگر می‌خواهید تغییرات کوئری انجام دهید، از pre_get_posts و $query->is_main_query() استفاده کنید تا تداخل با سایر کوئری‌ها پیش نیاید.
  • برای قالب‌بندی SEO، از the_archive_title() و the_archive_description() همراه با is_archive() استفاده کنید تا اطلاعات ساختاری و متا معناداری تولید شود.

مثال پیشرفته: ناوبری و متا سفارشی برای آرشیو نوع نوشته

add_action( 'template_redirect', 'custom_archive_template_redirect' );
function custom_archive_template_redirect() {
    if ( is_post_type_archive( 'book' ) ) {
        // نمایش قالب اختصاصی یا تغییر متا تگ‌ها
        add_filter( 'wp_title', function( $title ) {
            return 'کتاب‌ها - ' . $title;
        });
    }
}

در این مثال با استفاده از template_redirect و is_post_type_archive، عنوان صفحه برای آرشیو نوع نوشتهٔ «book» تغییر می‌کند. توجه داشته باشید که این حلقه از طریق hook انجام شده و نه درون loop قالب.

خلاصه

تابع is_archive() ابزار قدرتمندی برای شناسایی صفحات آرشیو وردپرس است و در ترکیب با توابع دیگر (مثل is_post_type_archive، is_category، و is_tag) می‌تواند به شما کنترل کامل روی نمایش، کوئری و بهینه‌سازی صفحات آرشیو بدهد. همواره به نکات فنی مانند زمان اجرا، استفاده از $query->is_main_query() در pre_get_posts و جداسازی محیط ادمین دقت کنید تا از رفتارهای ناخواسته جلوگیری شود.

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

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