сохранить поле выбора на странице оформления заказа

Я новичок в WooCommerce. Я не могу понять, где проблема, вот мой код

Я добавил поле выбора в форму оплаты страницы оформления заказа.

проблема

записи не сохраняются или обновляются при отправке. Проблема в обновлении мета порядка с полем value.value не обновляется в базе данных

// checkout page customization start

global $post, $woocommerce;
// Account select field
add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
function custom_override_checkout_fields($fields) {

$fields['billing']['Account'] = array(
'type'          => 'select',
'class'         => array('billing form-row-wide'),
'label'         => __('Choose an Account'),
'placeholder'   => _x('Account', 'placeholder', 'woocommerce'),
'options'     => array(
'' => __( 'Select Account','' ),
),
'required'    => true,
);
return $fields;

}add_action('woocommerce_checkout_process', 'my_custom_checkout_field_process');
function my_custom_checkout_field_process() {
global $woocommerce;

if (!$_POST['Account'])
$woocommerce->add_error( __('Please enter your Account.'.$_POST['Account']));
}
///**

Проблемная область
значение не обновляется в базе данных

//* Update the order meta with field value
//**/
add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta');
function my_custom_checkout_field_update_order_meta( $order_id ) {
if ($_POST['Account']) update_post_meta( $order_id, 'Account',      esc_attr($_POST['Account']));
}

/**
* Update the user meta with field value
**/
add_action('woocommerce_checkout_update_user_meta', 'my_custom_checkout_field_update_user_meta');
function my_custom_checkout_field_update_user_meta( $user_id ) {
if ($user_id && $_POST['Account']) update_user_meta( $user_id, 'Account', esc_attr($_POST['Account']) );
}

2

Решение

Функции выглядят довольно точно для меня. Вы уверены, что они не обновляются? Или, возможно, у вас возникли трудности с отображением их.

Я немного их подправил. Во-первых, чтобы использовать $posted переменная, которую WooCommerce отправляет функции, хотя это тривиально $_POST должно быть таким же. А во-вторых, вы используете esc_attr() когда вы должны использовать sanitize_text_field(). Первый предназначен для отображения данных в атрибуте HTML, а второй — для очистки перед сохранением.

//* Update the order meta with field value
//**/
add_action('woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta', 10, 2 );

function my_custom_checkout_field_update_order_meta( $order_id, $posted ) {
if ( isset( $posted['Account'] ) ){
update_post_meta( $order_id, 'Account', sanitize_text_field( $posted['Account'] ) );
}
}

/**
* Update the user meta with field value
**/
add_action('woocommerce_checkout_update_user_meta', 'my_custom_checkout_field_update_user_meta', 10, 2 );
function my_custom_checkout_field_update_user_meta( $user_id, $posted ) {
if ( $user_id && isset( $posted['Account'] ) ){
update_user_meta( $user_id, 'Account', sanitize_text_field( $posted['Account'] ) );
}
}
0

Другие решения

Других решений пока нет …