Woocommerce - Как настроить выходные данные?

Я настраиваю страницу "Порядок заказа" (order-details.php) в Woocommerce в разделе "Моя учетная запись" (когда пользователь входит в систему), и у нас есть код для печати адресов фактурирования и доставки:

<?php if (!$order->get_formatted_billing_address()) _e( 'N/A', 'woocommerce' ); else echo $order->get_formatted_billing_address(); ?>

Я хотел бы знать, есть ли способ настроить каждый элемент этого вывода. Например: на домашней странице "Моя учетная запись", где показаны адреса фактурирования и доставки клиентов следующим образом:

<?php
    $address = apply_filters( 'woocommerce_my_account_my_address_formatted_address', array(
        'first_name'    => ucwords(get_user_meta( $customer_id, $name . '_first_name', true )),
        'last_name'     => ucwords(get_user_meta( $customer_id, $name . '_last_name', true )),
        'company'       => ucwords(get_user_meta( $customer_id, $name . '_company', true )),
        'address_1'     => ucwords(get_user_meta( $customer_id, $name . '_address_1', true )),
        'address_2'     => ucwords(get_user_meta( $customer_id, $name . '_address_2', true )),
        'city'          => get_user_meta( $customer_id, $name . '_city', true ),
        'state'         => get_user_meta( $customer_id, $name . '_state', true ),
        'postcode'      => get_user_meta( $customer_id, $name . '_postcode', true ),
        'country'       => get_user_meta( $customer_id, $name . '_country', true )
    ), $customer_id, $name );

    $formatted_address = $woocommerce->countries->get_formatted_address( $address );

    if ( ! $formatted_address )
        _e( 'You have not set up this type of address yet.', 'woocommerce' );
    else
        echo $formatted_address;
?>

Это что-то вроде того, что я хочу использовать на странице просмотра. Как я могу поместить этот "apply_filters" в этот код?

Ответ 1

Вам нужно добавить 3 фильтра, чтобы изменить вывод адресов на странице "Моя учетная запись" /короткий код для WooCommerce.

Сначала вам нужно будет использовать woocommerce_my_account_my_address_formatted_address для заполнения любых новых значений, которые вы хотите добавить, например, для телефона пользователя.

add_filter( 'woocommerce_my_account_my_address_formatted_address', function( $args, $customer_id, $name ){
    // the phone is saved as billing_phone and shipping_phone
    $args['phone'] = get_user_meta( $customer_id, $name . '_phone', true );
    return $args;
}, 10, 3 ); 

Затем вы используете woocommerce_localisation_address_formats для изменения форматирования адреса - это определяется кодом страны, или вы можете прокручивать массив, чтобы изменить все из них, реорганизовать или добавить поля (телефон).

// modify the address formats
add_filter( 'woocommerce_localisation_address_formats', function( $formats ){
    foreach ( $formats as $key => &$format ) {
        // put a break and then the phone after each format.
        $format .= "\n{phone}";
    }
    return $formats;
} );

Наконец, вам нужно будет обновить woocommerce_formatted_address_replacements, чтобы WooCommerce заменила вашу заменяющую строку фактическими данными.

// add the replacement value
add_filter( 'woocommerce_formatted_address_replacements', function( $replacements, $args ){
    // we want to replace {phone} in the format with the data we populated
    $replacements['{phone}'] = $args['phone'];
    return $replacements;
}, 10, 2 );

Ответ 2

В классе-wc-countries.php указан адрес и адреса по умолчанию для определенных стран. Пример фрагмента ниже, размещенный в ваших functions.php, изменяет форматирование по умолчанию.

function custom_address_formats( $formats ) {
    $formats[ 'default' ]  = "{name}\n{company}\n{address_1} {address_2}\n{postcode} {city}";   
    return $formats;
}
add_filter('woocommerce_localisation_address_formats', 'custom_address_formats');

Посмотрите на упомянутый шаблон, чтобы узнать, какие компоненты адреса вы хотите включить и в каком порядке их отобразить.