在 WooCommerce 管理员订单列表中扩展搜索

Extending search in WooCommerce admin orders list

我正在寻找一种方法来扩展 WooCommerce 管理员订单列表中的自定义元键搜索字段。目前我正在使用 woocommerce_shop_order_search_fields 过滤器挂钩。

生成此代码,它允许我按用户 ID、订单总数和订单号进行搜索。

add_filter( 'woocommerce_shop_order_search_fields', 'woocommerce_shop_order_search_order_total' );
function woocommerce_shop_order_search_order_total( $search_fields ) {
    $search_fields[] = '_order_total';

    $search_fields[] = '_user_id';

    $search_fields[] = '_order_number';

    return $search_fields;
} 

但是,这些都是已经存在的元数据,如果我想搜索还不存在的元数据怎么办?有什么建议吗?

通过使用 woocommerce_shop_order_search_fields 过滤器钩子可以很容易地在 WooCommerce 管理订单列表中扩展搜索,您只需要为订单(项目)添加一些 post_meta 字段。当然只要这个数据存在!

By default, the following metakeys are present:

  • _billing_address_index
  • _shipping_address_index
  • _billing_last_name
  • _billing_email

因此,例如,如果您想通过账单名字扩展搜索,只需添加元键 _billing_first_name 即可,然后您会得到:

function filter_woocommerce_shop_order_search_fields( $search_fields ) {
    // Metakey
    $search_fields[] = '_billing_first_name';

    return $search_fields;
}
add_filter( 'woocommerce_shop_order_search_fields', 'filter_woocommerce_shop_order_search_fields', 10, 1 );

现在,如果订单没有此元数据怎么办?您可以在创建订单时为未来的订单添加特定的元数据。可是等等!现有的订单呢?对于这些订单,此数据将不存在!

如果我们可以将此数据添加到现有订单甚至新订单中,那不是很有用吗?这是可能的,即通过使用 wc_get_orders(),在 运行 搜索之前获取(并更新)现有订单。

所以你得到:(我们在这个例子中将用户的昵称作为元数据添加到订单中)

function filter_woocommerce_shop_order_search_fields( $search_fields ) {
    // The desired meta key
    $meta_key = '_user_nickname';

    // Get ALL orders where a certain meta key not exists
    $orders = wc_get_orders( array(
        'limit'        => -1, // Query all orders
        'meta_key'     => $meta_key, // Post meta_key
        'meta_compare' => 'NOT EXISTS', // Comparison argument
    ));

    // NOT empty    
    if ( ! empty ( $orders ) ) {
        // Loop through the orders
        foreach ( $orders as $order ) {
            // Get the desired information via the order object
            // Get user
            $user = $order->get_user();

            // User is NOT empty
            if ( ! empty ( $user ) ) {
                // Get nickname from user
                $meta_value = $user->nickname;

                // Meta value is NOT empty
                if ( ! empty ( $meta_value )  ) {
                    // Add the meta data
                    $order->update_meta_data( $meta_key, $meta_value );
                    $order->save();
                }
            }
        }
    }

    // Metakey
    $search_fields[] = $meta_key;

    return $search_fields;
}
add_filter( 'woocommerce_shop_order_search_fields', 'filter_woocommerce_shop_order_search_fields', 10, 1 );