将产品自定义字段另存为WooCommerce管理员手动订单的自定义订单项元数据

问题描述

使用 Pass custom product meta data to the order in Woocommerce 3 应答代码,从后端手动创建订单时从后端手动添加产品时,是否可以保存和显示自定义元数据?

那是我的代码(稍作更改):

// Admin products: display custom Field
add_action( 'woocommerce_product_options_general_product_data','product_options_general_product_data_add_field' );
function product_options_general_product_data_add_field() {
    global $post;

    echo '<div class="options_group">';

    woocommerce_wp_select( array(
        'id'      => '_cost_centre','label'   => __( 'Cost Centre','woocommerce' ),'options' => array(
            'MFEG'   => __( 'MFEG',// Default displayed option value
            'YDIT'   => __( 'YDIT',)
    ) );

    echo '</div>';
}

// Admin products: Save custom Field
add_action( 'woocommerce_process_product_Meta','product_options_general_product_data_save_field' );
function product_options_general_product_data_save_field( $post_id ){
    if( isset( $_POST['_cost_centre'] ) )
        update_post_Meta( $post_id,'_cost_centre',esc_attr( $_POST['_cost_centre'] ) );
}

// Order items: Save product "Cost centre" as hidden order item Meta data
add_action('woocommerce_checkout_create_order_line_item','save_file_type_as_order_item_Meta',20,4);
function save_file_type_as_order_item_Meta($item,$cart_item_key,$values,$order) {
    if ( $cost_centre = $values['data']->get_Meta('_cost_centre') ) {
        $item->update_Meta_data( '_cost_centre',$cost_centre ); // Save as order item (visble on admin only)
    }
}

当客户端从前端创建订单时,这可以很好地工作。但是当管理员从后端手动创建订单并添加产品时,自定义元数据不可见。

如何解决手动创建订单的问题,允许将产品自定义字段添加自定义订单商品数据?

解决方法

更新3

对于手动后端订单,您可以尝试使用woocommerce_before_save_order_item专用的动作挂钩,方法如下:(基于您的问题代码的代码)

add_action( 'woocommerce_before_save_order_item','action_before_save_order_item_callback' );
function action_before_save_order_item_callback( $item ) {
    $cost_centre = $item->get_meta('_cost_centre');
    // If custom meta data is not saved as order item
    if ( empty($cost_centre) ) {
        // Get custom meta data from the product
        $cost_centre = get_post_meta( $item->get_product_id(),'_cost_centre',true );
        $cost_centre = empty($cost_centre) ? 'MFEG' : $cost_centre;
        
        // Save it as custom order item (if defined)
        $item->update_meta_data( '_cost_centre',$cost_centre );
    }
}

代码进入活动子主题(或活动主题)的functions.php文件中。 经测试可正常工作


添加:使订单项自定义元数据对客户可见

如果您希望此订单项元数据在客户订单和电子邮件通知上可见,请按照以下步骤将订单项元键从'_cost_centre'替换为'Cost centre'

add_action( 'woocommerce_before_save_order_item','Cost centre',true );
        $cost_centre = empty($cost_centre) ? 'MFEG' : $cost_centre;
        
        // Save it as custom order item (if defined)
        $item->update_meta_data( 'Cost centre',$cost_centre );
    }
}

这一次它将在客户订单和电子邮件上可见。

您还需要将问题代码的最后一个功能更改为:

// Order items: Save product "Cost centre" as visible order item meta data
add_action('woocommerce_checkout_create_order_line_item','save_file_type_as_order_item_meta',20,4);
function save_file_type_as_order_item_meta($item,$cart_item_key,$values,$order) {
    if ( $cost_centre = $values['data']->get_meta('_cost_centre') ) {
        $item->update_meta_data( 'Cost centre',$cost_centre ); // Save as order item (visible everywhere)
    }
}

注意:当订单项自定义元键以下划线开头时,它是隐藏的。