首页 文章

在Woocommerce订单管理页面中按订单商品SKU或ID搜索

提问于
浏览
8

我想要做的是能够在Woocommerce订单管理页面中按订单商品SKU或ID进行搜索 . 到目前为止我已经找到/完成了什么,但没有成功的是在functions.php文件中的以下内容 .

add_filter( 'woocommerce_shop_order_search_fields', 'woocommerce_shop_order_search_sku' );

function woocommerce_shop_order_search_sku( $search_fields ) {

$args = array(
    'post_type' => 'shop_order'
    );

$orders = new WP_Query($args);

if($orders->have_posts()) {
        while($orders->have_posts()) {
        $post = $orders->the_post();
        $order_id = get_the_ID();
        $order = new WC_Order($order_id);
        $items = $order->get_items();
        foreach($items as $item) {
            $search_order_item_sku = wp_get_post_terms( $item['product_id'], 'search_sku' );
            foreach($search_order_item_sku as $search_sku) {
                add_post_meta($order_id, "_search_sku", $search_sku->sku);
            }
        }
    }
};

$search_fields[] = '_search_sku';

return $search_fields;

}

我想问题是$ search_sku在“add_post_meta”行的 Value . 我也用get_sku(),$ item ['sku']试了一下但没有运气 .

有什么建议?

4 回答

  • 0

    您有关于将额外元数据保存到订单的正确想法 . 正如jbby和helgatheviking建议的那样,在woocommerce订单api中默认没有product_id或sku的内置postmeta . 但是,您访问和保存元数据的方法并不完全正确 . wp_get_post_terms 将访问自定义分类信息,而不是元数据(使用 get_post_meta ) . 您将能够执行您尝试使用此过滤器执行的操作:

    add_filter( 'woocommerce_shop_order_search_fields', function ($search_fields ) {
        $posts = get_posts(array('post_type' => 'shop_order'));
    
        foreach ($posts as $post) {
            $order_id = $post->ID;
            $order = new WC_Order($order_id);
            $items = $order->get_items();
    
            foreach($items as $item) {
                $product_id = $item['product_id'];
                $search_sku = get_post_meta($product_id, "_sku", true);
                add_post_meta($order_id, "_product_sku", $search_sku);
                add_post_meta($order_id, "_product_id", $product_id);
            }
        }
    
        return array_merge($search_fields, array('_product_sku', '_product_id'));
    });
    

    严格来说,您应该将对 add_post_meta 的调用移动到最初将订单保存到数据库时运行的挂钩 - 这样可以防止在您搜索订单时不必要的工作 .

  • 2

    @blacksquare,@ jibby,@ helgatheviking你是男人们!由于您的帮助,这是可用的代码 .

    //Search by product SKU in Admin Woocommerce Orders
    add_filter( 'woocommerce_shop_order_search_fields', function ($search_fields ) {
        $posts = get_posts(array('post_type' => 'shop_order'));
    
        foreach ($posts as $post) {
            $order_id = $post->ID;
            $order = new WC_Order($order_id);
            $items = $order->get_items();
    
            foreach($items as $item) {
                $product_id = $item['product_id'];
                $search_sku = get_post_meta($product_id, "_sku", true);
                add_post_meta($order_id, "_product_sku", $search_sku);
            }
        }
    
        return array_merge($search_fields, array('_product_sku'));
    });
    
  • 1

    虽然@Nikos和@blacksquare的答案有效,但每次搜索都会在每个订单中添加新的帖子元数据 . 如果您有100个订单并进行10次搜索,则 wp_postmeta 表中至少会有100 * 10 = 1000个 _product_sku 条目 . 如果某些订单包含多个产品,则会有更多 .

    正如@blacksquare建议的那样,保存订单时应调用 add_post_meta . 也就是说,如果站点很小并且后端搜索性能不是太大问题,则以下代码可以在不创建冗余 _product_sku 条目的情况下工作 .

    add_filter( 'woocommerce_shop_order_search_fields', 'my_shop_order_search_fields') );
    
    public function my_shop_order_search_fields( $search_fields ) {
        $orders = get_posts( array(
            'post_type' => 'shop_order',
            'post_status' => wc_get_order_statuses(), //get all available order statuses in an array
            'posts_per_page' => 999999, // query all orders
            'meta_query' => array(
                array(
                    'key' => '_product_sku',
                    'compare' => 'NOT EXISTS'
                )
            ) // only query orders without '_product_sku' postmeta
        ) );
    
        foreach ($orders as $order) {
            $order_id = $order->ID;
            $wc_order = new WC_Order($order_id);
            $items = $wc_order->get_items();
            foreach($items as $item) {
                $product_id = $item['product_id'];
                $search_sku = get_post_meta($product_id, '_sku', true);
                add_post_meta( $order_id, '_product_sku', $search_sku );
            }
        }
    
        return array_merge($search_fields, array('_product_sku')); // make '_product_sku' one of the meta keys we are going to search for.
    }
    

    虽然更好的解决方案可能是在创建订单时调用 add_post_meta ,但是需要额外的努力来为现有订单创建 _product_sku ,并且您必须为代码创建 _product_sku ,而代码不是't activated. For simplicity sake, I' d只需使用上面建议的解决方案 .

    附: @Nikos的解决方案确实有一个(有争议的)优势 - 如果您在订单完成后更改产品的SKU,Nikos的解决方案将使用新的SKU找到这些订单,而上述解决方案则不会 . 也就是说,产品的SKU无论如何都不应该改变,搜索新的SKU是否应该显示旧订单是有争议的 .

  • 1

    您可能还想查看https://uk.wordpress.org/plugins/woo-search-order-by-sku/,它不会重载post meta,但会改变where子句 .

相关问题