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

چرا تشخیص صفحه جستجو اهمیت دارد؟

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

تابع is_search چیست؟

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

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

امضای این تابع به‌شکل زیر است:
function is_search() {
    global $wp_query;
    return $wp_query->is_search();
}
این تابع هیچ پارامتر ورودی نمی‌گیرد و تنها یک مقدار بولی برمی‌گرداند. برای بررسی عبارت جستجو شده یا تعداد نتایج، باید از توابع دیگر استفاده کرد.

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

تابع is_search() در واقع یک میان‌بر (Wrapper) برای متد is_search() روی شیء جهانی $wp_query است. این متد در کلاس WP_Query تعریف شده و بررسی می‌کند که آیا متغیر s (Search Query Variable) در کوئری فعلی مقدار داشته باشد. وقتی کاربر فرم جستجو را ارسال می‌کند، وردپرس یک کوئری با پارامتر s می‌سازد. اگر این پارامتر خالی نباشد، is_search() مقدار true برمی‌گرداند. اگر پارامتر خالی باشد، وردپرس معمولاً کاربر را به صفحه اصلی هدایت می‌کند. نکته مهم دیگر این است که وردپرس برای صفحه جستجو، فایل search.php را در اولویت اول قرار می‌دهد. اگر این فایل وجود نداشته باشد، از archive.php و در نهایت index.php استفاده می‌کند. برای مطالعه درباره سلسله‌مراتب قالب، می‌توانید به راهنمای get_template_part مراجعه کنید.

تفاوت is_search با سایر توابع شرطی

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

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

یکی از رایج‌ترین کاربردهای این تابع، نمایش پیام مناسب در بالای نتایج است. می‌توانید عبارت جستجو و تعداد نتایج را به کاربر نشان دهید:
if ( is_search() ) {
    $search_query = get_search_query();
    $results_count = $wp_query->found_posts;
    echo '

' . sprintf( esc_html__( '%1$s نتیجه برای "%2$s" یافت شد', 'textdomain' ), number_format_i18n( $results_count ), esc_html( $search_query ) ) . '

'; }
توجه داشته باشید که استفاده از esc_html() برای جلوگیری از حملات XSS ضروری است. راهنمای این تابع در صفحه esc_html آمده است. کاربرد دیگر، اضافه کردن کلاس CSS اختصاصی به بدنه است:
add_filter( 'body_class', 'myplugin_body_classes' );
function myplugin_body_classes( $classes ) {
    if ( is_search() ) {
        $classes[] = 'search-results-page';
    }
    return $classes;
}
تابع body_class در راهنمای body_class به تفصیل بررسی شده است.

دسترسی به عبارت جستجو شده

برای دسترسی به عبارت جستجو شده، از تابع get_search_query() استفاده کنید. این تابع به‌صورت خودکار عبارت را از کوئری استخراج می‌کند و در صورت نیاز، آن را فیلتر می‌کند.
$query = get_search_query();
echo esc_html( $query );
برای دسترسی به مقدار خام (Raw) و بدون فیلتر، از get_query_var( 's' ) استفاده کنید. اما توجه داشته باشید که این مقدار خام ممکن است شامل کاراکترهای خطرناک باشد و باید حتماً escape شود.

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

اشتباه اول، نبود شرط مناسب در قالب است. اگر در فایل search.php از is_search() استفاده کنید، این شرط زائد است، اما اگر در archive.php مشترک استفاده شود، شرط ضروری است. اشتباه دوم، نبود بررسی query است. اگر بخواهید بر اساس عبارت جستجو، رفتار متفاوتی پیاده کنید، باید هم is_search() و هم get_search_query() را بررسی کنید. اشتباه سوم، چاپ مستقیم عبارت جستجو بدون escape است. این کار می‌تواند به حمله XSS منجر شود. اشتباه چهارم، نبود تست است. باید صفحه جستجو را با عبارت‌های مختلف (شامل فارسی، انگلیسی و کاراکترهای خاص) تست کنید. اشتباه پنجم، استفاده از این تابع در حلقه سفارشی است. تابع is_search() تنها برای حلقه اصلی معتبر است.

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

در نگاه مهندسی، تابع is_search() یک نقطه تصمیم (Decision Point) در لایه نمایش است که هم بر منطق قالب و هم بر تجربه کاربر اثر می‌گذارد. لایه اول لایه کوئری است. وردپرس با تجزیه URL و ساخت WP_Query، متغیر s را در کوئری اصلی تنظیم می‌کند. سپس is_search() بر اساس این متغیر تصمیم می‌گیرد. لایه دوم لایه قالب است. فایل search.php اگر وجود داشته باشد، ابتدا بارگذاری می‌شود، سپس archive.php و در نهایت index.php. تابع is_search() در هر یک از این فایل‌ها می‌تواند رفتار شرطی ایجاد کند. لایه سوم لایه کشینگ است. صفحه نتایج جستجو معمولاً نباید کش شود، چرا که برای هر عبارت جستجو، نتیجه متفاوتی وجود دارد. این نکته در تنظیمات افزونه‌های کش و CDN باید رعایت شود. لایه چهارم لایه امنیت است. عبارت جستجو مستقیماً از ورودی کاربر می‌آید و باید به‌درستی اعتبارسنجی و escape شود. علاوه بر این، حملات تزریق SQL و XSS از طریق پارامتر s باید در نظر گرفته شود. لایه پنجم لایه سئو است. صفحه‌های نتایج جستجو معمولاً نباید ایندکس شوند چرا که محتوای تکراری و نازک ایجاد می‌کنند. افزونه‌های سئو معمولاً امکان noindex این صفحات را فراهم می‌کنند. برای مطالعه بیشتر روی این موضوع، می‌توانید به راهنمای سئوی صفحه‌بندی مراجعه کنید. در پروژه‌های Headless WordPress، این تابع در سمت بک‌اند اجرا می‌شود و فرانت‌اند ممکن است از یک موتور جستجوی متفاوت (مانند Algolia یا Elasticsearch) استفاده کند. با این حال، در REST API می‌توان از این تابع برای تعیین نوع پاسخ استفاده کرد. برای مطالعه بیشتر درباره REST API به راهنمای register_rest_route مراجعه کنید. مفاهیم پایه جستجو در Web Search Engine در ویکی‌پدیا توضیح داده شده است.

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

تفاوت is_search و is_archive چیست؟ is_archive هر نوع آرشیو را شامل می‌شود، اما is_search فقط صفحه نتایج جستجو را. آیا is_search در حلقه سفارشی کار می‌کند؟ خیر، این تابع تنها بر پایه کوئری اصلی کار می‌کند. آیا می‌توان صفحه جستجو را از ایندکس خارج کرد؟ بله، با استفاده از افزونه‌های سئو یا کد سفارشی در header.php. چطور به عبارت جستجو دسترسی پیدا کنیم؟ با get_search_query() یا get_query_var( 's' ). آیا می‌توان صفحه جستجو را سفارشی کرد؟ بله، با ساخت فایل search.php در قالب یا Child Theme.

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

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