הנה תרחיש: באתר ה E-Commerce שלכם יש מוצרים, פוסטים בבלוג ועמודים. אתם מעוניינים להגביל את תוצאות החיפוש או למוצרים או לפוסטים, וזאת בהתאם להיכן מתבצע החיפוש בפועל (למשל מאיזה ווידג׳ט חיפוש בוצעה הפעולה).
לצערינו ווידג׳ט החיפוש של וורדפרס יזהה ויציג גם את המוצרים וגם את הפוסטים בעמוד תוצאות החיפוש, סיטואציה היכולה לבלבל את הלקוח כשהוא מחפש מוצר אך מקבל גם כן תוצאות של פוסטים בהם קיימת המחרוזת אותה הוא חיפש.
במדריך זה נלמד כיצד להשתמש בווידג׳טים שונים עבור חיפוש מוצרים ועבור חיפוש של פוסטים, ונראה כיצד להסיר את המוצרים של ווקומרס מתוצאות החיפוש של וורדפרס.
ההבדל בין ווידג׳ט ה החיפוש של וורדפרס וזה של ווקומרס
גם וורדפרס וגם ווקומרס מגיעות כברירת מחדל עם ווידג׳ט חיפוש משלהן. אלו ווידג׳טים נפרדים הפועלים פונקציונלית באופן עצמאי אחד מהשני. הנה ההבדלים העיקריים:
- ווידג׳ט החיפוש של ווקומרס יחזיר מוצרים התואמים את קריטריון החיפוש. כלומר בתוצאות החיפוש יופיעו אך ורק מוצרים מהחנות.
- ווידג׳ט החיפוש של וורדפרס לעומת זאת יחזיר תוצאות מכל סוגי התוכן (Post Types) ומוצרים בחנות אינם יוצאים מן הכלל. ווידג׳ט זה יחפש בכל סוג פוסט (סוג תוכן) ויציג תוצאות של פוסטים, מוצאים, עמודים וכדומה ללא יוצא מן הכלל.
אנו כמובן מעוניינים להגיע למצב בו ווידג׳ט החיפוש הסטנדרטי של וורדפרס אינו מחזיר מוצרים כלל בתוצאות החיפוש כשנשתמש בווידג׳ט זה עבור חיפוש כזה או אחר.
הפרדת תוצאות החיפוש לפי סוג התוכן
הפתרון המאפשר לזהות את סוג התוכן שיהיה בשימוש בתוצאות החיפוש הוא יצירת פונקציה שמבצעת הוק לפונקציה pre_get_posts.
מכיוון וווידג׳ט החיפוש של ווקומרס כבר מוגדר בכדי להחזיר אך ורק מוצרים מהחנות, מה שעלינו לשנות הוא את השאילתא המתבצעת בווידג׳ט החיפוש הדיפולטיבי של וורדפרס עצמה.
על כל מקרה, הוסיפו את שני הווידג׳טים המדוברים היכן שתרצו באתר שלכם. הגיוני יהיה כי ווידג׳ט החיפוש של ווקומרס יוצג בעמוד החנות ווידג׳ט החיפוש הסטנדרטי של וורדפרס בעמוד הבלוג. הם נראים כך:
לאחר שהוספתם את שני הווידג׳טים, הוסיפו את הקוד הבא לקובץ functions.php
של התבנית שלכם:
<?php
/**
* Remove WooCommerce product and WordPress page results from the search form widget
*/
function sv_modify_search_query( $query ) {
// Make sure this isn't the admin or is the main query
if( is_admin() || ! $query->is_main_query() ) {
return;
}
// Make sure this isn't the WooCommerce product search form
if( isset($_GET['post_type']) && ($_GET['post_type'] == 'product') ) {
return;
}
if( $query->is_search() ) {
$in_search_post_types = get_post_types( array( 'exclude_from_search' => false ) );
// The post types you're removing (example: 'product' and 'page')
$post_types_to_remove = array( 'product', 'page' );
foreach( $post_types_to_remove as $post_type_to_remove ) {
if( is_array( $in_search_post_types ) && in_array( $post_type_to_remove, $in_search_post_types ) ) {
unset( $in_search_post_types[ $post_type_to_remove ] );
}
}
$query->set( 'post_type', $in_search_post_types );
}
}
add_action( 'pre_get_posts', 'sv_modify_search_query' );
שימו לב כי אינכם מוסיפים את תגית ה PHP הפותחת בקוד המצורף!
באפשרותכם לשלוט איזה סוגי פוסטים (Post Types) יוסרו מתוצאות החיפוש הסטנדרטיות של וורדפרס בשורה מספר 20. במקרה שלנו הסרנו את סוג התוכן product ואת סוג התוכן page.
אם אתם רוצים לראות את הקוד המדובר בפעולה – תנו מבט בחנות שפיתחתי לדוגמה וחפשו את המילה שעון למשל בווידג׳ט ״חיפוש מוצר״ ולאחר מכן בווידג׳ט ״חיפוש בבלוג״ ותראו שהתוצאות שונות.
לסיכום
אם אינכם מעוניינים לגעת בקוד, התוסף החינמי Search Exclude נגיש עבורכם בחינם ויאפשר לכם להסיר סוגי תוכן ספציפיים מתוצאות החיפוש הסטנדרטיות של וורדפרס. באפשרותכם לגלות את כל שמות סוגי התוכן הרשומים באתר שלכם באמצעות הפונקציה get_post_types.
זה המקום לציין כי אתם יכולים לשדרג את מנגנון החיפוש של וורדפרס באמצעות תוסף נפלא הנקרא Relevanssi עליו כתבתי פוסט נפרד. תנו מבט… 🙂
מקומה של השורה הבאה צריך להיות לאחר הלופ – אין טעם לשים אותה בתוך הלופ ולחזור עליה עבור כל post_type…
תכלס, הפוסט תוקן ותודה על הערנות עופר 🙂
מאמר נהדר.
טוב שיש אותו בעברית, מצאתי את זה פעם באנגלית
כשמחפשים מוצר באתר שלי (יש לי את התוסף Relevanssi והוא מעולה) אםהמוצר עם גרש נניח צ'יה האתר לא מוצא. ניסיתי לסדר בהגדרות..לא עזר. אשמח לעזרה.
תודה על כל המאמרים הנהדרים, עידית
היי, האם את משתמשת בגירסת ה Premium של Relevanssi?
אם כן, צריך להיות בהגדרות המתקדמות תחת Indexing את האפשרות Apostrophes and quotes – Remove, נסי את זה… (אולי זה קיים גם ב Relevanssi החינמי אך אני בספק)
זה קיים גם בחינמי.
סימנתי.. לא עובד..
את צריכה ליצור מחדש את האינדקס לאחר הפעולה.
אתה יכול בבקשה לפרט. למה הכוונה?
גשי ללשונית Indexing ולחצי על הכפתור Build The Index.
ממש תודה. עובד!
מעולה! 🙂