Как сохранить метаданные пользователя из администратора заказа 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 активной дочерней темы (или активной темы). проверено и работает.

Другие вопросы по тегам