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

时间:2020-09-23 14:35:57

标签: php wordpress woocommerce custom-fields orders

使用 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', 'woocommerce' ), // Default displayed option value
            'YDIT'   => __( 'YDIT', 'woocommerce' ),
        )
    ) );

    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)
    }
}

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

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

1 个答案:

答案 0 :(得分:2)

更新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', '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 );
    }
}

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

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

// 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)
    }
}

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