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

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

جستجو در وردپرس دقیقاً چگونه کار می‌کند؟

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

  1. ثبت فرم جستجو: کاربر عبارت مورد نظر را در فرم جستجو وارد می‌کند و مرورگر درخواستی به آدرس /?s=عبارت می‌فرستد.
  2. مسیریابی در وردپرس: وردپرس تشخیص می‌دهد که این درخواست، یک جستجو است و پارامتر s را در متغیرهای query ذخیره می‌کند.
  3. ساخت کوئری دیتابیس: وردپرس با استفاده از کلاس WP_Query، کوئری SQL می‌سازد که در جدول wp_posts و wp_postmeta جستجو می‌کند.
  4. اجرای کوئری: دیتابیس MySQL کوئری را اجرا و نتایج را برمی‌گرداند.
  5. رندر نتایج: قالب فعال، فایل search.php یا archive.php را فراخوانی می‌کند و لیست نتایج را نمایش می‌دهد.

هر اختلال در این پنج گام، به یک رفتار خاص منجر می‌شود. اگر وردپرس نتواند تشخیص دهد که درخواست جستجو است، به صفحه‌ی اصلی یا آرشیو ریدایرکت می‌کند. اگر کوئری دیتابیس با خطا مواجه شود، خطای ۵۰۰ نمایش داده می‌شود. اگر قالب فایل search.php را نداشته باشد، به index.php بازمی‌گردد. مباحث پایه‌ای ساختار وردپرس در وردپرس چیست و چگونه شروع کنیم باز شده است.

نکته‌ی مهمی که در پروژه‌های واقعی بارها دیده‌ام این است که مشکل جستجو می‌تواند هم از سمت URL و مسیریابی و هم از سمت دیتابیس بیاید. اگر جستجو به صفحه‌ی اصلی می‌رود یا خطای ۴۰۴ می‌دهد، ریشه در سمت URL است. اگر جستجو نتیجه می‌دهد ولی نتایج نادرست هستند، ریشه در سمت کوئری و دیتابیس است. تفکیک این دو، اولین گام در تشخیص است. مباحث مرتبط در ساختار URL و سئو باز شده است.

نکته‌ی دومی که در تجربه‌ی چندساله‌ام بسیار مهم بوده، تفاوت میان جستجوی پیش‌فرض وردپرس و جستجوی افزونه‌های پیشرفته است. افزونه‌هایی مثل Relevanssi، SearchWP یا Ivory Search، جستجوی پیش‌فرض را با الگوریتم‌های پیشرفته‌تر جایگزین می‌کنند. اگر این افزونه‌ها به‌درستی پیکربندی نشده باشند یا با سایر افزونه‌ها تضاد داشته باشند، رفتار جستجو کاملاً تغییر می‌کند. همین پیچیدگی، دلیل اصلی سردرگمی در عیب‌یابی این خطاست. مباحث مرتبط در پیدا کردن افزونه‌ی مشکل‌ساز وردپرس باز شده است.

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

انواع خطای جستجو و نشانه‌ی هرکدام

خطاهای جستجو در وردپرس، نشانه‌ها و پیام‌های متنوعی دارند که هرکدام به ریشه‌ی متفاوتی اشاره می‌کنند:

نشانه در سایتریشه‌ی احتمالیاقدام اولیه
جستجو هیچ نتیجه‌ای برنمی‌گرداندمشکل در پارامتر s یا کوئری دیتابیستست مستقیم URL جستجو
همه‌ی نوشته‌ها را برمی‌گرداندمشکل در شرایط کوئریبررسی فایل search.php قالب
جستجو به صفحه‌ی اصلی ریدایرکت می‌کندپیوندهای یکتا یا htaccessبازنشانی پیوندهای یکتا
جستجو خطای ۴۰۴ می‌دهدحذف search.php یا تغییر مسیربررسی قالب و htaccess
جستجو خطای ۵۰۰ می‌دهدمحدودیت حافظه یا خطای PHPبررسی لاگ PHP
جستجو با کلمه‌ای کار می‌کند و با کلمه‌ای نهمشکل در کوئری یا ایندکسبررسی collation دیتابیس
جستجو در موبایل کار نمی‌کندمشکل در CSS یا جاوااسکریپت قالببررسی DevTools در موبایل
جستجوی ووکامرس محصولات را پیدا نمی‌کندپیکربندی نادرست ووکامرسبررسی تنظیمات جستجوی ووکامرس
جستجو در بخش‌های خاصی از سایت خطا می‌دهدقالب اختصاصی یا افزونهغیرفعال‌سازی افزونه‌های مشکوک

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

دوازده ریشه‌ی اصلی کار نکردن جستجو

در عیب‌یابی مشکل جستجو روی سایت‌های وردپرسی، این دوازده ریشه بیش از بقیه تکرار می‌شوند:

ریشه‌ی اول: پیوندهای یکتا و بازنشانی ناقص

شایع‌ترین دلیل. اگر ساختار پیوندهای یکتا در وردپرس به‌درستی تنظیم نشده باشد یا قواعد rewrite در فایل .htaccess ناقص باشند، وردپرس نمی‌تواند درخواست جستجو را تشخیص دهد و به صفحه‌ی اصلی یا ۴۰۴ ریدایرکت می‌کند. این سناریو معمولاً بعد از مهاجرت سرور یا تغییر ساختار URL رخ می‌دهد. راه‌حل: بازنشانی پیوندهای یکتا از مسیر تنظیمات > پیوندهای یکتا و بازنشانی قواعد rewrite.

ریشه‌ی دوم: پارامتر s و ناسازگاری query string

وردپرس از پارامتر s برای جستجو استفاده می‌کند. اگر این پارامتر به‌دلیل تنظیمات نادرست، با پارامتر دیگری تداخل داشته باشد یا توسط یک افزونه حذف شود، جستجو کار نمی‌کند. این سناریو در سایت‌هایی که از افزونه‌های سفارشی‌سازی URL استفاده می‌کنند، شایع‌تر است.

ریشه‌ی سوم: حذف یا خرابی فایل search.php قالب

اگر فایل search.php در قالب فعال حذف شده باشد یا با خطای PHP مواجه شود، وردپرس نمی‌تواند نتایج جستجو را رندر کند. اگر قالب فایل search.php نداشته باشد، وردپرس از archive.php یا index.php استفاده می‌کند که ممکن است رفتار نادرست داشته باشد. راه‌حل: بررسی وجود فایل search.php در قالب و بازگرداندن آن از نسخه‌ی پیش‌فرض.

ریشه‌ی چهارم: تداخل افزونه‌های جستجو

افزونه‌هایی مثل Relevanssi، SearchWP یا Ivory Search، جستجوی پیش‌فرض وردپرس را جایگزین می‌کنند. اگر این افزونه‌ها به‌درستی پیکربندی نشده باشند یا با سایر افزونه‌ها تضاد داشته باشند، جستجو کار نمی‌کند. نشانه‌ی این سناریو: جستجو در پیش‌نمایش یا حالت مدیر کار می‌کند ولی برای کاربران عادی نه. راه‌حل: غیرفعال‌سازی افزونه و تست. مباحث مرتبط در پیدا کردن افزونه‌ی مشکل‌ساز وردپرس باز شده است.

ریشه‌ی پنجم: کش تهاجمی و پاسخ‌های قدیمی

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

ریشه‌ی ششم: کدگذاری ناسازگار دیتابیس

اگر کدگذاری (collation) جدول‌های دیتابیس به‌درستی تنظیم نشده باشد، جستجو ممکن است کاراکترهای خاص (به‌خصوص در فارسی) را پیدا نکرد. این سناریو در سایت‌هایی که دیتابیس آن‌ها بعد از مهاجرت با کدگذاری متفاوت بازسازی شده، شایع‌تر است. راه‌حل: بررسی collation جدول‌های دیتابیس و اصلاح آن به utf8mb4_unicode_ci. مباحث مرتبط در تأثیر دیتابیس بر سرعت سایت باز شده است.

ریشه‌ی هفتم: مشکل در ایندکس جدول wp_posts

اگر جدول wp_posts ایندکس مناسبی برای ستون‌های مربوط به جستجو (مثل post_title و post_content) نداشته باشد، جستجو به‌دلیل کوئری کند ممکن است Timeout بخورد یا نتیجه نادرست بدهد. راه‌حل: بررسی ایندکس‌های جدول و در صورت لزوم افزودن ایندکس‌های مناسب.

ریشه‌ی هشتم: محدودیت حافظه یا زمان اجرا

کوئری جستجو در سایت‌های بزرگ با محتوای زیاد می‌تواند سنگین باشد. اگر مقدار memory_limit یا max_execution_time پایین باشد، جستجو نیمه‌کاره متوقف می‌شود و خطای ۵۰۰ نمایش داده می‌شود. راه‌حل: افزایش این مقادیر. مباحث مرتبط در رفع خطای Maximum execution time در PHP باز شده است.

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

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

ریشه‌ی دهم: تداخل با صفحه‌سازها و بلوک‌های سفارشی

اگر محتوای سایت شما با صفحه‌سازها یا بلوک‌های سفارشی ساخته شده باشد، جستجوی پیش‌فرض وردپرس ممکن است محتوای این بلوک‌ها را ایندکس نکند. راه‌حل: استفاده از افزونه‌های جستجوی پیشرفته که محتوای بلوکی را هم ایندکس می‌کنند.

ریشه‌ی یازدهم: مشکل در قالب‌های اختصاصی search.php

اگر قالب سفارشی شما فایل search.php دارد که سفارشی‌سازی شده، ممکن است این فایل با منطق نادرست نوشته شده باشد و به‌جای نمایش نتایج، پیام اشتباهی نمایش دهد. راه‌حل: بررسی دقیق کد فایل و مقایسه با نسخه‌ی پیش‌فرض.

ریشه‌ی دوازدهم: مسدودسازی توسط افزونه‌های امنیتی

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

پروتکل واکنش سریع در بحران

اگر سایت شما همین حالا با خطای جستجو مواجه است و کاربران نمی‌توانند محتوای مورد نظر خود را پیدا کنند، این پنج حرکت را به همین ترتیب اجرا کنید:

  1. تعیین دامنه‌ی خطا: سریع تست کنید که آیا جستجو در همه‌ی صفحات غیب است یا فقط در بخشی. اگر جستجو به صفحه‌ی اصلی می‌رود، ریشه در پیوندهای یکتا است. اگر نتیجه می‌دهد ولی نادرست، ریشه در کوئری است.
  2. بازنشانی پیوندهای یکتا: از پیشخوان، مسیر تنظیمات > پیوندهای یکتا را باز کنید و بدون تغییر ساختار، روی دکمه‌ی ذخیره تغییرات بزنید. این کار قواعد rewrite را بازسازی می‌کند.
  3. پاک‌سازی کش: کش مرورگر، کش افزونه و کش CDN را پاک کنید.
  4. تست مستقیم URL جستجو: به آدرس https://yourdomain.com/?s=test بروید و ببینید که آیا نتایج نمایش داده می‌شود یا نه.
  5. غیرفعال‌سازی موقت افزونه‌های جستجو: اگر از افزونه‌ی جستجوی پیشرفته استفاده می‌کنید، موقتاً غیرفعال کنید و تست بگیرید.

نکته‌ی میدانی: در بحران، اول URL جستجو را مستقیم تست کنید. تجربه‌ی من نشان داده که در بیش از نیمی از موارد، مشکل در فرم جستجو یا CSS قالب است، نه در خود سیستم جستجو. اگر با URL مستقیم جستجو کار کرد، ریشه در فرم یا جاوااسکریپت است. اگر کار نکرد، ریشه در سیستم جستجو است.

تشخیص دقیق با ابزارها و کوئری‌ها

ابزارهای تشخیصی، دقیق‌ترین راه پیدا کردن ریشه‌ی خطای جستجو هستند. سه ابزار کلیدی:

DevTools مرورگر

در مرورگر، ابزار DevTools را باز کنید (کلید F12) و به تب Network بروید. فرم جستجو را پر کنید و درخواست را ارسال کنید. سه چیز را بررسی کنید:

  1. URL درخواستی: اگر URL با پارامتر s ارسال شده باشد ولی صفحه‌ی مقصد متفاوتی باز شود، ریشه در مسیریابی است.
  2. کد وضعیت پاسخ: اگر ۲۰۰ باشد ولی نتایج نمایش داده نشوند، ریشه در رندر قالب است. اگر ۴۰۴ یا ۵۰۰ باشد، ریشه در سرور است.
  3. محتوای پاسخ: در تب Response، بخشی از HTML نتایج را بررسی کنید. اگر خالی است، ریشه در کوئری دیتابیس است.

در تب Console، خطاهای JavaScript مربوط به فرم جستجو را بررسی کنید. اگر فرم جستجو با AJAX کار می‌کند و خطای JavaScript دیده می‌شود، ریشه در اسکریپت‌های قالب است. مباحث مرتبط در پیدا کردن خطاهای جاوااسکریپت در کنسول باز شده است.

کوئری‌های دیتابیس

چند کوئری می‌تواند در تشخیص کمک کند:

بررسی تنظیمات پیوندهای یکتا:

SELECT option_name, option_value FROM wp_options
WHERE option_name IN ('permalink_structure', 'rewrite_rules');

بررسی تعداد رکوردهای جدول wp_posts:

SELECT post_type, post_status, COUNT(*) as count
FROM wp_posts
GROUP BY post_type, post_status;

بررسی کدگذاری جدول‌های دیتابیس:

SHOW TABLE STATUS WHERE Name LIKE 'wp_%';

بررسی ایندکس‌های جدول wp_posts:

SHOW INDEX FROM wp_posts;

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

لاگ PHP و لاگ وردپرس

اگر خطای PHP در جستجو رخ دهد، در لاگ PHP ثبت می‌شود. برای فعال‌سازی، در wp-config.php مقادیر WP_DEBUG و WP_DEBUG_LOG را تنظیم کنید. لاگ در wp-content/debug.log ذخیره می‌شود. پیام‌هایی مثل Maximum execution time exceeded یا Allowed memory size exhausted در این لاگ دیده می‌شود. روش دقیق خواندن لاگ در بررسی خطاهای سرور در لاگ‌ها باز شده است.

پیوندهای یکتا، شایع‌ترین ریشه‌ی کار نکردن جستجو در وردپرس است. اگر قواعد rewrite در فایل .htaccess ناقص یا ناسازگار باشند، وردپرس نمی‌تواند درخواست جستجو را تشخیص دهد:

ساختار صحیح پیوندهای یکتا

وردپرس ساختارهای مختلفی برای پیوندهای یکتا پشتیبانی می‌کند. ساختار پیشنهادی من:

/%postname%/

این ساختار هم خوانا است و هم با سئو سازگار. توجه داشته باشید که بعد از تغییر ساختار پیوندهای یکتا، باید یک بار روی دکمه‌ی ذخیره تغییرات بزنید تا قواعد rewrite بازسازی شوند. مباحث مرتبط در ساختار URL و سئو باز شده است.

محتوای استاندارد htaccess برای وردپرس

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

اگر این قواعد ناقص باشند یا با قواعد افزونه‌های دیگر تضاد داشته باشند، جستجو ممکن است به خطای ۴۰۴ یا ریدایرکت به صفحه‌ی اصلی منجر شود. راه‌حل: بازنشانی این محتوا با نسخه‌ی استاندارد.

بازنشانی قواعد rewrite

اگر با بازنشانی پیوندهای یکتا از پیشخوان مشکل حل نشد، می‌توانید از طریق دیتابیس قواعد rewrite را بازنشانی کنید:

DELETE FROM wp_options WHERE option_name = 'rewrite_rules';

هشدار: این کوئری، قواعد rewrite را حذف می‌کند و وردپرس در بازدید بعدی پیشخوان آن‌ها را بازسازی می‌کند. قبل از اجرا، بکاپ دیتابیس بگیرید.

مشکل خاص: پیوندهای یکتا در Nginx

اگر سرور شما Nginx است، فایل .htaccess استفاده نمی‌شود. قواعد باید در فایل پیکربندی Nginx تعریف شوند:

location / {
    try_files $uri $uri/ /index.php?$args;
}

اگر این قاعده ناقص باشد، جستجو در سایت‌های روی Nginx کار نمی‌کند.

پارامترهای جستجو و query string

پارامتر s در URL جستجو، قلب سیستم جستجوی وردپرس است. اگر این پارامتر به‌دلیل تنظیمات نادرست، با پارامترهای دیگری تداخل داشته باشد یا حذف شود، جستجو کار نمی‌کند:

ساختار URL جستجو

آدرس‌های استاندارد جستجو در وردپرس:

  • https://yourdomain.com/?s=test: حالت ساده
  • https://yourdomain.com/search/test/: حالت pretty permalink

حالت pretty permalink به‌طور پیش‌فرض فعال نیست و باید با افزونه‌های سفارشی‌سازی URL یا کد سفارشی فعال شود. اگر فعال شده باشد ولی به‌درستی کار نکند، جستجو خطا می‌دهد.

مشکل خاص: پارامترهای اضافی در URL

گاهی افزونه‌هایی مثل افزونه‌های ردیابی، پارامترهای اضافی به URL جستجو اضافه می‌کنند و باعث می‌شوند وردپرس نتواند پارامتر s را تشخیص دهد. راه‌حل: بررسی URL خروجی فرم جستجو و اطمینان از اینکه پارامتر s حفظ می‌شود.

مشکل خاص: ناسازگاری با صفحه‌سازها

اگر فرم جستجو با صفحه‌ساز ساخته شده باشد، ممکن است پارامترهای نادرست ارسال شوند. راه‌حل: بررسی تنظیمات ویجت جستجو در صفحه‌ساز و اطمینان از اینکه پارامتر s به‌درستی تنظیم شده است.

مشکل خاص: پارامتر s در سایت‌های چندزبانه

در سایت‌های چندزبانه، جستجو ممکن است پارامتر اضافی زبان داشته باشد که باعث تداخل شود. راه‌حل: بررسی تنظیمات افزونه‌ی چندزبانه و اطمینان از اینکه پارامتر زبان با پارامتر s تداخل ندارد. مباحث مرتبط در ساخت سایت وردپرس چندزبانه باز شده است.

تداخل افزونه‌های جستجو و کش

افزونه‌های جستجو و کش، لایه‌ی بعدی ریشه‌های کار نکردن جستجو هستند:

افزونه‌های جستجوی پیشرفته

افزونه‌هایی مثل Relevanssi، SearchWP یا Ivory Search، جستجوی پیش‌فرض وردپرس را جایگزین می‌کنند. اگر این افزونه‌ها به‌درستی پیکربندی نشده باشند یا با افزونه‌های دیگر تضاد داشته باشند، جستجو کار نمی‌کند. راه‌حل: غیرفعال‌سازی موقت و تست. اگر جستجو با افزونه‌ی پیش‌فرض کار کرد، ریشه در افزونه‌ی جستجوی پیشرفته است.

افزونه‌های کش

افزونه‌های کش مثل WP Rocket یا LiteSpeed Cache، گاهی صفحات جستجو را هم کش می‌کنند. این رفتار باعث می‌شود کاربر همیشه نسخه‌ی اولیه را ببیند. راه‌حل: مستثنی کردن مسیر جستجو و پارامتر s از کش. مباحث مرتبط در بهترین افزونه‌های کش وردپرس باز شده است.

افزونه‌های امنیتی

افزونه‌های امنیتی مثل Wordfence یا Solid Security، گاهی درخواست‌های جستجو با کاراکترهای خاص را به‌عنوان تلاش برای SQL Injection مسدود می‌کنند. راه‌حل: بررسی لاگ افزونه‌ی امنیتی و سفید کردن درخواست‌های جستجو. مباحث مرتبط در افزونه‌های امنیتی وردپرس باز شده است.

افزونه‌های مدیریت فروشگاه

در فروشگاه‌های ووکامرس، افزونه‌های مدیریت فروشگاه ممکن است جستجو را بازنویسی کنند یا با جستجوی ووکامرس تضاد داشته باشند. راه‌حل: بررسی تنظیمات جستجوی ووکامرس و افزونه‌های مرتبط.

روش تشخیص افزونه‌ی مقصر

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

ایندکس دیتابیس و ساختار جدول wp_posts

دیتابیس، قلب جستجو در وردپرس است. اگر ایندکس‌ها یا کدگذاری جدول‌های دیتابیس نادرست باشند، جستجو ممکن است نتیجه نادرست بدهد یا اصلاً نتیجه ندهد:

ایندکس‌های ضروری جدول wp_posts

جدول wp_posts به‌طور پیش‌فرض ایندکس‌هایی دارد که برای جستجو کافی نیستند. برای بهینه‌سازی جستجو، ایندکس‌های اضافی روی ستون‌های post_title و post_content می‌توانند مفید باشند. راه‌حل:

ALTER TABLE wp_posts ADD FULLTEXT INDEX search_index (post_title, post_content);

توجه داشته باشید که FULLTEXT Index فقط روی موتور InnoDB و MyISAM کار می‌کند و برای بهره‌گیری از آن، باید کوئری‌های جستجو هم با MATCH ... AGAINST نوشته شوند. جستجوی پیش‌فرض وردپرس از FULLTEXT استفاده نمی‌کند. برای استفاده از این ایندکس، باید افزونه‌های جستجوی پیشرفته نصب کنید.

مشکل خاص: collation ناسازگار

اگر collation جدول‌های دیتابیس ناسازگار باشد، جستجوی کاراکترهای خاص (مثلاً کاراکترهای فارسی با اعراب) ممکن است نتیجه نادرست بدهد. راه‌حل: بررسی collation جدول‌ها و اصلاح آن به utf8mb4_unicode_ci:

ALTER TABLE wp_posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

قبل از اجرای این کوئری، بکاپ کامل دیتابیس بگیرید. مباحث مرتبط در تأثیر دیتابیس بر سرعت سایت باز شده است.

مشکل خاص: حجم جدول wp_posts

در سایت‌های بزرگ با تعداد زیادی نوشته، حجم جدول wp_posts می‌تواند بسیار بزرگ شود و جستجو کند شود. راه‌حل: پاک‌سازی رکوردهای اضافی، revisionهای قدیمی و ترنزینت‌ها. مباحث مرتبط در کاهش مصرف منابع هاست باز شده است.

مشکل خاص: query strings سنگین

کوئری جستجوی وردپرس به‌طور پیش‌فرض از LIKE %term% استفاده می‌کند که در سایت‌های بزرگ بسیار کند است. راه‌حل: استفاده از افزونه‌های جستجوی پیشرفته که از FULLTEXT یا ایندکس‌های سفارشی استفاده می‌کنند.

محدودیت‌های سرور و PHP

محدودیت‌های سرور و PHP می‌توانند به‌طور مستقیم روی کارکرد جستجو اثر بگذارند:

memory_limit

کوئری جستجو در سایت‌های بزرگ می‌تواند به حافظه‌ی زیادی نیاز داشته باشد. اگر مقدار memory_limit پایین باشد، اسکریپت نیمه‌کاره متوقف می‌شود. راه‌حل: افزایش این مقدار به ۲۵۶ مگابایت یا بیشتر:

memory_limit = 256M

max_execution_time

اگر کوئری جستجو طولانی باشد، ممکن است از سقف max_execution_time عبور کند و اسکریپت متوقف شود. راه‌حل: افزایش این مقدار به ۳۰۰ ثانیه یا بیشتر. مباحث مرتبط در رفع خطای Maximum execution time در PHP باز شده است.

max_input_vars و post_max_size

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

max_input_vars = 5000
post_max_size = 64M

محدودیت‌های سهمیه‌ی دیسک

اگر سهمیه‌ی دیسک هاست پر شده باشد، جستجو ممکن است به‌دلیل نبود فضای موقت برای ذخیره‌ی نتایج، شکست بخورد. راه‌حل: پاک‌سازی فایل‌های اضافی یا ارتقای پلن هاست. مباحث مرتبط در رفع خطای پرشدن هارد سرور باز شده است.

مشکل خاص: محدودیت زمان اجرا در هاست اشتراکی

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

در فروشگاه‌های ووکامرس، جستجو می‌تواند چالش‌های خاص خودش را داشته باشد:

مشکل خاص: جستجو فقط محصولات را با نام دقیق پیدا می‌کند

جستجوی پیش‌فرض وردپرس و ووکامرس، از الگوریتم LIKE استفاده می‌کند که فقط تطابق‌های دقیق را پیدا می‌کند. برای جستجوی هوشمندتر، باید از افزونه‌های جستجوی پیشرفته استفاده کنید یا SKU محصولات را در جستجو فعال کنید. مباحث مرتبط در سئو فروشگاه ووکامرس باز شده است.

مشکل خاص: جستجو در توضیحات محصول

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

مشکل خاص: جستجو در ویژگی‌های محصول

جستجوی پیش‌فرض ووکامرس، ویژگی‌های محصول (attributes) را در جستجو لحاظ نمی‌کند. اگر مشتری محصولی را با ویژگی خاصی جستجو کند، ممکن است نتیجه‌ای نگیرد. راه‌حل: فعال‌سازی جستجو در ویژگی‌ها از تنظیمات ووکامرس یا استفاده از افزونه‌های جستجوی پیشرفته.

مشکل خاص: جستجو در متغیرهای محصول

در محصولات متغیر، جستجو ممکن است متغیرها را پیدا نکند. راه‌حل: استفاده از افزونه‌های جستجوی پیشرفته که متغیرها را هم ایندکس می‌کنند.

مشکل خاص: ریدایرکت جستجو به صفحه‌ی فروشگاه

بعضی قالب‌های ووکامرس، جستجو را به صفحه‌ی فروشگاه ریدایرکت می‌کنند و نتایج را فیلتر می‌کنند. اگر این رفتار به‌درستی تنظیم نشده باشد، جستجو ممکن است نتایج نادرست بدهد. راه‌حل: بررسی تنظیمات قالب و ووکامرس.

جستجو در سایت‌های چندزبانه

در سایت‌های چندزبانه، جستجو پیچیده‌تر می‌شود و می‌تواند به مشکلات خاص منجر شود:

مشکل خاص: جستجو در همه‌ی زبان‌ها

به‌طور پیش‌فرض، جستجو در سایت‌های چندزبانه در تمام زبان‌ها انجام می‌شود و ممکن است نتایج نادرست بدهد. راه‌حل: تنظیم افزونه‌ی چندزبانه برای محدود کردن جستجو به زبان فعلی. مباحث مرتبط در ساخت سایت وردپرس چندزبانه باز شده است.

مشکل خاص: ناسازگاری با افزونه‌های چندزبانه

افزونه‌های چندزبانه مثل WPML یا Polylang، جستجو را بازنویسی می‌کنند تا نتایج را بر اساس زبان فیلتر کنند. اگر این بازنویسی با جستجوی پیش‌فرض وردپرس یا با افزونه‌ی جستجوی پیشرفته تضاد داشته باشد، جستجو کار نمی‌کند.

مشکل خاص: کاراکترهای غیرلاتین

در سایت‌های چندزبانه که شامل زبان‌های غیرلاتین (مثل فارسی، عربی، چینی) هستند، جستجو ممکن است به‌دلیل collation ناسازگار، کاراکترها را پیدا نکند. راه‌حل: بررسی collation جدول‌های دیتابیس و اصلاح آن به utf8mb4_unicode_ci.

بازگردانی جستجو و اولویت‌بندی

بعد از پیدا کردن ریشه، نوبت به بازگردانی جستجو می‌رسد. ترتیب اولویت‌بندی من در پروژه‌های واقعی:

  1. بازنشانی پیوندهای یکتا: اگر ریشه در URL است، از مسیر تنظیمات > پیوندهای یکتا و بدون تغییر، روی ذخیره بزنید.
  2. پاک‌سازی کش: کش مرورگر، کش افزونه و کش CDN را پاک کنید.
  3. غیرفعال‌سازی افزونه‌ی مقصر: اگر ریشه در افزونه است، موقتاً غیرفعال کنید و تست بگیرید.
  4. بررسی فایل search.php قالب: اگر ریشه در قالب است، فایل را بررسی و در صورت لزوم بازگردانید.
  5. افزایش محدودیت‌های PHP: اگر ریشه در محدودیت حافظه یا زمان اجرا است، مقادیر را افزایش دهید.
  6. بررسی collation دیتابیس: اگر ریشه در دیتابیس است، collation را اصلاح کنید.

پایش مستمر و پیشگیری

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

سطح اول: پایش دوره‌ای جستجو

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

سطح دوم: پایش خودکار با ابزارها

ابزارهایی مثل Uptime Robot می‌توانند مسیر جستجو را به‌طور دوره‌ای بررسی کنند و در صورت خطا هشدار دهند.

سطح سوم: پایش لاگ سرور

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

سطح چهارم: مستندسازی ساختار جستجو

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

سطح پنجم: بکاپ منظم قبل از تغییرات

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

پرسش‌های پرتکرار درباره خطای جستجو در وردپرس

چرا جستجو در وردپرس هیچ نتیجه‌ای برنمی‌گرداند؟

این الگو معمولاً به یکی از سه دلیل برمی‌گردد: پیوندهای یکتا نادرست تنظیم شده‌اند، پارامتر s در URL حفظ نمی‌شود، یا کوئری دیتابیس با خطا مواجه می‌شود. تست مستقیم URL جستجو با ?s=test، سریع‌ترین راه تشخیص است.

آیا افزونه‌های کش می‌توانند باعث کار نکردن جستجو شوند؟

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

چرا جستجو به صفحه‌ی اصلی ریدایرکت می‌کند؟

این الگو معمولاً به‌دلیل پیوندهای یکتا یا قواعد rewrite ناقص رخ می‌دهد. راه‌حل: بازنشانی پیوندهای یکتا از مسیر تنظیمات > پیوندهای یکتا و بررسی فایل .htaccess.

چرا جستجو با یک کلمه کار می‌کند و با کلمه‌ی دیگر نه؟

این الگو معمولاً به‌دلیل collation ناسازگار دیتابیس است. اگر کاراکترهای خاص (مثل فارسی با اعراب یا کاراکترهای خاص) در دیتابیس با کدگذاری نادرست ذخیره شده باشند، جستجو نمی‌تواند آن‌ها را پیدا کند. راه‌حل: بررسی collation جدول‌ها و اصلاح آن به utf8mb4_unicode_ci.

چرا جستجوی ووکامرس محصولات را پیدا نمی‌کند؟

سه دلیل رایج: جستجو فقط در عنوان و توضیح کوتاه انجام می‌شود، ویژگی‌های محصول در جستجو لحاظ نمی‌شوند، یا تنظیمات جستجوی ووکامرس نادرست است. راه‌حل: فعال‌سازی جستجو در توضیحات کامل و ویژگی‌ها از تنظیمات ووکامرس یا استفاده از افزونه‌های جستجوی پیشرفته. مباحث مرتبط در سئو فروشگاه ووکامرس باز شده است.

آیا خطای جستجو می‌تواند ناشی از هک شدن سایت باشد؟

در موارد نادر بله. اگر هکر فایل‌های جستجو را تغییر دهد یا جداول دیتابیس را دست‌کاری کند، ممکن است جستجو از کار بیفتد. برای اطمینان، روش تشخیص هک شدن سایت را بررسی کنید.

چطور جستجو را در سایت خودم تست کنم؟

سه روش ساده: اول، از فرم جستجوی سایت خود استفاده کنید. دوم، مستقیماً به URL ?s=test بروید. سوم، در پیشخوان وردپرس، بخش نوشته‌ها را باز کنید و از فیلد جستجوی بالای صفحه استفاده کنید. اگر جستجو در پیشخوان کار می‌کند ولی در سایت نه، ریشه در قالب یا URL است.

چرا جستجو فقط در موبایل کار نمی‌کند؟

این الگو معمولاً به‌دلیل مشکل در CSS یا JavaScript قالب موبایل است. فرم جستجو ممکن است به‌دلیل تنظیمات نامناسب ریسپانسیو، ارسال نشود. راه‌حل: بررسی DevTools در حالت موبایل و اطمینان از اینکه فرم به‌درستی ارسال می‌شود.

چطور جستجو را برای سایت‌های چندزبانه بهینه کنم؟

سه اقدام: اول، تنظیم افزونه‌ی چندزبانه برای محدود کردن جستجو به زبان فعلی. دوم، بررسی collation جدول‌های دیتابیس برای پشتیبانی از کاراکترهای غیرلاتین. سوم، استفاده از افزونه‌های جستجوی پیشرفته که با سایت‌های چندزبانه سازگار هستند.

آیا می‌توانم جستجو را در سایت خودم سفارشی‌سازی کنم؟

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

چرا جستجو در سایت‌های بزرگ کند است؟

کوئری جستجوی پیش‌فرض وردپرس از LIKE %term% استفاده می‌کند که در سایت‌های بزرگ بسیار کند است. راه‌حل: استفاده از افزونه‌های جستجوی پیشرفته که از FULLTEXT Index یا Elasticsearch استفاده می‌کنند. مباحث مرتبط در تأثیر دیتابیس بر سرعت سایت باز شده است.

نکته‌های میدانی از رفع خطای جستجو

در پایان این مقاله، چند نکته‌ای را می‌گویم که در مستندات رسمی کم‌تر به آن‌ها اشاره می‌شود ولی در پروژه‌های واقعی بارها به کارم آمده:

نخست: اولین قدم در عیب‌یابی جستجو، تست مستقیم URL است. تجربه‌ی من نشان داده که در بیش از نیمی از موارد، مشکل در فرم جستجو یا CSS قالب است، نه در سیستم جستجو. اگر با URL مستقیم جستجو کار کرد، ریشه در فرم یا جاوااسکریپت است. این تست ساده، در چند ثانیه مسیر عیب‌یابی را روشن می‌کند.

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

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

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

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