Поддержка WooCommerce Изменить поля адреса в аккаунте

  • Решено denism300

    (@denism300)


    Нужно изменить поля billing address на странице аккаунта woocommerce.
    написал такой фильтр:

    add_filter('woocommerce_my_account_my_address_formatted_address', 'my_account_address_formatted_address_func', 10, 3);
    function my_account_address_formatted_address_func($args, $customer_id, $name)
    {
      unset($args['address_2']);
      $args['phone']  = get_user_meta($customer_id, $name . '_phone', true);
    
      return $args;
    }

    Однако, на выходе получаю пустой массив. Как исправить?

Просмотр 15 ответов — с 1 по 15 (всего 15)
  • Что такое address_2 ?

    Для обращения к полям нужны префиксы billing_ и shipping_

    • Ответ изменён 4 года назад пользователем kword.
    • Ответ изменён 4 года назад пользователем kword.
    Автор denism300

    (@denism300)

    Сделал так:

    add_filter('woocommerce_my_account_my_address_formatted_address', 'my_account_address_formatted_address_func', 10, 3);
    function my_account_address_formatted_address_func($args, $customer_id, $name)
    {
      unset($args[$name . '_address_2']);
      $args[$name . '_phone']  = get_user_meta($customer_id, $name . '_phone', true);
    
      return $args;
    }

    ничего не изменилось

    Если это у вас вызывает такие трудности, почему бы не воспользоваться готовыми плагинами?

    Автор denism300

    (@denism300)

    потому что я не нашел ни одного подходящего под задачу плагина.
    на станице оформления заказа сделан переключатель юр.лицо — физ.лицо, соответственно, при выборе юр.лица реализованы поля ИНН, КПП и т.п. с проверкой на правильность заполнения.
    в ЛК надо так же выводить эти поля, при этом, скрыв все лишнее.

    Подскажете готовый плагин, который это сможет реализовать — буду благодарен.

    попробуйте этот: https://ru.wordpress.org/plugins/saphali-woocommerce-lite/
    у него реализована условная логика.

    Автор denism300

    (@denism300)

    что-то я не нашел в saphali lite условной логики.

    Сочувствую, а она там есть……
    видимо и другие плагины не подошли, потому что «ниасилил»

    Автор denism300

    (@denism300)

    ну так может, подскажете, где она там? ткнете, так сказать, носом?

    В разделе Управление полями есть и логика и все остальные действия с полями

    Автор denism300

    (@denism300)

    ок.
    вот я создал два поля:
    1. Radio — Тип плательщика с двумя значениями
    2. Text — ИНН

    Мне надо, чтобы при выборе плательщика «Физическое лицо» поле ИНН было скрыто, а при выборе «Юридическое лицо» — отображалось и было обязательным.

    Где это сделать в этом плагине?

    ИМХО у вас изначально не правильный подход.
    Я бы юридических лиц сделал бы из адреса доставки, со своим набором полей.

    Автор denism300

    (@denism300)

    вы на вопрос не ответили.
    где в saphali lite условная логика исходя из моих нужд?
    «ниасилили» найти, да?

    так-то я и изначальный вопрос не читал на тот момент -)))
    насчет «исходя из ваших нужд» — нужно руками трогать, умозрительно ничего не скажешь, отсюда очень плохо не видно.

    Автор denism300

    (@denism300)

    какая нелепая попытка съехать…
    зачем тогда советовали плагин, если не читали вопрос?

    [ удалено ]

    В данном примере уберем поле address_2 добавим поле Отчество и поменяем порядок вывода полей в аккаунте.
    form-edit-account.php

    <label for="account_second_name"><?php esc_html_e('Отчество'); ?></label>
    <input type="text" class="woocommerce-Input woocommerce-Input--text form-control" name="account_second_name" id="account_second_name" autocomplete="additional-name" value="<?php echo esc_attr(get_user_meta($user->id, 'account_second_name', true)); ?>" />

    function.php
    Сохраним поле Отчество

    add_action('woocommerce_save_account_details', 'save_additional_fields_account_func', 10, 1);
    function save_additional_fields_account_func($user_id)
    {
        $second_name  = !empty($_POST['account_second_name']) ? $_POST['account_second_name'] : '';
        update_user_meta($user_id, 'account_second_name', $second_name);
    }

    пересоберем поля:

    add_filter('woocommerce_my_account_my_address_formatted_address', 'my_account_address_formatted_addresses', 20, 3);
    function my_account_address_formatted_addresses($address, $customer_id, $address_type)
    {
        $address = array(
            'first_name'  => ucwords(get_user_meta($customer_id, $address_type . '_first_name', true)),
            'last_name'   => ucwords(get_user_meta($customer_id, $address_type . '_last_name', true)),
            'second_name' => ucwords(get_user_meta($customer_id, 'account_second_name', true)), //поле Отчество
            'phone'       => get_user_meta($customer_id, $address_type . '_phone', true),
            'address_1'   => ucwords(get_user_meta($customer_id, $address_type . '_address_1', true)),
            //'address_2'   => ucwords(get_user_meta($customer_id, $address_type . '_address_2', true)), //убираем address_2
            'city'        => get_user_meta($customer_id, $address_type . '_city', true),
            'state'       => get_user_meta($customer_id, $address_type . '_state', true),
            'postcode'    => get_user_meta($customer_id, $address_type . '_postcode', true),
            'country'     => get_user_meta($customer_id, $address_type . '_country', true)
        );
    
    return $address;
    }

    Изменим вывод:

    add_filter('woocommerce_formatted_address_replacements', function ($replacements, $args) {
        // говорим, что теперь {name} состоит из фамилии, имени и отчества
        $replacements['{name}'] = $args['last_name']. ' ' . $args['first_name']. ' ' . $args['second_name'];
        return $replacements;
    }, 10, 2);
    
    add_filter('woocommerce_localisation_address_formats', 'new_address_formats');
    function new_address_formats($formats)
    {
        //меняем порядок, добавляем метки.
        $formats['RU']  = "
            <strong>Покупатель:</strong> {name}\n
            <strong>Компания:</strong> {company}\n
            <strong>Почтовый индекс:</strong> {postcode}\n
            <strong>Страна:</strong> {country}\n
            <strong>Город:</strong> {city}\n
            <strong>Область:</strong> {state}\n
            <strong>Адрес:</strong> {address_1}\n	
        ";
        return $formats;
    }

    как-то так.

    P.S. Уважаемая администрация, просьба рассмотреть возможность автору темы устанавливать запрет просматривать и комментировать темы для определенных пользователей.

    • Ответ изменён 4 года назад пользователем Yui.
    Модератор Yui

    (@fierevere)

    永子

    Уважаемая администрация, просьба рассмотреть возможность автору темы устанавливать запрет просматривать и комментировать темы для определенных пользователей.

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

    А еще не нужно хамить и писать унизительные вещи в адрес других пользователей, даже если они вам не помогли (по вашему мнению)

    • Ответ изменён 4 года назад пользователем Yui.
Просмотр 15 ответов — с 1 по 15 (всего 15)
  • Тема «Изменить поля адреса в аккаунте» закрыта для новых ответов.