
חיפוש לפי מיקום הוא היכולת של אתר להציג תוצאות לפי קרבה למקום מסוים — "נותני שירות קרובים אליי", "צימרים ברדיוס 20 ק"מ", "סניף קרוב". באינדקסים, באתרי נדל"ן ובאתרי איתור סניפים זה לרוב החיפוש החשוב ביותר. מאחורי שורת חיפוש פשוטה עומדות כמה החלטות: מאיפה מגיע מיקום הגולש, איך שומרים את מיקום העסקים, ואיך מחשבים מרחק בלי להאט את האתר.
שלוש דרכים לדעת איפה הגולש
| דרך | דיוק | הערות |
|---|---|---|
| הגולש בוחר עיר או כותב כתובת | לפי מה שבחר | הדרך הכי צפויה וברורה; עובדת תמיד |
| מיקום מהדפדפן (Geolocation API) | גבוה, בעיקר במובייל | דורש HTTPS ואישור מפורש של הגולש |
| הערכה לפי כתובת IP | נמוך — לרוב עיר או אזור | טוב לברירת מחדל, לא לחיפוש "קרוב אליי" |
לפי התיעוד של MDN, ה-Geolocation API זמין רק בהקשר מאובטח (HTTPS), והדפדפן מבקש מהגולש אישור מפורש לפני שהוא מוסר מיקום. לכן אף פעם לא מבקשים מיקום מיד בכניסה לאתר. מבקשים רק כשהגולש לוחץ על "קרוב אליי" — אז הוא מבין למה, וסיכוי האישור גבוה יותר. ותמיד יש חלופה: בחירת עיר ידנית למי שסירב.
איך שומרים מיקום של עסקים
לכל עסק נשמרות קואורדינטות — קו רוחב וקו אורך — במסד הנתונים. ההמרה מכתובת לקואורדינטות (Geocoding) נעשית פעם אחת, כשהעסק נרשם או מעדכן כתובת, ולא בכל חיפוש. זה חוסך קריאות לשירות חיצוני ועלויות — ראו מפה באתר.
לעסקים שנותנים שירות בבית הלקוח (גרירה, שיפוצים, טכנאים) מיקום אחד לא מספיק. שם צריך לשמור אזורי שירות: רשימת ערים, אזורים, או רדיוס מנקודת בסיס. החיפוש אז שואל "מי משרת את המיקום הזה", ולא רק "מי קרוב אליו".
חישוב מרחק: בשרת, עם אינדקס
את המרחק מחשבים בשרת, במסד הנתונים — לא בדפדפן על כל העסקים. ב-MySQL, למשל, יש פונקציה מובנית ST_Distance_Sphere, שלפי התיעוד מחזירה את המרחק המינימלי בין שתי נקודות על פני כדור, במטרים:
SELECT id, name, ST_Distance_Sphere(location, POINT(34.887, 32.087)) AS meters FROM businesses WHERE category_id = 12 HAVING meters <= 20000 ORDER BY meters LIMIT 20;
שימו לב לסדר: בנקודה הזו קו האורך (longitude) בא לפני קו הרוחב (latitude). זו טעות נפוצה שמזיזה עסקים לצד השני של העולם.
בכמות קטנה של עסקים חישוב כזה מהיר. בעשרות אלפי רשומות כדאי קודם לצמצם — למשל לסנן "קופסה" של קואורדינטות סביב הנקודה עם אינדקס, ורק אז לחשב מרחק מדויק. מסדי נתונים רבים תומכים גם באינדקסים מרחביים ייעודיים. על ביצועים של מסד נתונים בוורדפרס כתבתי במאמר אופטימיזציה למסד נתונים.
חוויית המשתמש בחיפוש לפי מיקום
- להציג מרחק ליד כל תוצאה ("3.2 ק"מ"), ולאפשר מיון לפי מרחק.
- להגדיל רדיוס כשאין תוצאות — במקום "לא נמצאו תוצאות", להציע "לא מצאנו בטווח 10 ק"מ, הנה תוצאות עד 25 ק"מ".
- לשלב עם סינונים — מרחק יחד עם קטגוריה, זמינות ושירותים.
- רשימה קודם, מפה כאופציה — במובייל רשימה מהירה יותר ונוחה יותר מגלילה במפה.
חיפוש "קרוב אליי" ועמודים שגוגל סורקת
תוצאות שמחושבות לפי מיקום הגולש הן דינמיות — אין להן כתובת קבועה, וגוגל לא יכולה לסרוק אותן. לכן אינדקס צריך גם עמודים קבועים לפי עיר וקטגוריה, שמציגים את אותם עסקים בצורה סטטית. החיפוש הדינמי משרת את מי שכבר באתר; דפי הערים משרתים את מי שמגיע מגוגל. ואת כתובות החיפוש עצמן לא פותחים לאינדוקס — ראו חיפוש באתר.
פרטיות
מיקום מדויק של גולש הוא מידע רגיש. לא שומרים אותו אם אין צורך, לא שולחים אותו לכלי מדידה, ומשתמשים בו רק לחיפוש שהגולש ביקש. אם בכל זאת שומרים — מציינים זאת במדיניות הפרטיות.
שאלות נפוצות
למה הדפדפן לא מבקש ממני מיקום באתר שלי?
בדרך כלל כי האתר לא ב-HTTPS, או כי הגולש כבר חסם את ההרשאה בעבר. ה-API זמין רק בהקשר מאובטח.
אפשר לבנות חיפוש לפי מיקום בוורדפרס?
כן. שומרים קואורדינטות כשדות לכל עסק, ומבצעים את החישוב בשאילתה בשרת. בהיקף גדול עדיף טבלה ייעודית עם אינדקס מתאים.
מיקום לפי IP מספיק?
לברירת מחדל של עיר — לפעמים. ל"קרוב אליי" אמיתי — לא.
חיפוש לפי מיקום, אזורי שירות ומפות הם חלק מבניית פורטלים ואינדקסים שאני עושה. צריכים חיפוש כזה באתר? ספרו לי מה מחפשים בו.
אהבתם את המאמר?


