Как сохранить или обновить мета элемента заказа на странице сведений о заказе администратора woocommerce?

Я хочу установить мета-ключ и значение элемента для каждого элемента заказа только на странице сведений о заказе на панели инструментов. ** Я пытаюсь отправить форму и получить данные $ _post для сохранения в ловушке, но это не работает . Как я могу поймать данные моей пользовательской формы в обработчике обновления заказа? или какое-то другое решение также ценится. Спасибо за вашу любезную помощь. **

снимок экрана с информацией о заказе на woocommerce

Просмотрите мой код ниже:

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>';
}

person Shakhawat Hossain    schedule 25.07.2020    source источник
comment
comment
Да, это моё решение. Большое спасибо :-)   -  person Shakhawat Hossain    schedule 25.07.2020


Ответы (1)


Вот мое решение, подобное этому сообщению Пользовательское поле для сохранения элемента заказа на страницах заказа администратора Woocommerce

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;
}
person Shakhawat Hossain    schedule 25.07.2020