Search code examples
phpwoocommercehook-woocommercebilling

Add WooCommerce VAT Number Checkout Page


I added a function to the website according to the instructions. Unfortunately, I have an error in "received order" and in the admin panel "customer order"

/*****************************  FRONTEND  ****************************************/

/**************************

Filter to add a VAT field to:
- My Account - Edit Form -- Billing fields
- Checkout - Edit Form - Billing Fields
This function is also reordering the form fields.
***************************/

function add_woocommerce_billing_fields($billing_fields){

            //reorder woo my billing address form fields
            $billing_fields2['billing_first_name'] = $billing_fields['billing_first_name'];
            $billing_fields2['billing_last_name'] = $billing_fields['billing_last_name'];

            $billing_fields2['billing_vat'] = array(
                        'type' => 'text',
                        'label' =>  __('VAT number',  'keyelp-shop-customization' ),
                        'class' => array('form-row-wide'),
                        'required' => false,
                        'clear' => true
            );
                
            $merged_billing_fields =  $billing_fields2 + $billing_fields;


            return $merged_billing_fields;

}

add_filter('woocommerce_billing_fields' , 'add_woocommerce_billing_fields');


/*********
Filters to add VAT when printing billing address on:
- (1) My account 
- (2) Checkout - Order Received (after checkout completion),
+++ Additional filters to format the printed output.
********/

// (1) Printing the Billing Address on My Account

add_filter( 'woocommerce_my_account_my_address_formatted_address', 'njengah_my_account_my_address_formatted_address', 10, 3 );

function njengah_my_account_my_address_formatted_address( $fields, $customer_id, $type ) {

            if ( $type == 'billing' ) {
                        $fields['vat'] = get_user_meta( $customer_id, 'billing_vat', true );
            }
            return $fields;
}


// (2) Checkout -- Order Received (printed after having completed checkout)

add_filter( 'woocommerce_order_formatted_billing_address', 'njengah_add_vat_formatted_billing_address', 10, 2 );

function njengah_add_vat_formatted_billing_address( $fields, $order ) {

            $fields['vat'] = $order->billing_vat;

            return $fields;

}



// Creating merger VAT variables for printing formatting

add_filter( 'woocommerce_formatted_address_replacements', 'njengah_formatted_address_replacements', 10, 2 );

function njengah_formatted_address_replacements( $address, $args ) {

            $address['{vat}'] = '';
            $address['{vat_upper}']= '';

            if ( ! empty( $args['vat'] ) ) {
                        $address['{vat}'] = $args['vat'];
                        $address['{vat_upper}'] = strtoupper($args['vat']);
            }

            return $address;

}


//Defining the Spanish formatting to print the address, including VAT.

add_filter( 'woocommerce_localisation_address_formats', 'njengah_localisation_address_format' );

function njengah_localisation_address_format( $formats ) {

            $formats['ES'] = "{name}\n{company}\n{vat_upper}\n{address_1}\n{address_2}\n{postcode} {city}\n{state}\n{country}";

            return $formats;

}


/*****************************  ADMIN USER PROFILE PAGE  ****************************************/

/***************

Filter to add VAT Customer meta fields (user profile field on the billing address grouping)

*****************/

add_filter( 'woocommerce_customer_meta_fields', 'njengah_customer_meta_fields' );

function njengah_customer_meta_fields( $fields ) {

            $fields['billing']['fields']['billing_vat'] = array(

                        'label'       => __( 'VAT number', 'njengah' )

            );


            return $fields;

}


/***************************  ADMIN ORDER PAGE  ****************************************/


/********* 

Filter to add VAT to the Edit Form on Order --  Admin page

*********/

add_filter( 'woocommerce_admin_billing_fields', 'njengah_admin_billing_fields' );

function njengah_admin_billing_fields( $fields ) {

            $fields['vat'] = array(
                        'label' => __( 'VAT number', 'njengah' ),
                        'show'  => true
            );

            return $fields;

}

/****************

Filter to copy the VAT field from User meta fields to the Order Admin form (after clicking the dedicated button on the admin page)

******************/


add_filter( 'woocommerce_found_customer_details', 'njengah_found_customer_details' );

function njengah_found_customer_details( $customer_data ) {

            $customer_data['billing_vat'] = get_user_meta( $_POST['user_id'], 'billing_vat', true );

            return $customer_data;

}

The error that appears is

Order properties should not be accessed directly. Backtrace: require('wp-admin/edit-form-advanced.php'), do_meta_boxes, WC_Meta_Box_Order_Data::output, WC_Order->get_formatted_billing_address, apply_filters('woocommerce_order_formatted_billing_address'), WP_Hook->apply_filters, add_vat_formatted_billing_address, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong

what could be the problem?


Solution

  • The error says Order properties should not be accessed directly.

    You have called the order vat metadata like this $order->billing_vat;. Instead you can get the metadata like $order->get_meta('billing_vat'); or by using the function get_post_meta($order->get_id(), 'billing_vat', true);

    Update the function like this.

    // (2) Checkout -- Order Received (printed after having completed checkout)
    
        add_filter( 'woocommerce_order_formatted_billing_address', 'njengah_add_vat_formatted_billing_address', 10, 2 );
        
        function njengah_add_vat_formatted_billing_address( $fields, $order ) {
        
                    $fields['vat'] = get_post_meta($order->get_id(), 'billing_vat', true);
        
                    return $fields;
        
        }