如何在woocommerce管理员订单详细信息页面中保存或更新订单项目元?

时间:2020-07-25 04:19:54

标签: wordpress woocommerce wordpress-theming wordpress-plugin-creation

我只想从仪表板订单详细信息页面设置每个订单商品的商品元键和值。 **我正在尝试提交表单并获取$ _post数据以保存在钩子中,但是它不起作用。如何在订单更新挂钩中捕获我的自定义表单数据?或其他解决方案。感谢您的帮助。**

woocommerce order details screenshot

请在下面查看我的代码:

function get_users_by_role($role, $orderby, $order) {
 $args = array(
    'role'    => $role,
    'orderby' => $orderby,
    'order'   => $order
 );

 $users = get_users( $args );
 return $users;
}

add_action( 'woocommerce_before_order_itemmeta', 'so_32457241_before_order_itemmeta', 10, 3 );
function so_32457241_before_order_itemmeta( $item_id, $item, $_product ){
    // wc_update_order_item_meta($item_id, $key, $value);

 $users = get_users_by_role('field_worker', 'user_nicename', 'ASC');

 echo '<form method="post" action=""><select name="assigned_engineer">';
 echo '<option value="">Select a engineer to assign this job</option>';
 foreach ( $users as $user )
 {
    echo $user->user_email;
    echo '<option value="'.$user->ID.'">'.$user->user_email.'</option>';
 }
 echo '</select><input type="submit" name="set_engineer"></form>';
}

1 个答案:

答案 0 :(得分:0)

这是我的解决方案类似的解决方案,如这篇帖子Save Order item custom field in Woocommerce Admin order pages

function get_users_by_role($role, $orderby, $order) {
  $args = array(
    'role'    => $role,
    'orderby' => $orderby,
    'order'   => $order
  );
  $users = get_users( $args );
  return $users;
}

//Add a custom field
add_action( 'woocommerce_before_order_itemmeta', 'add_order_item_sohag_assigned', 10, 2 );
function add_order_item_sohag_assigned( $item_id, $item ) {
 // Targeting line items type only
 if( $item->get_type() !== 'line_item' ) return;
    
 $users = get_users_by_role('field_worker', 'user_nicename', 'ASC');
 $opts = array();
 foreach ( $users as $user )
 {
    $opts[$user->ID] = $user->user_email;
 }
 woocommerce_wp_select( array(
    'id'            => 'sohag_assigned_'.$item_id,
    'label'         => __( 'Assigned Engineer', 'cfwc' ),
    'description'   => __( 'Select an engineer', 'ctwc' ),
    'desc_tip'      => true,
    'class'         => 'woocommerce',
    'options'       => $opts,
    'value'         => wc_get_order_item_meta( $item_id, '_sohag_assigned' ),
  ) );}

 // Save the custom field value
 add_action('save_post_shop_order', 'save_order_item_sohag_assigned_value');
function save_order_item_sohag_assigned_value( $post_id ){
 if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
    return $post_id;

 if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
    return $post_id;

 if ( ! current_user_can( 'edit_shop_order', $post_id ) )
    return $post_id;

 $order = wc_get_order( $post_id );

 // Loop through order items
 foreach ( $order->get_items() as $item_id => $item ) {
    if( isset( $_POST['sohag_assigned_'.$item_id] ) ) {
        wc_update_order_item_meta( $item_id, '_sohag_assigned', 
  sanitize_text_field( $_POST['sohag_assigned_'.$item_id] ) );
    }
 }
}

// Optionally Keep the new meta key/value as hidden in backend
add_filter( 'woocommerce_hidden_order_itemmeta','additional_hidden_order_itemmeta', 10, 1 );
function additional_hidden_order_itemmeta( $args ) {
 $args[] = '_sohag_assigned';
 return $args;
}
相关问题