在 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 );
我正在寻找一种方法来扩展 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 );