evox
evox

Reputation: 45

How to save and display user meta from Woocommerce order admin

Customers have an extra field called billing_ean as part of their billing address.

I'm using the following code to load, edit, and save their EAN number from the Woocommerce single order page in the admin panel. The code works perfectly in loading and editing the field, but when saving it (updating the order), it doesn't update their customer information at all.

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

Upvotes: 1

Views: 1460

Answers (1)

LoicTheAztec
LoicTheAztec

Reputation: 254378

Try the following instead, where the field displayed in order edit pages and the value is saved to order meta data and user meta data…

Your revisited code:

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

Code goes in function.php file of the active child theme (or active theme). tested and works.

Upvotes: 1

Related Questions