在 WooCommerce 后端添加一个自定义字段作为默认值并填充以前的订单

Add a custom field as a default value in WooCommerce backend and populate previous orders

我知道我的问题的第一部分是可能的,但还没有找到如何在后端向 所有订单 添加自定义字段,然后用默认值。

我想创建一个名为“商家标识符”的自定义字段,然后使用默认名称(例如“公司 X”)填充它。

我查看了这段代码,它在结账时添加了一个输入值,然后显示在订单摘要中,但我只需要在后端为每个订单添加一个字段作为自定义字段。

/**
 * Process the checkout
 */
add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');

function my_custom_checkout_field_process() {
    // Check if set, if its not set add an error.
    if ( ! $_POST['billing_phone_new'] )
        wc_add_notice( __( 'Phone 2 is compulsory. Please enter a value' ), 'error' );
}


/**
 * Update the order meta with field value
 */
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );

function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['billing_phone_new'] ) ) {
        update_post_meta( $order_id, 'billing_phone_new', sanitize_text_field( $_POST['billing_phone_new'] ) );
    }
}


/**
 * Display field value on the order edit page
 */
add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );

function my_custom_checkout_field_display_admin_order_meta($order){
    echo '<p><strong>'.__('Phone 2').':</strong> <br/>' . get_post_meta( $order->get_id(), 'billing_phone_new', true ) . '</p>';
}

一旦该自定义字段出现在所有新旧订单上,我就可以将其添加为计划的 CSV 导出中的列(这是为了以后 - 我只需要实现第一部分)。

我不确定我是否需要先在结账时使用默认值设置一个隐藏字段,或者我是否可以使用不同的方法添加一个显示在后端所有订单上的自定义字段。

有人能帮忙吗?

谢谢

对于新订单,您可以使用以下方式

// Update the order meta with value 
function action_woocommerce_checkout_update_order_meta( $order_id ) {
    // Meta value
    $meta_value = 'Company X';
    
    update_post_meta( $order_id, 'merchant_identifier', $meta_value );
}
add_action( 'woocommerce_checkout_update_order_meta', 'action_woocommerce_checkout_update_order_meta', 10, 1 );

// OPTIONAL (will still work without this code, this is just to show it visually)
// Display field value on the order edit page
function action_woocommerce_admin_order_data_after_billing_address( $order ) {  
    echo '<p><strong>' . __( 'Merchant Identifier', 'woocommerce') . ':</strong> ' . $order->get_meta( 'merchant_identifier' ) . '</p>';
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'action_woocommerce_admin_order_data_after_billing_address', 10, 1 );

对于现有订单,您可以执行以下功能,执行后(查看任何页面 - 前端)可能会被删除。

// Run once, delete afterwards
function set_meta_for_old_orders () {
    // Get ALL orders where meta key not exists
    $orders = wc_get_orders( array(
        'limit'        => -1, // Query all orders
        'meta_key'     => 'merchant_identifier', // Post meta_key
        'meta_compare' => 'NOT EXISTS', // Comparison argument
    ));
    
    if ( ! empty ( $orders ) ) {
        // Meta value
        $meta_value = 'Company X';
        
        foreach ( $orders as $order ) {
            $order->update_meta_data( 'merchant_identifier', $meta_value );
            $order->save();
        }

        echo 'Done!';
    }
}
// Call function
add_action( 'wp_footer', 'set_meta_for_old_orders' );