在Woocommerce Orders Admin页面按订单商品SKU或ID搜索

我试图做的是能够通过Woocommerce Orders Admin页面中的订单商品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”这一行的值。 我也试过用get_sku(),$ item ['sku']没有运气。

有什么建议么?


您有正确的想法将额外的元数据保存到订单中。 正如jbby和helgatheviking所建议的,woocommerce order 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移动到订单最初保存到数据库时运行的挂钩 - 这样可以防止在您按顺序进行搜索时不必要的操作。


@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'));
});

尽管@Nikos和@blacksquare的答案有效,但是每个搜索的每个订单都会添加新的帖子元数据。 如果你有100个订单,并10个搜索,将有至少100 * 10 = 1000 _product_sku在条目wp_postmeta表。 如果某些订单包含多个产品,则会有更多。

正如@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的订单创建_product_sku 。 为了简单起见,我只是使用上面提出的解决方案。

ps @Nikos的解决方案确实有一个(有争议的)优势 - 如果您在订单完成后更改产品的SKU,Nikos的解决方案将使用新的SKU查找这些订单,而上述解决方案则不会。 也就是说,产品的SKU不应该改变,并且搜索新SKU是否应该显示旧订单是值得商榷的。

链接地址: http://www.djcxy.com/p/83163.html

上一篇: Search by order item SKU or ID in Woocommerce Orders Admin page

下一篇: Render a View during a Unit Test