Получить поля из формы оформления заказа в calc_shipping - PullRequest
8 голосов
/ 30 марта 2019

Я создаю калькулятор доставки для своего магазина WooCommerce.Мне нужно собрать некоторые дополнительные данные формы от пользователя, чтобы правильно рассчитать доставку.

У меня есть поля формы, добавленные к woocommerce_checkout_after_customer_details.Возможно, я смогу без проблем доставить это на страницу корзины, как только выясню функциональность страницы оформления заказа, поэтому давайте сосредоточимся на этом.

У меня есть класс, расширяющий WC_Shipping_Method с помощью метода calculate_shipping а-ля этот урок .

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

Я также создал пользовательский файл cart-shipping.php, чтобы не отображать какие-либо входные данные для доступного метода в корзине обзора заказов, только метку и стоимость.Так как выбор происходит в моей пользовательской форме, наличие опций здесь не требуется.

  1. Правильно ли я это делаю, или этот подход супер хакер?
  2. Если это правильный подход, как мне получить доступ к дополнительным полям формы в методе calculate_shipping?

Пробовал

Названы последние параметры в моей пользовательской форме shipping_method_*, которая запускает вызов wc-ajax=update_order_review ... который входит в мой класс пользовательских методов доставки, но, похоже, никогда не вызывает метод calculate_shipping.Единственный раз, когда этот метод вызывается, это когда я фактически добавляю товар в заказ.

Также пробовал

Определил все мои возможные варианты доставки и добавил их в Calculate_shipping, как $this->add_rate( $rate );.Я думаю, тогда я могу как-то выбрать один (заставить пользователя в один), когда корзина обновляется через update_order_review AJAX вызова?Опять же, опция set должна определяться этими полями, с которыми пользователь взаимодействует в форме оформления заказа.Но я еще не понял, как настроить доставку на это действие.

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

calculate_shipping() - это не всегда с именем

Прежде всего, вы должны знать, что метод calculate_shipping() класса вашего метода доставки будет вызываться только тогда, когда расчитаны тарифы на доставку дляв первый раз (в текущем сеансе WooCommerce), каждый раз после добавления товара в корзину и при каждом изменении адреса доставки - со страницы корзины или оформления заказа.

Но, конечно, плагин илиПользовательский код может программно вызывать метод (или пересчитывать ставки) в любое время.Однако стандартное поведение выглядит следующим образом:

Тарифы сохраняются в сеансе на основе хэша пакета , чтобы избежать повторного расчета загрузки каждой страницы .

И метод calculate_shipping() выполняется классом WC_Shipping через его метод calculate_shipping_for_package().Фактически, приведенная выше цитата была взята из описания WC_Shipping::calculate_shipping_for_package(), которое вызывает WC_Shipping_Method::get_rates_for_package() и, в конечном итоге, метод calculate_shipping() в вашем собственном классе.

Как получить представленное значениеполя формы в форме проверки из calculate_shipping() метода

Так что если у вас есть это в форме проверки:

<input type="text" name="my_field"...>

Тогда вы можете получить отправленные (POST ed) значение с использованием $_POST суперглобального или WC_Checkout::get_value() метода:

  1. $_POST['my_field']

  2. WC()->checkout->get_value( 'my_field' )

Это так просто.:)


Чтобы убедиться, что метод Calculate_shipping вызван

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

$packages = WC()->cart->get_shipping_packages();
foreach( $packages as $package_key => $package ) {
    $session_key  = 'shipping_for_package_'.$package_key;
    $stored_rates = WC()->session->__unset( $session_key );
}
0 голосов
/ 07 апреля 2019

Я не уверен, что это лучший способ сделать это, но в настоящее время я делаю эту работу, устанавливая значение сеанса на woocommerce_checkout_update_order_review и затем получая доступ к этому значению в моем методе calculate_shipping.

0 голосов
/ 04 апреля 2019

Глядя на документацию WooCommerce, кажется, что желаемый способ доступа к таким вещам, как местоположение пользователя, из функции calculate_shipping - это использовать их API настроек.https://docs.woocommerce.com/document/settings-api/. Прочитайте документы, чтобы увидеть, как именно, но вот упрощение:


Прочитайте местоположение, используя
$this->init_settings();
$this->location = $this->settings['location'];

Запись / установка местоположения пользователя с помощью этой таблицы:

<?php function admin_options() {
     ?>
    <h2><?php _e('You plugin name','woocommerce'); ?></h2>
     <table class="form-table">
     <?php $this->generate_settings_html(); ?>
     </table><?php
     }

Таблица будет составлена ​​из

function init_form_fields() {
     $this->form_fields = array(
     'location' => array(
          'title' => __( 'Location', 'woocommerce' ),
          'type' => 'text',
          'description' => __( 'This is the users address.', 'woocommerce' ),
          'default' => __( 'none', 'woocommerce' )
          )
     );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...