در وردپرس، Conditional Tags (برچسب‌های شرطی) ابزار اصلی کنترل منطق نمایش در فایل‌های قالب هستند و پایه تصمیم‌گیری برای رندر بخش‌های مختلف صفحه محسوب می‌شوند. بدون درک درست is_singular، is_archive، is_tax و ترکیب آن‌ها با Template Hierarchy، قالب به مجموعه‌ای از فایل‌های پراکنده تبدیل می‌شود که هر تغییر کوچک در آن، خطاهای پیش‌بینی‌نشده ایجاد می‌کند. شرط‌های پیشرفته مثل has_block، in_category و is_page_template امکان کنترل دقیق‌تری می‌دهند و در پروژه‌های بزرگ، تفاوت بین قالب حرفه‌ای و قالب شکننده را مشخص می‌کنند. تست منطق شرطی در سه سطح واحد، یکپارچه و E2E انجام می‌شود و بدون آن، انتشار به تولید ریسک بالایی دارد. در این راهنما از اصول پایه تا سناریوهای حرفه‌ای Conditional Tags را با نگاه مهندسی و کد عملی پوشش می‌دهیم.

در پروژه‌های واقعی، بیشترین خطای قالب مربوط به شرط‌هایی است که در زمان اشتباه اجرا می‌شوند. Conditional Tags باید پس از اجرای Query و در زمان رندر فراخوانی شوند، نه پیش از آن. این نکته کوچک، منبع بسیاری از خطاهای خاموش است.

Conditional Tags چیست و چه نقشی در قالب دارد؟

Conditional Tags توابع بولی هستند که وضعیت درخواست جاری را برمی‌گردانند. هر شرط، پاسخ true یا false می‌دهد و در قالب، برای کنترل نمایش بخش‌های مختلف استفاده می‌شود.

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

زمان اجرای Conditional Tags

Conditional Tags فقط پس از اجرای Query اصلی معتبر هستند. اگر پیش از هوک template_redirect اجرا شوند، خروجی نامعتبر است و ممکن است باعث خطای PHP شود.

شرط‌های پایه و پرکاربرد

پرکاربردترین شرط‌ها شامل is_home()، is_front_page()، is_admin()، is_user_logged_in() و is_404() هستند.

نکته مهم: تفاوت is_home و is_front_page در تنظیمات برگه اصلی سایت است. اگر برگه اصلی روی «آخرین نوشته‌ها» باشد، هر دو true می‌شوند. اگر برگه اصلی روی یک برگه خاص باشد، is_front_page در آن برگه true و is_home در صفحه بلاگ true می‌شود.

برای مطالعه بیشتر، راهنمای تابع is_front_page در وردپرس را ببینید.

is_admin و هوک admin_enqueue_scripts

شرط is_admin() در پنل مدیریت true است، اما در AJAX با admin-ajax.php نیز true می‌شود. برای تشخیص دقیق صفحه، از get_current_screen() استفاده کنید.

شرط‌های مربوط به نمایش تکی

شرط‌های تکی شامل is_single()، is_page()، is_singular()، is_attachment() و is_page_template() هستند.

شرط is_singular() هر دو پست و برگه را شامل می‌شود و برای نمایش بخش‌های مشترک در پست‌تایپ‌های مختلف مناسب است.

برای مطالعه بیشتر، راهنمای تابع is_single در وردپرس و تابع is_page در وردپرس را ببینید.

is_page_template و قالب اختصاصی برگه

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

شرط‌های مربوط به آرشیو و تاکسونومی

شرط‌های آرشیو شامل is_archive()، is_category()، is_tag()، is_tax()، is_author()، is_date() و is_post_type_archive() هستند.

شرط is_tax() برای تاکسونومی سفارشی استفاده می‌شود و می‌توانید پارامتر ترم و تاکسونومی را تعیین کنید.

برای مطالعه بیشتر، راهنمای تابع is_archive در وردپرس و تابع is_category در وردپرس را ببینید.

is_post_type_archive و آرشیو CPT

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

شرط‌های پیشرفته و غیرمستقیم

شرط‌های پیشرفته شامل has_block()، in_category()، has_tag()، has_term()، is_active_sidebar()، has_post_thumbnail() و is_paged() هستند.

شرط has_block() در قالب‌های بلاکی بسیار مفید است. با این شرط می‌توانید بررسی کنید آیا یک بلاک خاص در محتوا هست یا خیر و بر اساس آن، استایل یا اسکریپت اضافه کنید.

برای مطالعه بیشتر، راهنمای ساخت بلاک سفارشی گوتنبرگ را ببینید.

has_term و کنترل شرطی در تاکسونومی

تابع has_term() امکان بررسی تعلق یک پست به یک یا چند ترم را می‌دهد. این تابع، در نمایش محتوای شرطی بر اساس ترم، بسیار کاربرد دارد.

ترکیب شرط‌ها و الگوهای منطقی

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

if ( is_singular( "post" ) && get_the_author_meta( "ID" ) === 5 ) {
    get_template_part( "parts/author-note" );
}

الگوی حرفه‌ای این است که منطق‌های پیچیده را در فایل‌های helper جدا کنید تا خوانایی قالب حفظ شود.

الگوی guard clause در قالب

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

اتصال Conditional Tags به Template Hierarchy

Conditional Tags در Template Hierarchy نقش کلیدی دارند. هسته وردپرس برای انتخاب فایل قالب، از این شرط‌ها استفاده می‌کند. برای مثال، اگر is_category() true باشد، هسته به‌دنبال فایل‌های category می‌گردد.

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

فیلتر body_class و کنترل شرطی

با فیلتر body_class می‌توانید کلاس‌های بدنه را بر اساس شرط‌ها تغییر دهید. این الگو، امکان کنترل شرطی CSS بدون تغییر PHP را می‌دهد.

نمایش شرطی در بارگذاری CSS و JS

یکی از کاربردهای مهم Conditional Tags، بارگذاری شرطی فایل‌های CSS و JS است. برای مثال، فقط در صفحه محصول ووکامرس فایل مربوطه را بارگذاری کنید.

add_action( "wp_enqueue_scripts", function() {
    if ( is_product() ) {
        wp_enqueue_style( "single-product-css", get_theme_file_uri( "assets/css/product.css" ), array(), "1.0.0" );
    }
} );

برای مطالعه بیشتر، راهنمای بارگذاری شرطی CSS و JS در صفحات خاص را ببینید.

کاهش حجم صفحات با بارگذاری هدفمند

بارگذاری شرطی یکی از مؤثرترین روش‌های بهبود Core Web Vitals است. با کاهش CSS و JS غیرضروری، LCP و INP بهبود می‌یابد.

تست و دیباگ منطق شرطی

برای تست، ابتدا باید مطمئن شوید شرط‌ها در زمان درست اجرا می‌شوند. ساده‌ترین راه، ثبت خروجی شرط‌ها در error_log در حالت WP_DEBUG است.

add_action( "wp", function() {
    if ( defined( "WP_DEBUG" ) && WP_DEBUG ) {
        error_log( "is_singular: " . ( is_singular() ? "yes" : "no" ) );
        error_log( "is_archive: " . ( is_archive() ? "yes" : "no" ) );
    }
} );

برای تست‌های خودکار، راهنمای تست E2E وردپرس با Playwright را ببینید.

اشتباهات رایج در تست شرط‌ها

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

امنیت و Escape در نمایش شرطی

در نمایش شرطی، همه داده‌های خروجی باید Escape شوند. برای متن از esc_html، برای URL از esc_url و برای Attributes از esc_attr استفاده کنید.

برای مطالعه بیشتر، راهنمای Escape کردن خروجی برای جلوگیری از XSS را ببینید. همچنین مفهوم Conditional را در ویکی‌پدیا مرور کنید.

دسترسی‌پذیری و نمایش شرطی

نمایش شرطی باید همیشه ساختار HTML معنایی تولید کند. برای مطالعه بیشتر، راهنمای ARIA در وردپرس را ببینید.

پرسش‌های پرتکرار درباره Conditional Tags

تفاوت is_home و is_front_page چیست؟

is_home در صفحه بلاگ true است و is_front_page در برگه اصلی سایت. اگر برگه اصلی روی آخرین نوشته‌ها باشد، هر دو true هستند.

آیا می‌توان Conditional Tags را در functions.php استفاده کرد؟

بله، اما فقط در هوک‌های بعد از اجرای Query مثل template_redirect یا wp.

آیا Conditional Tags در REST API کار می‌کنند؟

خیر، در REST API این شرط‌ها معتبر نیستند و باید از روش‌های دیگر استفاده کنید.

چرا is_page() در آرشیو برگه true نیست؟

is_page فقط برای برگه تکی true است، برای آرشیو برگه از is_post_type_archive استفاده کنید.

آیا می‌توان چند شرط را در یک خط ترکیب کرد؟

بله، با AND و OR. اما توصیه می‌کنم برای خوانایی، شرط‌ها را در متغیر جدا کنید.

نتیجه و مسیر ادامه

Conditional Tags ابزار اصلی کنترل منطق نمایش در قالب وردپرس است. کلید موفقیت، درک زمان اجرای شرط‌ها، ترکیب درست با Template Hierarchy و تست در سه سطح است. اگر منطق شرطی به‌درستی مستند و تست شود، نگهداشت قالب در طول سال‌ها ساده باقی می‌ماند.

پیشنهاد می‌کنم مسیر یادگیری را با Template Hierarchy پیشرفته ادامه دهید و سپس بارگذاری شرطی CSS و JS را به‌عنوان تمرین عملی پیاده کنید.

اگر روی پروژه واقعی خود با Conditional Tags کار کرده‌اید، برایم جالب است بدانید کدام شرط بیشترین خطا را ایجاد کرده است. تجربه خودتان را در دیدگاه‌ها بنویسید.