0

I created an installation of my multisite ecommerce to differentiate the men's and women's departments. Often, however, it happens that in the men's department they do research related to women's articles or vice versa. Consequently, my site says it cannot find an article, obviously it is not so. How can I implement a global search function? I tried with switch_to_blog on this function that I paste, unfortunately I can't make it go. Could anyone help me out? This is code i tried...but DIE does it stop and work only on site 1...any ideas? Thanks in advance

 switch_to_blog(1);
    $results = new WP_Query( apply_filters( 'basel_ajax_search_args', $query_args ) );

    if ( basel_get_opt( 'relevanssi_search' ) && function_exists( 'relevanssi_do_query' ) ) {
        relevanssi_do_query( $results );
    }

    $suggestions = array();

    if ( $results->have_posts() ) {

        if ( $post_type == 'product' && basel_woocommerce_installed() ) {
            $factory = new WC_Product_Factory();
        }

        while ( $results->have_posts() ) {
            $results->the_post();

            if ( $post_type == 'product' && basel_woocommerce_installed() ) {
                $product = $factory->get_product( get_the_ID() );

                $suggestions[] = array(
                    'value' => get_the_title(),
                    'permalink' => get_the_permalink(),
                    'price' => $product->get_price_html(),
                    'thumbnail' => $product->get_image(),
                    'sku' => $product->get_sku() ? esc_html__( 'SKU:', 'basel' ) . ' ' . $product->get_sku() : '',
                );
            } else {
                $suggestions[] = array(
                    'value' => get_the_title(),
                    'permalink' => get_the_permalink(),
                    'thumbnail' => get_the_post_thumbnail( null, 'medium', '' ),
                );
            }
        }

        wp_reset_postdata();
        restore_current_blog();
    } else {
        $suggestions[] = array(
            'value' => ( $post_type == 'product' ) ? esc_html__( 'No products found', 'basel' ) : esc_html__( 'No posts found', 'basel' ),
            'no_found' => true,
            'permalink' => ''
        );
    }

    switch_to_blog(2);
    $results = new WP_Query( apply_filters( 'basel_ajax_search_args', $query_args ) );

    if ( basel_get_opt( 'relevanssi_search' ) && function_exists( 'relevanssi_do_query' ) ) {
        relevanssi_do_query( $results );
    }

    //$suggestions = array();

    if ( $results->have_posts() ) {

        if ( $post_type == 'product' && basel_woocommerce_installed() ) {
            $factory = new WC_Product_Factory();
        }

        while ( $results->have_posts() ) {
            $results->the_post();

            if ( $post_type == 'product' && basel_woocommerce_installed() ) {
                $product = $factory->get_product( get_the_ID() );

                $suggestions[] = array(
                    'value' => get_the_title(),
                    'permalink' => get_the_permalink(),
                    'price' => $product->get_price_html(),
                    'thumbnail' => $product->get_image(),
                    'sku' => $product->get_sku() ? esc_html__( 'SKU:', 'basel' ) . ' ' . $product->get_sku() : '',
                );
            } else {
                $suggestions[] = array(
                    'value' => get_the_title(),
                    'permalink' => get_the_permalink(),
                    'thumbnail' => get_the_post_thumbnail( null, 'medium', '' ),
                );
            }
        }

        wp_reset_postdata();
        restore_current_blog();
    } else {
        $suggestions[] = array(
            'value' => ( $post_type == 'product' ) ? esc_html__( 'No products found', 'basel' ) : esc_html__( 'No posts found', 'basel' ),
            'no_found' => true,
            'permalink' => ''
        );
    }

     //$my_array2 = array('suggestions' => $suggestions);
     //$my_array1 = array('suggestions' => $suggestions1);
     //$res = array_merge($my_array2, $my_array1); 
    // echo json_encode($res);
    echo json_encode(array('suggestions' => $suggestions));

die(); 
}
0

2 Answers 2

0

New in stackexchange, I cannot comment until I had 50 reputation.

We are in the same theme developer. I found this topic can help you. I am testing it - WooCommerce multisite global search. But both site was newly installed with same product data (name, price, same product category, same theme). You may try it.

OPTION 1

before this line

$results = new WP_Query( apply_filters( 'basel_ajax_search_args', $query_args ) );

Add

// in this variable you can pass all the blog IDs you would like to display posts from
$blog_ids = array( 1, 2, 3, 4, 5 );

foreach( $blog_ids as $id ) {

    switch_to_blog( $id );

And

after this line

wp_reset_postdata();

Add

        restore_current_blog();

And

after this 2 line

die();

}

Add

}

Try it with local host or Staging OR Backup your website before try.

I am trying it in my theme's search.php

/**
 * ------------------------------------------------------------------------------------------------
 * Ajax search
 * ------------------------------------------------------------------------------------------------
 */
if ( ! function_exists( 'woodmart_init_search_by_sku' ) ) {
    function woodmart_init_search_by_sku() {
        if ( apply_filters( 'woodmart_search_by_sku', woodmart_get_opt( 'search_by_sku' ) ) && woodmart_woocommerce_installed() ) {
            add_filter( 'posts_search', 'woodmart_product_search_sku', 9 );
        }
    }

    add_action( 'init', 'woodmart_init_search_by_sku', 10 );
}

if ( ! function_exists( 'woodmart_ajax_suggestions' ) ) {
    function woodmart_ajax_suggestions() {

        $allowed_types = array( 'post', 'product', 'portfolio' );
        $post_type = 'product';

        if ( apply_filters( 'woodmart_search_by_sku', woodmart_get_opt( 'search_by_sku' ) ) && woodmart_woocommerce_installed() ) {
            add_filter( 'posts_search', 'woodmart_product_ajax_search_sku', 10 );
        }

        $query_args = array(
            'posts_per_page' => 5,
            'post_status'    => 'publish',
            'post_type'      => $post_type,
            'no_found_rows'  => 1,
        );

        if ( ! empty( $_REQUEST['post_type'] ) && in_array( $_REQUEST['post_type'], $allowed_types ) ) {
            $post_type = strip_tags( $_REQUEST['post_type'] );
            $query_args['post_type'] = $post_type;
        }

        if ( $post_type == 'product' && woodmart_woocommerce_installed() ) {

            $product_visibility_term_ids = wc_get_product_visibility_term_ids();
            $query_args['tax_query'][] = array(
                'taxonomy' => 'product_visibility',
                'field'    => 'term_taxonomy_id',
                'terms'    => $product_visibility_term_ids['exclude-from-search'],
                'operator' => 'NOT IN',
            );

            if ( ! empty( $_REQUEST['product_cat'] ) ) {
                $query_args['product_cat'] = strip_tags( $_REQUEST['product_cat'] );
            }
        }

        if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) && $post_type == 'product' ) {
            $query_args['meta_query'][] = array( 'key' => '_stock_status', 'value' => 'outofstock', 'compare' => 'NOT IN' );
        }

        if ( ! empty( $_REQUEST['query'] ) ) {
            $query_args['s'] = sanitize_text_field( $_REQUEST['query'] );
        }

        if ( ! empty( $_REQUEST['number'] ) ) {
            $query_args['posts_per_page'] = (int) $_REQUEST['number'];
        }

        $blog_ids = array( 1, 2, 3, 4, 5, 6, 7, 8, 9 );

        foreach( $blog_ids as $id ) {

            switch_to_blog( $id );


        $results = new WP_Query( apply_filters( 'woodmart_ajax_search_args', $query_args ) );

        if ( woodmart_get_opt( 'relevanssi_search' ) && function_exists( 'relevanssi_do_query' ) ) {
            relevanssi_do_query( $results );
        }

        $suggestions = array();

        if ( $results->have_posts() ) {

            if ( $post_type == 'product' && woodmart_woocommerce_installed() ) {
                $factory = new WC_Product_Factory();
            }

            while ( $results->have_posts() ) {
                $results->the_post();

                if ( $post_type == 'product' && woodmart_woocommerce_installed() ) {
                    $product = $factory->get_product( get_the_ID() );

                    $suggestions[] = array(
                        'value' => html_entity_decode( get_the_title() ),
                        'permalink' => get_the_permalink(),
                        'price' => $product->get_price_html(),
                        'thumbnail' => $product->get_image(),
                        'sku' => $product->get_sku() ? esc_html__( 'SKU:', 'woodmart' ) . ' ' . $product->get_sku() : '',
                    );
                } else {
                    $suggestions[] = array(
                        'value' => html_entity_decode( get_the_title() ),
                        'permalink' => get_the_permalink(),
                        'thumbnail' => get_the_post_thumbnail( null, 'medium', '' ),
                    );
                }
            }

            wp_reset_postdata();

                restore_current_blog();

        } else {
            $suggestions[] = array(
                'value' => ( $post_type == 'product' ) ? esc_html__( 'No products found', 'woodmart' ) : esc_html__( 'No posts found', 'woodmart' ),
                'no_found' => true,
                'permalink' => ''
            );
        }

        if ( woodmart_get_opt( 'enqueue_posts_results' ) && 'post' !== $post_type ) {
            $post_suggestions = woodmart_get_post_suggestions();
            $suggestions = array_merge( $suggestions, $post_suggestions );
        }

        echo json_encode( array(
            'suggestions' => $suggestions,
        ) );

        die();
    }
    }

    add_action( 'wp_ajax_woodmart_ajax_search', 'woodmart_ajax_suggestions', 10 );
    add_action( 'wp_ajax_nopriv_woodmart_ajax_search', 'woodmart_ajax_suggestions', 10 );
}

if ( ! function_exists( 'woodmart_get_post_suggestions' ) ) {
    function woodmart_get_post_suggestions() {
        $query_args = array(
            'posts_per_page' => 5,
            'post_status'    => 'publish',
            'post_type'      => 'post',
            'no_found_rows'  => 1,
        );

        if ( ! empty( $_REQUEST['query'] ) ) {
            $query_args['s'] = sanitize_text_field( $_REQUEST['query'] );
        }

        if ( ! empty( $_REQUEST['number'] ) ) {
            $query_args['posts_per_page'] = (int) $_REQUEST['number'];
        }

        $blog_ids = array( 1, 2, 3, 4, 5, 6, 7, 8, 9 );

        foreach( $blog_ids as $id ) {

            switch_to_blog( $id );


        $results = new WP_Query( $query_args );
        $suggestions = array();

        if ( $results->have_posts() ) {

            $suggestions[] = array(
                'value' => '',
                'divider' => esc_html__( 'Results from blog', 'woodmart' ),
            );

            while ( $results->have_posts() ) {
                $results->the_post();

                $suggestions[] = array(
                    'value' => html_entity_decode( get_the_title() ),
                    'permalink' => get_the_permalink(),
                    'thumbnail' => get_the_post_thumbnail( null, 'medium', '' ),
                );
            }

            wp_reset_postdata();

                restore_current_blog();

                }

        }

        return $suggestions;
    }
}

if ( ! function_exists( 'woodmart_product_search_sku' ) ) {
    function woodmart_product_search_sku( $where, $class = false ) {
        global $pagenow, $wpdb, $wp;

        $type = array('product', 'jam');

        if ( ( is_admin() ) //if ((is_admin() && 'edit.php' != $pagenow) 
                || !is_search()  
                || !isset( $wp->query_vars['s'] ) 
                //post_types can also be arrays..
                || (isset( $wp->query_vars['post_type'] ) && 'product' != $wp->query_vars['post_type'] )
                || (isset( $wp->query_vars['post_type'] ) && is_array( $wp->query_vars['post_type'] ) && !in_array( 'product', $wp->query_vars['post_type'] ) ) 
                ) {
            return $where;
        }

        $s = $wp->query_vars['s'];

        //WC 3.6.0
        if ( function_exists( 'WC' ) && version_compare( WC()->version, '3.6.0', '<' ) ) {
            return woodmart_sku_search_query( $where, $s );
        } else {
            return woodmart_sku_search_query_new( $where, $s );
        }
    }
}

if ( ! function_exists( 'woodmart_product_ajax_search_sku' ) ) {
    function woodmart_product_ajax_search_sku( $where ) {
        if ( ! empty( $_REQUEST['query'] ) ) {
            $s = sanitize_text_field( $_REQUEST['query'] );

            //WC 3.6.0
            if ( function_exists( 'WC' ) && version_compare( WC()->version, '3.6.0', '<' ) ) {
                return woodmart_sku_search_query( $where, $s );
            } else {
                return woodmart_sku_search_query_new( $where, $s );
            }
        }

        return $where;
    }
}

if ( ! function_exists( 'woodmart_sku_search_query' ) ) {
    function woodmart_sku_search_query( $where, $s ) {
        global $wpdb;

        $search_ids = array();
        $terms = explode( ',', $s );

        foreach ( $terms as $term ) {
            //Include the search by id if admin area.
            if ( is_admin() && is_numeric( $term ) ) {
                $search_ids[] = $term;
            }
            // search for variations with a matching sku and return the parent.

            $sku_to_parent_id = $wpdb->get_col( $wpdb->prepare( "SELECT p.post_parent as post_id FROM {$wpdb->posts} as p join {$wpdb->postmeta} pm on p.ID = pm.post_id and pm.meta_key='_sku' and pm.meta_value LIKE '%%%s%%' where p.post_parent <> 0 group by p.post_parent", wc_clean( $term ) ) );

            //Search for a regular product that matches the sku.
            $sku_to_id = $wpdb->get_col( $wpdb->prepare( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_sku' AND meta_value LIKE '%%%s%%';", wc_clean( $term ) ) );

            $search_ids = array_merge( $search_ids, $sku_to_id, $sku_to_parent_id );
        }

        $search_ids = array_filter( array_map( 'absint', $search_ids ) );

        if ( sizeof( $search_ids ) > 0 ) {
            $where = str_replace( ')))', ") OR ({$wpdb->posts}.ID IN (" . implode( ',', $search_ids ) . "))))", $where );
        }

        #remove_filters_for_anonymous_class('posts_search', 'WC_Admin_Post_Types', 'product_search', 10);
        return $where;
    }
}

if ( ! function_exists( 'woodmart_sku_search_query_new' ) ) {
    function woodmart_sku_search_query_new( $where, $s ) {
        global $wpdb;

        $search_ids = array();
        $terms = explode( ',', $s );

        foreach ( $terms as $term ) {
            //Include the search by id if admin area.
            if ( is_admin() && is_numeric( $term ) ) {
                $search_ids[] = $term;
            }
            // search for variations with a matching sku and return the parent.

            $sku_to_parent_id = $wpdb->get_col( $wpdb->prepare( "SELECT p.post_parent as post_id FROM {$wpdb->posts} as p join {$wpdb->wc_product_meta_lookup} ml on p.ID = ml.product_id and ml.sku LIKE '%%%s%%' where p.post_parent <> 0 group by p.post_parent", wc_clean( $term ) ) );

            //Search for a regular product that matches the sku.
            $sku_to_id = $wpdb->get_col( $wpdb->prepare( "SELECT product_id FROM {$wpdb->wc_product_meta_lookup} WHERE sku LIKE '%%%s%%';", wc_clean( $term ) ) );

            $search_ids = array_merge( $search_ids, $sku_to_id, $sku_to_parent_id );
        }

        $search_ids = array_filter( array_map( 'absint', $search_ids ) );

        if ( sizeof( $search_ids ) > 0 ) {
            $where = str_replace( ')))', ") OR ({$wpdb->posts}.ID IN (" . implode( ',', $search_ids ) . "))))", $where );
        }

        #remove_filters_for_anonymous_class('posts_search', 'WC_Admin_Post_Types', 'product_search', 10);
        return $where;
    }
}

if ( ! function_exists( 'woodmart_rlv_index_variation_skus' ) ) {
    function woodmart_rlv_index_variation_skus( $content, $post ) {
        if ( ! woodmart_get_opt( 'search_by_sku' ) || ! woodmart_get_opt( 'relevanssi_search' ) || ! function_exists( 'relevanssi_do_query' ) ) {
            return $content;
        }

        if ( $post->post_type == 'product' ) {

            $args = array( 'post_parent' => $post->ID, 'post_type' => 'product_variation', 'posts_per_page' => -1 );
            $variations = get_posts( $args );
            if ( !empty( $variations)) {
                foreach ( $variations as $variation ) {
                    $sku = get_post_meta( $variation->ID, '_sku', true );
                    $content .= " $sku";
                }
            }
        }

        return $content;
    }

    add_filter( 'relevanssi_content_to_index', 'woodmart_rlv_index_variation_skus', 10, 2 );
}

OPTION 2

Premium Plugin

Hope help ^.^

Please notice me if you success.

24
  • If I remove the blog_id 1, the site1 can search the site2. May 15, 2020 at 10:50
  • Hi I tried, if I remove the blog_id 1, the site1 can ajax search the site2, but the search page (press ENTER, but never click the ajax search result) remained the same site. May 15, 2020 at 11:03
  • yes if i remove site 1 site 2 only works...the function exit on DIE() there's the problem. On cycle forach when it reach die() function ends to work...but without does not work May 15, 2020 at 15:05
  • @VitoSantimone Noted, I haven't stop trying and error, to found the solution for me and you too. Thanks! keep in touch. May 15, 2020 at 15:11
  • @WhatchTeller me too!! May 15, 2020 at 15:24
0

Answer: Worked ajax search suggestion

/**
 * ------------------------------------------------------------------------------------------------
 * Ajax search
 * ------------------------------------------------------------------------------------------------
 */
if ( ! function_exists( 'woodmart_init_search_by_sku' ) ) {
    function woodmart_init_search_by_sku() {
        if ( apply_filters( 'woodmart_search_by_sku', woodmart_get_opt( 'search_by_sku' ) ) && woodmart_woocommerce_installed() ) {
            add_filter( 'posts_search', 'woodmart_product_search_sku', 9 );
        }
    }

    add_action( 'init', 'woodmart_init_search_by_sku', 10 );
}

if ( ! function_exists( 'woodmart_ajax_suggestions' ) ) {
    function woodmart_ajax_suggestions() {

        $allowed_types = array( 'post', 'product', 'portfolio' );
        $post_type = 'product';

        if ( apply_filters( 'woodmart_search_by_sku', woodmart_get_opt( 'search_by_sku' ) ) && woodmart_woocommerce_installed() ) {
            add_filter( 'posts_search', 'woodmart_product_ajax_search_sku', 10 );
        }

        $query_args = array(
            'posts_per_page' => 5,
            'post_status'    => 'publish',
            'post_type'      => $post_type,
            'no_found_rows'  => 1,
        );

        if ( ! empty( $_REQUEST['post_type'] ) && in_array( $_REQUEST['post_type'], $allowed_types ) ) {
            $post_type = strip_tags( $_REQUEST['post_type'] );
            $query_args['post_type'] = $post_type;
        }

        if ( $post_type == 'product' && woodmart_woocommerce_installed() ) {

            $product_visibility_term_ids = wc_get_product_visibility_term_ids();
            $query_args['tax_query'][] = array(
                'taxonomy' => 'product_visibility',
                'field'    => 'term_taxonomy_id',
                'terms'    => $product_visibility_term_ids['exclude-from-search'],
                'operator' => 'NOT IN',
            );

            if ( ! empty( $_REQUEST['product_cat'] ) ) {
                $query_args['product_cat'] = strip_tags( $_REQUEST['product_cat'] );
            }
        }

        if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) && $post_type == 'product' ) {
            $query_args['meta_query'][] = array( 'key' => '_stock_status', 'value' => 'outofstock', 'compare' => 'NOT IN' );
        }

        if ( ! empty( $_REQUEST['query'] ) ) {
            $query_args['s'] = sanitize_text_field( $_REQUEST['query'] );
        }

        if ( ! empty( $_REQUEST['number'] ) ) {
            $query_args['posts_per_page'] = (int) $_REQUEST['number'];
        }

// Blog 1
switch_to_blog(1);

        $results = new WP_Query( apply_filters( 'woodmart_ajax_search_args', $query_args ) );

        if ( woodmart_get_opt( 'relevanssi_search' ) && function_exists( 'relevanssi_do_query' ) ) {
            relevanssi_do_query( $results );
        }

        $suggestions = array();

        if ( $results->have_posts() ) {

            if ( $post_type == 'product' && woodmart_woocommerce_installed() ) {
                $factory = new WC_Product_Factory();
            }

            while ( $results->have_posts() ) {
                $results->the_post();

                if ( $post_type == 'product' && woodmart_woocommerce_installed() ) {
                    $product = $factory->get_product( get_the_ID() );

                    $suggestions[] = array(
                        'value' => html_entity_decode( get_the_title() ),
                        'permalink' => get_the_permalink(),
                        'price' => $product->get_price_html(),
                        'thumbnail' => $product->get_image(),
                        'sku' => $product->get_sku() ? esc_html__( 'SKU:', 'woodmart' ) . ' ' . $product->get_sku() : '',
                    );
                } else {
                    $suggestions[] = array(
                        'value' => html_entity_decode( get_the_title() ),
                        'permalink' => get_the_permalink(),
                        'thumbnail' => get_the_post_thumbnail( null, 'medium', '' ),
                    );
                }
            }

            wp_reset_postdata();
                restore_current_blog();
        } else {
            $suggestions[] = array(
                'value' => ( $post_type == 'product' ) ? esc_html__( 'No products found', 'woodmart' ) : esc_html__( 'No posts found', 'woodmart' ),
                'no_found' => true,
                'permalink' => ''
            );
        }

// Blog 2
switch_to_blog(2);

        $results = new WP_Query( apply_filters( 'woodmart_ajax_search_args', $query_args ) );

        if ( woodmart_get_opt( 'relevanssi_search' ) && function_exists( 'relevanssi_do_query' ) ) {
            relevanssi_do_query( $results );
        }

        $suggestions1 = array();

        if ( $results->have_posts() ) {

            if ( $post_type == 'product' && woodmart_woocommerce_installed() ) {
                $factory = new WC_Product_Factory();
            }

            while ( $results->have_posts() ) {
                $results->the_post();

                if ( $post_type == 'product' && woodmart_woocommerce_installed() ) {
                    $product = $factory->get_product( get_the_ID() );

                    $suggestions[] = array(
                        'value' => html_entity_decode( get_the_title() ),
                        'permalink' => get_the_permalink(),
                        'price' => $product->get_price_html(),
                        'thumbnail' => $product->get_image(),
                        'sku' => $product->get_sku() ? esc_html__( 'SKU:', 'woodmart' ) . ' ' . $product->get_sku() : '',
                    );
                } else {
                    $suggestions[] = array(
                        'value' => html_entity_decode( get_the_title() ),
                        'permalink' => get_the_permalink(),
                        'thumbnail' => get_the_post_thumbnail( null, 'medium', '' ),
                    );
                }
            }

            wp_reset_postdata();
                restore_current_blog();
        } else {
            $suggestions[] = array(
                'value' => ( $post_type == 'product' ) ? esc_html__( 'No products found', 'woodmart' ) : esc_html__( 'No posts found', 'woodmart' ),
                'no_found' => true,
                'permalink' => ''
            );
        }

        if ( woodmart_get_opt( 'enqueue_posts_results' ) && 'post' !== $post_type ) {
            $post_suggestions = woodmart_get_post_suggestions();
            $suggestions = array_merge( $suggestions, $suggestion1, $post_suggestions );
        }

            echo json_encode(array('suggestions' => $suggestions
        ));

        die();
    }

    add_action( 'wp_ajax_woodmart_ajax_search', 'woodmart_ajax_suggestions', 10 );
    add_action( 'wp_ajax_nopriv_woodmart_ajax_search', 'woodmart_ajax_suggestions', 10 );
}

if ( ! function_exists( 'woodmart_get_post_suggestions' ) ) {
    function woodmart_get_post_suggestions() {
        $query_args = array(
            'posts_per_page' => 5,
            'post_status'    => 'publish',
            'post_type'      => 'post',
            'no_found_rows'  => 1,
        );

        if ( ! empty( $_REQUEST['query'] ) ) {
            $query_args['s'] = sanitize_text_field( $_REQUEST['query'] );
        }

        if ( ! empty( $_REQUEST['number'] ) ) {
            $query_args['posts_per_page'] = (int) $_REQUEST['number'];
        }

        $results = new WP_Query( $query_args );
        $suggestions = array();

        if ( $results->have_posts() ) {

            $suggestions[] = array(
                'value' => '',
                'divider' => esc_html__( 'Results from blog', 'woodmart' ),
            );

            while ( $results->have_posts() ) {
                $results->the_post();

                $suggestions[] = array(
                    'value' => html_entity_decode( get_the_title() ),
                    'permalink' => get_the_permalink(),
                    'thumbnail' => get_the_post_thumbnail( null, 'medium', '' ),
                );
            }

            wp_reset_postdata();
        }

        return $suggestions;
    }
}

if ( ! function_exists( 'woodmart_product_search_sku' ) ) {
    function woodmart_product_search_sku( $where, $class = false ) {
        global $pagenow, $wpdb, $wp;

        $type = array('product', 'jam');

        if ( ( is_admin() ) //if ((is_admin() && 'edit.php' != $pagenow) 
                || !is_search()  
                || !isset( $wp->query_vars['s'] ) 
                //post_types can also be arrays..
                || (isset( $wp->query_vars['post_type'] ) && 'product' != $wp->query_vars['post_type'] )
                || (isset( $wp->query_vars['post_type'] ) && is_array( $wp->query_vars['post_type'] ) && !in_array( 'product', $wp->query_vars['post_type'] ) ) 
                ) {
            return $where;
        }

        $s = $wp->query_vars['s'];

        //WC 3.6.0
        if ( function_exists( 'WC' ) && version_compare( WC()->version, '3.6.0', '<' ) ) {
            return woodmart_sku_search_query( $where, $s );
        } else {
            return woodmart_sku_search_query_new( $where, $s );
        }
    }
}

if ( ! function_exists( 'woodmart_product_ajax_search_sku' ) ) {
    function woodmart_product_ajax_search_sku( $where ) {
        if ( ! empty( $_REQUEST['query'] ) ) {
            $s = sanitize_text_field( $_REQUEST['query'] );

            //WC 3.6.0
            if ( function_exists( 'WC' ) && version_compare( WC()->version, '3.6.0', '<' ) ) {
                return woodmart_sku_search_query( $where, $s );
            } else {
                return woodmart_sku_search_query_new( $where, $s );
            }
        }

        return $where;
    }
}

if ( ! function_exists( 'woodmart_sku_search_query' ) ) {
    function woodmart_sku_search_query( $where, $s ) {
        global $wpdb;

        $search_ids = array();
        $terms = explode( ',', $s );

        foreach ( $terms as $term ) {
            //Include the search by id if admin area.
            if ( is_admin() && is_numeric( $term ) ) {
                $search_ids[] = $term;
            }
            // search for variations with a matching sku and return the parent.

            $sku_to_parent_id = $wpdb->get_col( $wpdb->prepare( "SELECT p.post_parent as post_id FROM {$wpdb->posts} as p join {$wpdb->postmeta} pm on p.ID = pm.post_id and pm.meta_key='_sku' and pm.meta_value LIKE '%%%s%%' where p.post_parent <> 0 group by p.post_parent", wc_clean( $term ) ) );

            //Search for a regular product that matches the sku.
            $sku_to_id = $wpdb->get_col( $wpdb->prepare( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_sku' AND meta_value LIKE '%%%s%%';", wc_clean( $term ) ) );

            $search_ids = array_merge( $search_ids, $sku_to_id, $sku_to_parent_id );
        }

        $search_ids = array_filter( array_map( 'absint', $search_ids ) );

        if ( sizeof( $search_ids ) > 0 ) {
            $where = str_replace( ')))', ") OR ({$wpdb->posts}.ID IN (" . implode( ',', $search_ids ) . "))))", $where );
        }

        #remove_filters_for_anonymous_class('posts_search', 'WC_Admin_Post_Types', 'product_search', 10);
        return $where;
    }
}

if ( ! function_exists( 'woodmart_sku_search_query_new' ) ) {
    function woodmart_sku_search_query_new( $where, $s ) {
        global $wpdb;

        $search_ids = array();
        $terms = explode( ',', $s );

        foreach ( $terms as $term ) {
            //Include the search by id if admin area.
            if ( is_admin() && is_numeric( $term ) ) {
                $search_ids[] = $term;
            }
            // search for variations with a matching sku and return the parent.

            $sku_to_parent_id = $wpdb->get_col( $wpdb->prepare( "SELECT p.post_parent as post_id FROM {$wpdb->posts} as p join {$wpdb->wc_product_meta_lookup} ml on p.ID = ml.product_id and ml.sku LIKE '%%%s%%' where p.post_parent <> 0 group by p.post_parent", wc_clean( $term ) ) );

            //Search for a regular product that matches the sku.
            $sku_to_id = $wpdb->get_col( $wpdb->prepare( "SELECT product_id FROM {$wpdb->wc_product_meta_lookup} WHERE sku LIKE '%%%s%%';", wc_clean( $term ) ) );

            $search_ids = array_merge( $search_ids, $sku_to_id, $sku_to_parent_id );
        }

        $search_ids = array_filter( array_map( 'absint', $search_ids ) );

        if ( sizeof( $search_ids ) > 0 ) {
            $where = str_replace( ')))', ") OR ({$wpdb->posts}.ID IN (" . implode( ',', $search_ids ) . "))))", $where );
        }

        #remove_filters_for_anonymous_class('posts_search', 'WC_Admin_Post_Types', 'product_search', 10);
        return $where;
    }
}

if ( ! function_exists( 'woodmart_rlv_index_variation_skus' ) ) {
    function woodmart_rlv_index_variation_skus( $content, $post ) {
        if ( ! woodmart_get_opt( 'search_by_sku' ) || ! woodmart_get_opt( 'relevanssi_search' ) || ! function_exists( 'relevanssi_do_query' ) ) {
            return $content;
        }

        if ( $post->post_type == 'product' ) {

            $args = array( 'post_parent' => $post->ID, 'post_type' => 'product_variation', 'posts_per_page' => -1 );
            $variations = get_posts( $args );
            if ( !empty( $variations)) {
                foreach ( $variations as $variation ) {
                    $sku = get_post_meta( $variation->ID, '_sku', true );
                    $content .= " $sku";
                }
            }
        }

        return $content;
    }

    add_filter( 'relevanssi_content_to_index', 'woodmart_rlv_index_variation_skus', 10, 2 );
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.