为 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。