使用 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)
}
}
当客户端从前端创建订单时,这可以很好地工作。但是当管理员从后端手动创建订单并添加产品时,自定义元数据不可见。
如何解决手动创建订单的问题,允许将产品自定义字段添加为自定义订单商品数据?
答案 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)
}
}
注意:当订单项自定义元键以下划线开头时,它是隐藏的。