Проблема с настраиваемым полем НДС в Woocommerce - PullRequest
0 голосов
/ 03 августа 2020

Я использую код ниже , чтобы добавить поле НДС в адрес woocommerce. Это работает, но выдает следующую ошибку:

Примечание: billing_vat est appelée de la mauvaise manière. К свойствам заказа нельзя обращаться напрямую. Обратная трассировка: 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_order_formatted_billing_address_address_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress_dress) __get, wc_doing_it_wrong Veuillez lire Débogage dans WordPress (en) pour plus d'informations. (Сообщение об обновлении для версии 3.0.) В / var / www/vhosts/mydomain.be/httpdocs/wp-includes/functions.php в строке 5167

Код:

/*****************************  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

Source:  https://docs.woothemes.com/document/tutorial-customising-checkout-fields-using-actions-and-filters
***************************/
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
    );
    
    //unimos el resto de campos 
    $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 compeltion), 
    
    +++ Additional filters to format the printed output.
    
    ********/
    
    // (1) Printing the Billing Address on My Account
    add_filter( 'woocommerce_my_account_my_address_formatted_address', 'custom_my_account_my_address_formatted_address', 10, 3 );
    function custom_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', 'custom_add_vat_formatted_billing_address', 10, 2 );
    function custom_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', 'custom_formatted_address_replacements', 10, 2 );
    function custom_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', 'custom_localisation_address_format' );
    function custom_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', 'custom_customer_meta_fields' );
    function custom_customer_meta_fields( $fields ) {
        $fields['billing']['fields']['billing_vat'] = array(
            'label'       => __( 'VAT number', 'keyelp-shop-customization' )
        );
    
        return $fields;
    }
    
    /***************************  ADMIN ORDER PAGE  ****************************************/
    
    /*********  
    Filter to add VAT to the Edit Form on:  Order --  Admin page
    *********/
    add_filter( 'woocommerce_admin_billing_fields', 'custom_admin_billing_fields' );
    function custom_admin_billing_fields( $fields ) {
        $fields['vat'] = array(
            'label' => __( 'VAT number', 'keyelp-shop-customization' ),
            'show'  => true
        );
        
        return $fields;
    }
    
    
    /**************** 
    Filter to copy the VAT field from User meta fields to the Order Admin form (after clicking dedicated button on admin page)
    ******************/
    
    add_filter( 'woocommerce_found_customer_details', 'custom_found_customer_details' );
    function custom_found_customer_details( $customer_data ) {
        $customer_data['billing_vat'] = get_user_meta( $_POST['user_id'], 'billing_vat', true );
    
        return $customer_data;
    }

1 Ответ

2 голосов
/ 03 августа 2020

Этот код немного устарел по сравнению с версией WooCommerce 3 2017 года ... Также некоторые другие вещи изменились между ними.

Вот этот измененный код:

add_filter('woocommerce_billing_fields' , 'display_billing_vat_fields');
function display_billing_vat_fields($billing_fields){
    $billing_fields['billing_vat'] = array(
        'type' => 'text',
        'label' =>  __('VAT number',  'woocommerce' ),
        'class' => array('form-row-wide'),
        'required' => false,
        'clear' => true,
        'priority' => 35, // To change the field location increase or decrease this value
    );

    return $billing_fields;
}


// Printing the Billing Address on My Account
add_filter( 'woocommerce_my_account_my_address_formatted_address', 'custom_my_account_my_address_formatted_address', 10, 3 );
function custom_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;
}

// Checkout -- Order Received (printed after having completed checkout)
add_filter( 'woocommerce_order_formatted_billing_address', 'custom_add_vat_formatted_billing_address', 10, 2 );
function custom_add_vat_formatted_billing_address( $fields, $order ) {
    $fields['vat'] = $order->get_meta('billing_vat');

    return $fields;
}

// Creating merger VAT variables for printing formatting
add_filter( 'woocommerce_formatted_address_replacements', 'custom_formatted_address_replacements', 10, 2 );
function custom_formatted_address_replacements( $replacements, $args  ) {
    $replacements['{vat}'] = ! empty($args['vat']) ? $args['vat'] : '';
    $replacements['{vat_upper}'] = ! empty($args['vat']) ? strtoupper($args['vat']) : '';

    return $replacements;
}

//Defining the Spanish formatting to print the address, including VAT.
add_filter( 'woocommerce_localisation_address_formats', 'custom_localisation_address_format' );
function custom_localisation_address_format( $formats ) {
    foreach($formats as $country => $string_address ) {
        $formats[$country] = str_replace('{company}\n', '{company}\n{vat_upper}\n', $string_address);
    }
    return $formats;
}


add_filter( 'woocommerce_customer_meta_fields', 'custom_customer_meta_fields' );
function custom_customer_meta_fields( $fields ) {
    $fields['billing']['fields']['billing_vat'] = array(
        'label'       => __( 'VAT number', 'woocommerce' )
    );

    return $fields;
}


add_filter( 'woocommerce_admin_billing_fields', 'custom_admin_billing_fields' );
function custom_admin_billing_fields( $fields ) {
    $fields['vat'] = array(
        'label' => __( 'VAT number', 'woocommerce' ),
        'show'  => true
    );

    return $fields;
}

add_filter( 'woocommerce_found_customer_details', 'custom_found_customer_details' );
function custom_found_customer_details( $customer_data ) {
    $customer_data['billing_vat'] = get_user_meta( $_POST['user_id'], 'billing_vat', true );

    return $customer_data;
}

Код работает. php файл вашей активной дочерней темы (или активной темы). Проверено и работает.

Связанные ответы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...