Как сохранить метаданные пользователя из администратора заказа Woocommerce
У клиентов есть дополнительное поле под названием billing_ean
как часть их платежного адреса.
Я использую следующий код для загрузки, редактирования и сохранения их номера EAN со страницы единого заказа Woocommerce в панели администратора. Код отлично работает при загрузке и редактировании поля, но при его сохранении (обновлении заказа) он вообще не обновляет информацию о своих клиентах.
function customer_ean_edit( $customer_id ){
$eannr = get_user_meta( $customer_id->get_customer_id(), 'billing_eannr', true );
?>
<div class="address">
<p<?php if( !$eannr ) echo ' class="none_set"' ?>>
<strong>EAN nr.:</strong>
<?php echo ( $eannr ) ? $eannr : 'Der er ikke angivet et EAN nr.' ?>
</p>
</div>
<div class="edit_address"><?php
woocommerce_wp_text_input( array(
'id' => 'billing_eannr',
'label' => 'EAN nr.:',
'value' => $eannr,
'wrapper_class' => 'form-field-wide'
) );
?></div>
<?php }
add_action( 'woocommerce_admin_order_data_after_billing_address', 'customer_ean_edit' );
function customer_ean_save( $customer_id ){
update_user_meta( $customer_id->get_customer_id(), 'billing_eannr', sanitize_text_field( $_POST['billing_eannr'] ) );
}
add_action( 'personal_options_update', 'customer_ean_save' ); // edit own account admin
add_action( 'edit_user_profile_update', 'customer_ean_save' ); // edit other account admin
add_action( 'woocommerce_save_account_details', 'customer_ean_save' ); // edit WC account
1 ответ
Решение
Вместо этого попробуйте следующее, где поле, отображаемое на страницах редактирования заказа, и значение сохраняются для метаданных заказа и метаданных пользователя...
Ваш повторный код:
add_action( 'woocommerce_admin_order_data_after_billing_address', 'customer_ean_edit' );
function customer_ean_edit( $order ){
$value = get_user_meta( $order->get_customer_id(), 'billing_eannr', true );
?>
<div class="edit-address"><?php
woocommerce_wp_text_input( array(
'id' => 'billing_eannr',
'label' => __('EAN nr.:', 'woocommerce'),
'placeholder' => '',
'value' => $value,
'wrapper_class' => 'form-field-wide'
) );
?></div><?php
}
add_action('save_post_shop_order', 'customer_ean_save', 50, 3 );
function customer_ean_save( $post_id, $post, $update ) {
// Checking that is not an autosave
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return $post_id;
// Check the user’s permissions (for 'shop_manager' and 'administrator' user roles)
if ( ! current_user_can( 'edit_shop_order', $post_id ) )
return $post_id;
if( isset($_POST['billing_eannr']) ) {
$order = wc_get_order( $post_id );
// Update order post meta data
update_post_meta( $post_id, 'billing_eannr', sanitize_text_field( $_POST['billing_eannr'] ) );
// Update user meta data
update_user_meta( $order->get_customer_id(), 'billing_eannr', sanitize_text_field( $_POST['billing_eannr'] ) );
}
}
Код помещается в файл function.php активной дочерней темы (или активной темы). проверено и работает.