Изменения доставки WooCommerce, необходимые для поддержки вызовов API доставки HTTP
Расчеты доставки Woocommerce выполняются слишком часто.
Настройка доставки Woocommerce прекрасно работает до тех пор, пока вы не создадите собственный плагин доставки, который использует внешние системы квотирования через вызовы API HTTP, и в этот момент вы понимаете, что стоимость доставки вычисляется без необходимости в десятки раз во время процесса заказа - все замедляется.
Мы осуществляем вызовы API на внешние серверы в нашей австралийской почтовой системе, а также на систему курьерских агрегаторов для получения тарифов на доставку и доставку. Это займет около 5 секунд, чтобы завершить два вызова API и так как calculate_shipping()
Кажется, что функция вызывается при каждом добавлении и изменении корзины, при входе на страницу оформления заказа, а затем при каждом нажатии клавиши для соответствующих полей адреса на странице оформления заказа есть 5-секундные задержки и ненужные HTTP-вызовы повсюду.
Вызовы ajax от каждого нажатия клавиши на странице оформления заказа также, похоже, ставятся в очередь и обрабатываются один за другим, так что пользователь может сидеть и наблюдать в течение 30 секунд, пока заполняются параметры доставки, а затем очищаться несколько раз, прежде чем можно будет выбрать один.
Другое глупое последствие - то, что ошибки, возникающие из-за цитирования неполного адреса, в конечном итоге прокручивают экран до самого верха, где отображаются уведомления, что мешает пользователю завершить ввод адреса.
Таким образом, вопрос в том, как остановить вызов WC calculate_shipping()
пока не будут заполнены все поля доставки и, возможно, последнее поле не потеряло фокус - или какие-либо альтернативные предложения сделать подобное и избежать нескольких вызовов.
Чтобы удалить расчеты доставки для каждого добавления в корзину, я просто протестировал текущий URI запроса и сразу возвращаюсь, если это не так.
if ('https://aaa.bbb/checkout/' !== $_SERVER['HTTP_REFERER']) {
return;
}
Кажется, все в порядке, однако, я ожидаю, что позже возникнут некоторые сложности, так как в противном случае WC будет делать это при каждом добавлении корзины.
На кассе хоть и другая история. Мне нужно, чтобы доставка выполнялась, но не для каждого нового символа, введенного в поле адреса, что, по-видимому, является функциональностью по умолчанию. Кажется, в игре есть таймер, и, если вы набираете адрес больше, чем на несколько секунд, он срабатывает. update_checkout()
или похожий, который вызывает calculate_shipping()
и я в итоге связался с почтовыми серверами и серверами курьеров, чтобы попросить новую цитату. (я уверен, что они устанут от этой атаки DOS)
Я искал сценарий checkout.js, но на самом деле не хочу связываться с функциональностью WC и не могу обновиться, поэтому не уверен, хочу ли я это изменить.
Не актуально на данном этапе
Я хотел бы, чтобы стоимость доставки не рассчитывалась до тех пор, пока все товары не будут в корзине и пользователь не закончил вводить их адрес - все остальное кажется немного глупым.