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

چرا تشخیص برگه اهمیت دارد؟

در وردپرس، برگه (Page) نوع خاصی از محتواست که خارج از جریان زمانی نوشته‌ها (Posts) قرار می‌گیرد. برگه‌ها معمولاً برای محتوای ایستا استفاده می‌شوند: صفحه درباره ما، تماس با ما، خدمات، قوانین و مقررات و پرسش‌های پرتکرار نمونه‌های رایج آن هستند. این ماهیت ایستا، تفاوت‌های مهمی در تجربه کاربری و طراحی ایجاد می‌کند. برای نمونه، در نوشته‌ها معمولاً تاریخ انتشار، نویسنده و دسته‌بندی نمایش داده می‌شود، اما در برگه‌ها این موارد معمولاً نامرتبط هستند. اگر در قالب این تفاوت لحاظ نشود، ممکن است برگه‌ها با اطلاعات نامرتبط آلوده شوند و ظاهر نامناسبی داشته باشند. تابع is_page() دقیقاً همین تشخیص را ممکن می‌کند و به توسعه‌دهنده اجازه می‌دهد رفتار شرطی دقیق برای برگه‌ها پیاده کند.

تابع is_page چیست؟

تابع is_page() یک تابع شرطی در هسته وردپرس است که در فایل wp-includes/query.php تعریف شده است. این تابع بررسی می‌کند که آیا صفحه فعلی یک برگه است یا نه. خروجی این تابع یک مقدار بولی است: true اگر صفحه فعلی برگه باشد و false در غیر این صورت. اگر آرگومان ورودی داده شود، تابع فقط زمانی مقدار true برمی‌گرداند که برگه فعلی با مشخصه داده‌شده مطابقت داشته باشد. نکته مهم این است که این تابع تنها برای حلقه اصلی (Main Query) معتبر است. اگر از WP_Query سفارشی استفاده کنید، is_page() مقدار نادرست برمی‌گرداند. برای مطالعه بیشتر روی کوئری سفارشی، می‌توانید به راهنمای WP_Query مراجعه کنید.

امضای تابع و پارامترها

امضای این تابع به‌شکل زیر است:
function is_page( $page = '' ) {
    global $wp_query;
    return $wp_query->is_page( $page );
}
پارامتر ورودی می‌تواند از چند نوع باشد: - خالی: هر برگه را شامل می‌شود - عدد صحیح: شناسه (ID) برگه - رشته: نامک (slug) برگه - رشته با اسلش: مسیر کامل برگه (مثلاً about/team) - آرایه: فهرستی از شناسه‌ها یا نامک‌ها نکته مهم این است که اگر پارامتر رشته‌ای داده شود، وردپرس ابتدا آن را به‌عنوان slug تفسیر می‌کند و در صورت عدم تطابق، به‌عنوان عنوان جستجو می‌کند. به همین دلیل، برای دقت بیشتر بهتر است از slug یا ID استفاده شود.

سازوکار داخلی تابع

تابع is_page() در واقع یک میان‌بر (Wrapper) برای متد is_page() روی شیء جهانی $wp_query است. این متد در کلاس WP_Query تعریف شده و بررسی می‌کند که آیا متغیر page در کوئری فعلی مقدار داشته باشد یا نه. وقتی کاربر یک برگه را باز می‌کند، وردپرس با تجزیه URL و ساخت WP_Query، متغیر page یا pagename را در کوئری اصلی تنظیم می‌کند. اگر این مقدار معتبر باشد، is_page() مقدار true برمی‌گرداند. نکته مهم این است که وردپرس برای برگه‌ها، فایل page.php را در اولویت اول قرار می‌دهد. اگر برگه دارای قالب اختصاصی باشد، از آن قالب استفاده می‌شود. برای مطالعه دقیق روی سلسله‌مراتب قالب، می‌توانید به راهنمای get_template_part و راهنمای get_header مراجعه کنید.

تفاوت is_page با is_single و توابع مشابه

مهم‌ترین تفاوت is_page() با is_single() این است که اولی برگه را تشخیص می‌دهد و دومی نوشته را. برگه‌ها ساختار سلسله‌مراتبی دارند و می‌توانند والد و فرزند داشته باشند، در حالی که نوشته‌ها در دسته‌بندی و برچسب سازمان می‌یابند. تابع is_front_page() برای تشخیص صفحه اصلی سایت استفاده می‌شود که ممکن است یک برگه یا آخرین نوشته‌ها باشد. تابع is_home() تنها صفحه اصلی وبلاگ را هدف می‌گیرد. برای مطالعه دقیق‌تر روی این توابع، می‌توانید به راهنمای is_single، راهنمای is_front_page و راهنمای is_home مراجعه کنید.

کاربردهای عملی در قالب

یکی از رایج‌ترین کاربردهای این تابع، اضافه کردن کلاس CSS اختصاصی به بدنه است. می‌توانید با استفاده از این تابع، استایل متفاوتی برای برگه‌ها پیاده کنید:
add_filter( 'body_class', 'myplugin_body_classes' );
function myplugin_body_classes( $classes ) {
    if ( is_page() ) {
        $classes[] = 'static-page-layout';
    }
    return $classes;
}
تابع body_class در راهنمای body_class به تفصیل بررسی شده است. کاربرد دیگر، مخفی کردن بخش‌هایی از قالب در برگه‌ها است. برای نمونه، در برگه‌ها معمولاً نیازی به نمایش تاریخ، نویسنده و دیدگاه‌ها نیست. با استفاده از is_page() می‌توان این بخش‌ها را شرطی کرد.
if ( ! is_page() ) {
    get_template_part( 'parts/meta', 'post' );
}
نمونه دیگر، اعمال قالب اختصاصی بر اساس نامک برگه است:
if ( is_page( 'contact-us' ) ) {
    get_template_part( 'parts/contact-form' );
}

بررسی برگه خاص با پارامتر

اگر بخواهید برای یک برگه خاص رفتار متفاوتی پیاده کنید، از پارامتر استفاده کنید:
if ( is_page( 'about' ) ) {
    // کد فقط برای برگه با نامک about اجرا می‌شود
}
برای برگه‌های فرزند (Subpage)، باید مسیر کامل را بدهید:
if ( is_page( 'about/team' ) ) {
    // کد فقط برای برگه team که فرزند about است
}
برای بررسی چند برگه همزمان، از آرایه استفاده کنید:
if ( is_page( array( 'about', 'services', 'contact' ) ) ) {
    // کد اجرا می‌شود اگر یکی از این برگه‌ها باشد
}
نکته مهم این است که استفاده از ID به جای slug، پایدارتر و سریع‌تر است. اگر نامک برگه بعداً تغییر کند، کد شما کار نمی‌کند. به همین دلیل، در پروژه‌های حرفه‌ای توصیه می‌شود از ID استفاده شود.

ارتباط با سلسله‌مراتب قالب

وردپرس برای نمایش برگه‌ها، از سلسله‌مراتب قالب خاصی استفاده می‌کند. ابتدا بررسی می‌شود که آیا برگه دارای قالب اختصاصی است؛ اگر باشد، از آن استفاده می‌شود. سپس فایل page-{slug}.php، بعد page-{id}.php، بعد page.php و در نهایت singular.php و index.php بررسی می‌شوند. تابع is_page() در هر یک از این فایل‌ها می‌تواند استفاده شود، اما در برخی از این فایل‌ها زائد است. برای نمونه، در page.php که تنها برای برگه‌ها بارگذاری می‌شود، استفاده از is_page() بدون پارامتر، زائد محسوب می‌شود. برای مطالعه دقیق درباره ساختار قالب و نحوه استفاده از get_header() و get_footer()، می‌توانید به راهنمای get_header و راهنمای get_footer مراجعه کنید.

نکات امنیتی و اشتباهات رایج

اشتباه اول، نبود شرط مناسب است. اگر در فایل page.php از is_page() بدون پارامتر استفاده کنید، شرط زائد است. اما اگر در فایل مشترک مانند singular.php یا archive.php استفاده می‌کنید، شرط ضروری است. اشتباه دوم، نبود بررسی slug است. اگر بخواهید برای برگه‌ای خاص استایل متفاوتی بدهید و slug را اشتباه بنویسید، شرط هرگز اجرا نمی‌شود. باید همیشه در محیط staging تست کنید. اشتباه سوم، نبود escape در خروجی است. اگر عنوان یا محتوای برگه را در قالب چاپ می‌کنید، باید از توابع escape مانند esc_html() و esc_attr() استفاده کنید. راهنمای این توابع در صفحه esc_html آمده است. اشتباه چهارم، نبود تست است. همیشه باید برگه‌های مختلف را در محیط staging تست کنید: برگه ساده، برگه دارای فرزند، برگه با قالب اختصاصی. اشتباه پنجم، استفاده از is_page() در حلقه‌های سفارشی است. این تابع تنها برای حلقه اصلی معتبر است. اگر WP_Query سفارشی دارید، باید بعد از حلقه از wp_reset_query() استفاده کنید.

تحلیل فنی پیشرفته

در نگاه مهندسی، تابع is_page() یک نقطه تصمیم (Decision Point) در لایه نمایش است که بر چند لایه معماری وردپرس اثر می‌گذارد. لایه اول لایه کوئری است. وردپرس با تجزیه URL و ساخت WP_Query، متغیر page یا pagename را تنظیم می‌کند. این تنظیم بر پایه قوانین Rewrite است که در فایل .htaccess یا پیکربندی Nginx پیاده می‌شود. لایه دوم لایه قالب است. فایل‌های page-{slug}.php و page-{id}.php امکان سفارشی‌سازی کامل برگه‌های خاص را می‌دهند، در حالی که is_page() در یک فایل مشترک امکان رفتار شرطی در سطح کد را فراهم می‌کند. لایه سوم لایه سئو است. برگه‌ها معمولاً به‌عنوان محتوای ایستا در سئو در نظر گرفته می‌شوند و ساختار URL آن‌ها معمولاً تخت است. اگر برگه‌ها سلسله‌مراتبی باشند، ساختار URL نیز سلسله‌مراتبی می‌شود و این روی Crawl Budget و ساختار سایت اثر می‌گذارد. لایه چهارم لایه کشینگ است. اگر برگه‌ای با محتوای شرطی کش شود، ممکن است بخش‌های شرطی برای همه کاربران یکسان نمایش داده شود. این موضوع به‌خصوص برای برگه‌هایی که محتوای متفاوتی برای اعضا و مهمان‌ها دارند، اهمیت دارد. برای مطالعه بیشتر روی محتوای شرطی کاربر، می‌توانید به راهنمای is_user_logged_in و راهنمای current_user_can مراجعه کنید. لایه پنجم لایه تست است. تست‌های End-to-End باید هم برگه ساده و هم برگه سلسله‌مراتبی را پوشش دهند. مفاهیم پایه‌ای صفحه وب در Web Page در ویکی‌پدیا توضیح داده شده است. در معماری Headless WordPress، این تابع در سمت بک‌اند اجرا می‌شود و فرانت‌اند از API استفاده می‌کند. باید دقت کرد که برگه‌ها از نوشته‌ها در پاسخ API تفکیک شوند. برای مطالعه درباره REST API به راهنمای register_rest_route مراجعه کنید.

پرسش‌های پرتکرار

تفاوت is_page و is_single چیست؟ is_page برگه‌ها را هدف می‌گیرد، در حالی که is_single نوشته‌ها را. آیا is_page در حلقه سفارشی کار می‌کند؟ خیر، این تابع تنها بر پایه کوئری اصلی کار می‌کند. چطور برگه فرزند را بررسی کنیم؟ با پاس دادن مسیر کامل مانند about/team. آیا is_page در فایل page.php زائد است؟ بله، چون این فایل تنها برای برگه‌ها بارگذاری می‌شود. چطور از is_page برای قالب اختصاصی استفاده کنیم؟ قالب اختصاصی معمولاً با فایل‌های page-{slug}.php پیاده می‌شود، نه با is_page. اما برای محتوای شرطی داخل قالب، is_page مناسب است.

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

تابع is_page() یک ابزار دقیق برای تشخیص برگه در وردپرس است. استفاده درست از آن یعنی درک دقیق تفاوت برگه و نوشته، استفاده صحیح از پارامترها، توجه به escape در خروجی و تست در محیط واقعی. هر اشتباه کوچک می‌تواند به نمایش نادرست محتوا یا تجربه ضعیف کاربر منجر شود. اگر این تابع را در پروژه‌ای واقعی به کار برده‌اید و رفتار غیرمنتظره‌ای دیده‌اید — به‌خصوص در Child Theme‌ها یا در ترکیب با کش — تجربه‌تان می‌تواند راهگشای دیگران باشد. کدام بخش بیشترین زمان را از شما گرفت؟ دیدگاه خود را بنویسید.