在woocommerce管理员端搜索多个sku's

时间:2018-06-05 19:36:15

标签: wordpress woocommerce

这听起来很简单,但如果您有数百种产品,并且需要在woocommerce上搜索多个sku,则管理员端无法使用。 假设您需要验证600种产品,您必须: 手动将一个sku添​​加到搜索栏 点击搜索 得到结果 重新开始 你不能通过空间或空间分开。

我搜索过,没有人有答案,或者他们提出的问题没有得到解答。 人们如何在woocommerce管理员端搜索多个sku或产品名称?

1 个答案:

答案 0 :(得分:0)

首先..你提到你需要验证很多产品(600),需要多次sku搜索。在我看来你会手动这样做吗? 我建议在PHP中创建一个产品循环,在那里进行验证。这可能会为你节省很多时间,你可以重复使用它。

现在问题...使用多个sku's搜索woo产品。

我同意互联网上的许多信息都有点误导。之前我已经完成了这个,并且我总是使用pre_get_posts挂钩在运行之前更改WP(搜索)查询。

测试后,显示查询未设置为搜索,搜索值为空...

因此,woocommerce必须进行自定义搜索查询。幸运的是,我很快找到了mircian's post.

WooCommerce使用数据存储作为其帖子类型(产品,订单等),并且还使用自定义功能进行搜索。在这种情况下,它被称为“search_products”,并且它执行自定义查询,该查询基本上返回要用于结果的id数组。

我修改了他的功能,用多个sku进行搜索。 在您的(子)主题的functions.php。

中插入该函数

使用'|'作为SKU分隔符。示例:'1234 | 1235 | 1236'

测试:

  • 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 );