איך להסיר מוצרי ווקומרס מתוצאות החיפוש של וורדפרס

הנה תרחיש: באתר ה 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 עליו כתבתי פוסט נפרד. תנו מבט… 🙂

רועי יוסף
רועי יוסף

מפתח תבניות יעודייות על בסיס עיצוב. אוהב טיפוגרפיה, צבעים ומה שבינהם ומכוון לספק אתרים רספונסיבים עם ביצועים גבוהים, בעלי קוד ולידי, סמנטי ונקי.

  • עופר 11 במרץ 2021, 22:53

    מקומה של השורה הבאה צריך להיות לאחר הלופ – אין טעם לשים אותה בתוך הלופ ולחזור עליה עבור כל post_type

    $query->set( 'post_type', $in_search_post_types );
    • רועי יוסף 12 במרץ 2021, 17:46

      תכלס, הפוסט תוקן ותודה על הערנות עופר 🙂

  • רוב 14 במרץ 2021, 13:09

    מאמר נהדר.
    טוב שיש אותו בעברית, מצאתי את זה פעם באנגלית

השאירו תגובה

 

פעימות
Up!
לבלוג