为 WooCommerce 中有限数量的现有订单更新多个元数据
Update multiple metadata for a limited number of existing orders in WooCommerce
我为每个订单添加了 4 个新的元数据字段。我可以在管理面板中自己为每个订单更新这些字段,但是有 200 个订单,这需要一段时间。
我需要为每个订单自动填充这些元字段。未来的订单将自动填充,但我现在需要更新所有订单。
我写了下面的代码,但它什么也没做:
add_action( 'woocommerce_loaded', 'update_existing_orders_with_new_meta' );
function update_existing_orders_with_new_meta(){
$order_ids = wc_get_order( $order_id );
// Loop through product Ids
foreach ( $order_ids as $order_id ) {
if ( $order_id->payment_method == 'cheque' ) {
$order_id->update_meta_data('ji_payment_status', '');
$order_id->update_meta_data('ji_payment_method', '');
$order_id->update_meta_data('ji_payment_date', '');
$order_id->update_meta_data('ji_payment_notes', '');
} else {
$order_id->update_meta_data('ji_payment_status', '1');
$order_id->update_meta_data('ji_payment_method', 'Credit Card');
$order_id->update_meta_data('ji_payment_date', date('F j, Y'));
$order_id->update_meta_data('ji_payment_notes', '');
}
}
}
有人可以指导我如何操作吗?
您正在使用 $order_ids = wc_get_order( $order_id );
,但尚未设置 $order_id
。
如果实际涉及到200个订单,可以使用下面的方式。操作完成后,'done' 将出现在页脚中。然后就可以去掉代码了
// Run once, delete afterwards
function set_meta_for_orders () {
// Get ALL orders (could be extended with multiple conditions)
// More info: https://github.com/woocommerce/woocommerce/wiki/wc_get_orders-and-WC_Order_Query
$orders = wc_get_orders( array(
'limit' => 200, // Get 200 most recent orders
));
// NOT empty
if ( ! empty ( $orders ) ) {
// Loop
foreach ( $orders as $order ) {
// Payment method = cheque
if ( $order->get_payment_method() == 'cheque' ) {
$order->update_meta_data( 'ji_payment_status', '' );
$order->update_meta_data( 'ji_payment_method', '' );
$order->update_meta_data( 'ji_payment_date', '' );
$order->update_meta_data( 'ji_payment_notes', '' );
} else {
$order->update_meta_data( 'ji_payment_status', '1' );
$order->update_meta_data( 'ji_payment_method', 'Credit Card' );
$order->update_meta_data( 'ji_payment_date', date( 'F j, Y' ) );
$order->update_meta_data( 'ji_payment_notes', '' );
}
// Save
$order->save();
}
// Output
echo 'Done!';
}
}
// Call function
add_action( 'wp_footer', 'set_meta_for_orders' );
注意:这将适用于一些有限的订单。当涉及到很多订单时,建议使用其他解决方案,例如自定义SQL。
我为每个订单添加了 4 个新的元数据字段。我可以在管理面板中自己为每个订单更新这些字段,但是有 200 个订单,这需要一段时间。
我需要为每个订单自动填充这些元字段。未来的订单将自动填充,但我现在需要更新所有订单。
我写了下面的代码,但它什么也没做:
add_action( 'woocommerce_loaded', 'update_existing_orders_with_new_meta' );
function update_existing_orders_with_new_meta(){
$order_ids = wc_get_order( $order_id );
// Loop through product Ids
foreach ( $order_ids as $order_id ) {
if ( $order_id->payment_method == 'cheque' ) {
$order_id->update_meta_data('ji_payment_status', '');
$order_id->update_meta_data('ji_payment_method', '');
$order_id->update_meta_data('ji_payment_date', '');
$order_id->update_meta_data('ji_payment_notes', '');
} else {
$order_id->update_meta_data('ji_payment_status', '1');
$order_id->update_meta_data('ji_payment_method', 'Credit Card');
$order_id->update_meta_data('ji_payment_date', date('F j, Y'));
$order_id->update_meta_data('ji_payment_notes', '');
}
}
}
有人可以指导我如何操作吗?
您正在使用 $order_ids = wc_get_order( $order_id );
,但尚未设置 $order_id
。
如果实际涉及到200个订单,可以使用下面的方式。操作完成后,'done' 将出现在页脚中。然后就可以去掉代码了
// Run once, delete afterwards
function set_meta_for_orders () {
// Get ALL orders (could be extended with multiple conditions)
// More info: https://github.com/woocommerce/woocommerce/wiki/wc_get_orders-and-WC_Order_Query
$orders = wc_get_orders( array(
'limit' => 200, // Get 200 most recent orders
));
// NOT empty
if ( ! empty ( $orders ) ) {
// Loop
foreach ( $orders as $order ) {
// Payment method = cheque
if ( $order->get_payment_method() == 'cheque' ) {
$order->update_meta_data( 'ji_payment_status', '' );
$order->update_meta_data( 'ji_payment_method', '' );
$order->update_meta_data( 'ji_payment_date', '' );
$order->update_meta_data( 'ji_payment_notes', '' );
} else {
$order->update_meta_data( 'ji_payment_status', '1' );
$order->update_meta_data( 'ji_payment_method', 'Credit Card' );
$order->update_meta_data( 'ji_payment_date', date( 'F j, Y' ) );
$order->update_meta_data( 'ji_payment_notes', '' );
}
// Save
$order->save();
}
// Output
echo 'Done!';
}
}
// Call function
add_action( 'wp_footer', 'set_meta_for_orders' );
注意:这将适用于一些有限的订单。当涉及到很多订单时,建议使用其他解决方案,例如自定义SQL。