اگر از سیستم مدیریت محتوای تایپچو (Typecho) استفاده میکنید، احتمالاً با مشکل عجیبی در بخش جستجوی سایت مواجه شدهاید: وقتی کاربر عبارتی مانند لورم ایپسوم را جستجو میکند، نتیجهای بازگردانده نمیشود، در حالی که دقیقاً همان عبارت در نوشتهها وجود دارد. علت این مشکل چیست؟ تایپچو در نسخههای قبل، هنگام انتقال کلمات جستجو به آدرس /search/[keywords]/، فاصلهها را حذف میکرد و عبارت لورم ایپسوم به لورمایپسوم تبدیل میشد. نتیجه: جستجوی مبهم و شکست خورده!
خوشبختانه این باگ با یک تغییر ساده در هسته رفع میشود. در ادامه، گام به گام راهحل را توضیح میدهیم تا جستجوی سایت شما دقیق و کارآمد شود.
🔍 مشکل دقیقاً چیست؟
در مسیر جستجوی داخلی تایپچو، عبارت وارد شده توسط کاربر از طریق پارامتر keywords به مسیر /search/.../ ارسال میشود. اما کد قدیمی از فیلتر 'url' استفاده میکرد که برای پاکسازی آدرسها طراحی شده و فاصلهها را حذف مینماید. نتیجه:
- عبارت
typecho cms→typechocms - عبارت
راهنمای فارسی→راهنمایفارسی - جستجوی فازی و چندکلمهای عملاً غیرفعال میشد.
این اشکال در تمام پایگاهدادههای MySQL، PostgreSQL و SQLite دیده میشد، چون مربوط به لایه پردازش ورودی بود نه کوئری نهایی.
🛠️ راهحل: اصلاح یک خط در فایل Archive.php
برای حفظ فاصلهها و بازگرداندن جستجوی هوشمند، باید فیلتر 'url' را حذف کنیم و عبارت جستجو را بهصورت خام (plain text) دریافت کنیم. تنها کافیست فایل زیر را ویرایش نمایید:
خط تقریبی: 2070
قبل از تغییر (کد قدیمی و مشکلدار):
$keywords = $this->request->filter('url', 'search')->get('keywords');
بعد از تغییر (کد صحیح):
$keywords = $this->request->filter('search')->get('keywords');
با این کار، عبارت جستجو بدون حذف فاصلهها به مرحله ساخت کوئری SQL ارسال میشود و جستجوی فازی (مانند LIKE '%lorem ipsum%') به درستی کار میکند.
📝 آموزش گام به گام تغییر
- از فایل
var/Widget/Archive.phpیک پشتیبان تهیه کنید. - فایل را با یک ویرایشگر متن (مانند Notepad++، VS Code یا حتی nano در سرور) باز کنید.
- به خط شماره 2070 (ممکن است در نسخههای مختلف کمی جابجا شود) بروید. برای یافتن دقیقتر، عبارت
filter('url', 'search')را جستجو کنید. - خط را دقیقاً به شکل بالا تغییر دهید.
- فایل را ذخیره کنید و کش سیستم (در صورت وجود) را پاک کنید.
📊 چرا این تغییر مؤثر است؟
- حذف فیلتر اضافی URL: فیلتر
'url'فاصلهها را با%20یا حذف کامل جایگزین میکرد. - دریافت مقدار خام: فیلتر
'search'فقط امنیت پایه (مانند جلوگیری از XSS) را اعمال میکند بدون تخریب فاصلهها. - سازگاری با همه پایگاهدادهها: کوئری نهایی بدون تغییر باقی میماند، فقط ورودی سالم میشود.
- رفع مشکل قدیمی: این باگ از نسخه 1.2 به بعد گزارش شده بود.
✅ نتیجه و تست
پس از اعمال تغییر، جستجوی عبارات چندکلمهای مانند آموزش typecho یا قالب رایگان نتایج دقیقتری نمایش میدهد. برای اطمینان، مراحل زیر را انجام دهید:
- 🔎 عبارتی با فاصله (مثلاً «بهینهسازی سرعت») را جستجو کنید.
- 🧪 آدرس تولید شده را بررسی کنید: باید شبیه
/search/بهینهسازی سرعت/باشد (فاصله حفظ شده). - 📋 در پایگاهدادههای MySQL یا SQLite، خروجی جستجو حاوی مطالب مرتبط خواهد بود.
⚠️ نکات مهم
- ✅ این تغییر در تایپچو نسخههای 1.2، 1.3 و حتی 1.4 (در صورت انتشار) قابل اعمال است.
- ✅ با تمامی قالبهای استاندارد و افزونههای جستجو سازگار است.
- ✅ اگر از کش دینامیک (مثل Memcached) استفاده میکنید، پس از تغییر کش را ریست کنید.
- ✅ پیشنهاد میشود برای بهروزرسانیهای بعدی تایپچو، این تغییر را دوباره اعمال کنید (ممکن است هسته بازنویسی شود).
💡 یادداشت نهایی: این تغییر یک «هاتفیکس» ساده اما حیاتی برای هر سایت تایپچو است که به جستجوی دقیق نیاز دارد. اگر مدیر سایت هستید، همین امروز این اصلاح را اعمال کنید.