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

چرا تشخیص نوشته تکی اهمیت دارد؟

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

تابع is_single چیست؟

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

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

امضای این تابع به‌شکل زیر است:
function is_single( $post = '' ) {
    global $wp_query;
    return $wp_query->is_single( $post );
}
پارامتر ورودی می‌تواند از چند نوع باشد: - خالی: هر نوشته تکی را شامل می‌شود (هر پست تایپ عمومی به‌جز برگه) - عدد صحیح: شناسه (ID) نوشته - رشته: نامک (slug) نوشته - رشته با پیشوند پست تایپ: مانند book:my-book برای پست تایپ سفارشی - آرایه: فهرستی از شناسه‌ها یا نامک‌ها نکته مهم این است که اگر پارامتر رشته‌ای داده شود، وردپرس ابتدا آن را به‌عنوان slug تفسیر می‌کند. اگر بخواهید نوشته یک پست تایپ سفارشی را هدف بگیرید، باید از پیشوند استفاده کنید.

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

تابع is_single() در واقع یک میان‌بر (Wrapper) برای متد is_single() روی شیء جهانی $wp_query است. این متد در کلاس WP_Query تعریف شده و بررسی می‌کند که آیا کوئری فعلی مربوط به یک نوشته تکی است یا نه. وقتی کاربر یک نوشته را باز می‌کند، وردپرس با تجزیه URL و ساخت WP_Query، متغیر p یا name را در کوئری اصلی تنظیم می‌کند. اگر این مقدار معتبر باشد و نوع محتوا برگه یا پیوست نباشد، is_single() مقدار true برمی‌گرداند. نکته مهم دیگر این است که وردپرس برای نوشته تکی، فایل single.php را در اولویت اول قرار می‌دهد. اگر این فایل وجود نداشته باشد، از singular.php و در نهایت index.php استفاده می‌کند.

تفاوت is_single با is_page و is_singular

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

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

یکی از رایج‌ترین کاربردهای این تابع، اضافه کردن کلاس CSS اختصاصی به بدنه است:
add_filter( 'body_class', 'myplugin_body_classes' );
function myplugin_body_classes( $classes ) {
    if ( is_single() ) {
        $classes[] = 'single-post-layout';
    }
    return $classes;
}
تابع body_class در راهنمای body_class به تفصیل بررسی شده است. کاربرد دیگر، نمایش بخش‌های مرتبط فقط در نوشته تکی است. برای نمونه، می‌توانید بخش «نوشته‌های مرتبط» یا «درباره نویسنده» را شرطی کنید:
if ( is_single() ) {
    get_template_part( 'parts/related-posts' );
    get_template_part( 'parts/author-box' );
}
همچنین می‌توانید برای نوشته‌های یک دسته خاص، استایل متفاوتی اعمال کنید:
if ( is_single() && in_category( 'wordpress' ) ) {
    // کد فقط برای نوشته‌های دسته wordpress
}

بررسی پست تایپ سفارشی

در وردپرس، پست تایپ‌های سفارشی نیز می‌توانند از is_single() استفاده کنند. برای بررسی نوشته یک پست تایپ سفارشی خاص، از الگوی زیر استفاده کنید:
if ( is_single( 'my-book' ) ) {
    // کد برای نوشته‌ای با نامک my-book
}

if ( is_singular( 'book' ) ) {
    // کد برای هر نوشته از پست تایپ book
}
تفاوت مهم بین is_single() و is_singular() در این زمینه این است که اولی برای نوشته‌های پست تایپ پیش‌فرض `post`، و دومی برای هر نوع پست تایپی که از is_singular پشتیبانی می‌کند. برای مطالعه دقیق‌تر درباره پست تایپ سفارشی، می‌توانید به راهنمای register_post_type مراجعه کنید.

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

وردپرس برای نمایش نوشته تکی، سلسله‌مراتب قالب خاصی دارد. ابتدا بررسی می‌شود که آیا فایل single-{post_type}-{slug}.php وجود دارد (مثلاً single-book-my-book.php). سپس single-{post_type}.php، بعد single.php، بعد singular.php و در نهایت index.php بررسی می‌شوند. تابع is_single() در هر یک از این فایل‌ها می‌تواند استفاده شود، اما در فایل single.php بدون پارامتر، شرط زائد است. برای مطالعه دقیق‌تر درباره سلسله‌مراتب قالب، می‌توانید به راهنمای get_template_part مراجعه کنید.

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

اشتباه اول، نبود شرط مناسب است. اگر در فایل single.php از is_single() بدون پارامتر استفاده کنید، شرط زائد است. اما اگر در فایل مشترک مانند index.php یا singular.php استفاده می‌کنید، شرط ضروری است. اشتباه دوم، نبود بررسی نوع پست است. اگر بخواهید فقط برای یک پست تایپ خاص رفتار متفاوتی پیاده کنید، باید از is_singular() با پارامتر پست تایپ یا از get_post_type() استفاده کنید. اشتباه سوم، نبود escape در خروجی است. اگر عنوان یا محتوای نوشته را چاپ می‌کنید، باید از توابع escape مانند esc_html() و esc_attr() استفاده کنید. راهنمای این توابع در صفحه esc_html آمده است. اشتباه چهارم، نبود تست است. باید نوشته‌های پست تایپ‌های مختلف را در محیط staging تست کنید تا مطمئن شوید شرط‌ها به‌درستی عمل می‌کنند. اشتباه پنجم، استفاده از این تابع در حلقه سفارشی است. این تابع تنها برای حلقه اصلی معتبر است.

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

در نگاه مهندسی، تابع is_single() یک نقطه تصمیم (Decision Point) در لایه نمایش است که بر چند لایه معماری وردپرس اثر می‌گذارد. لایه اول لایه کوئری است. وردپرس با تجزیه URL و ساخت WP_Query، متغیر p، name یا post_type را تنظیم می‌کند. سپس متد is_single() بر اساس این متغیرها تصمیم می‌گیرد. لایه دوم لایه قالب است. سلسله‌مراتب قالب در نوشته‌ها امکان سفارشی‌سازی دقیق را برای هر پست تایپ و هر نوشته خاص فراهم می‌کند. این انعطاف در پروژه‌های بزرگ با پست تایپ‌های متعدد، ارزش بالایی دارد. لایه سوم لایه سئو است. نوشته‌ها معمولاً اصلی‌ترین محتوای سایت‌های محتوامحور هستند و به همین دلیل، بهینه‌سازی متا تگ‌ها، داده ساختاریافته و ساختار URL آن‌ها اهمیت بالایی دارد. برای مطالعه درباره داده ساختاریافته، می‌توانید به راهنمای Schema JSON-LD مراجعه کنید. لایه چهارم لایه کشینگ است. نوشته تکی معمولاً کش می‌شود و این کش می‌تواند عمر طولانی داشته باشد. اما اگر محتوای شرطی داشته باشد (مانند بخش دیدگاه‌ها)، باید استراتژی کش مناسب انتخاب شود. لایه پنجم لایه تست است. تست‌های End-to-End باید هم نوشته‌های پست تایپ پیش‌فرض و هم پست تایپ‌های سفارشی را پوشش دهند. مفاهیم پایه‌ای نوشته در Blog در ویکی‌پدیا توضیح داده شده است. در معماری Headless WordPress، این تابع در سمت بک‌اند اجرا می‌شود و فرانت‌اند باید بر اساس نوع نوشته، نمایش متفاوتی پیاده کند. برای مطالعه درباره REST API به راهنمای register_rest_route مراجعه کنید.

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

تفاوت is_single و is_singular چیست؟ is_single نوشته‌ها را هدف می‌گیرد، در حالی که is_singular هر دو نوشته و برگه را. تفاوت is_single و is_page چیست؟ is_single نوشته‌ها را هدف می‌گیرد و is_page برگه‌ها را. آیا is_single در حلقه سفارشی کار می‌کند؟ خیر، این تابع تنها بر پایه کوئری اصلی کار می‌کند. چطور نوشته یک پست تایپ سفارشی را بررسی کنیم؟ با is_singular( 'book' ) یا با پاس دادن نامک به is_single. آیا is_single در فایل single.php زائد است؟ بله، اما در فایل‌های مشترک ضروری است.

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

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