search multiple sku's on woocommerce admin sid

2019-09-02 09:31发布

问题:

This sounds simple but if you have hundreds of products and need to search multiple sku's on woocommerce admin side is not available. Lets say you need to verify 600 products, you have to: manually add one sku to search bar click search get results start again you can't separate by , or by space, or dash.

I searched and no one have an answer or they are questions made are not answered. How can people search multiple sku's, or products names on woocommerce admin side?

回答1:

First.. you mention you have to verify many products (600), needing a multiple sku search. It looks to me you're going to do this manually? I recommend creating a product loop in PHP where you do your verify stuff. This is probably gonna save you alot off time, and you can re-use it.


Now to the problem... Search woo products using multiple sku's.

I agree many info on the internet is kinda misleading. I've done this before, and i always used the pre_get_posts hook to change the WP (search) query before it runs.

After testing it appears the query is not being setup as a search, and the search value is empty...

So woocommerce has to do a custom search query. Luckily i quickly found mircian's post.

WooCommerce uses a Data Store for its post types ( products, orders, etc ) and the search is also done using a custom function. In this case it’s called ‘search_products’ and it does a custom query which basically returns an array of ids to be used for the results.

I modified his function to search with multiple sku's. Insert the function in your (child) theme's functions.php.

Use '|' as a SKU delimiter. Example: '1234|1235|1236'

Tested on:

  • Wordpress 4.9.6
  • Woocommerce 3.3.5

/**
 * Use multiple sku's to find WOO products in wp-admin
 * NOTE: Use '|' as a sku delimiter in your search query. Example: '1234|1235|1236'
**/
function woo_multiple_sku_search( $query_vars ) {

    global $typenow;
    global $wpdb;
    global $pagenow;

    if ( 'product' === $typenow && isset( $_GET['s'] ) && 'edit.php' === $pagenow ) {
        $search_term = esc_sql( sanitize_text_field( $_GET['s'] ) );

        if (strpos($search_term, '|') == false) return $query_vars;

        $skus = explode('|',$search_term);

        $meta_query = array(
            'relation' => 'OR'
        );
        if(is_array($skus) && $skus) {
            foreach($skus as $sku) {
                $meta_query[] = array(
                    'key' => '_sku',
                    'value' => $sku,
                    'compare' => '='
                );
            }
        }

        $args = array(
            'posts_per_page'  => -1,
            'post_type'       => 'product',
            'meta_query'      => $meta_query
        );
        $posts = get_posts( $args );

        if ( ! $posts ) return $query_vars;

        foreach($posts as $post){
          $query_vars['post__in'][] = $post->ID;
        }
    }

    return $query_vars;
}
add_filter( 'request', 'woo_multiple_sku_search', 20 );