Окружение
- CDEKDelivery: 5.1.0
- WordPress / WooCommerce, классический чекаут
- PHP 8.2
- Платёжные шлюзы: WooCommerce Custom Payment Gateway Pro (ID шлюзов — генерируемые хеши, не
cod)
Проблема
В src/Model/Order.php метод определения наложенного платежа жёстко привязан к ID стандартного шлюза WooCommerce:
final public function shouldBePaidUponDelivery(): bool
{
return $this->payment_method === 'cod';
}
Он используется в src/Actions/OrderCreateAction.php (строка 253):
if ($this->order->shipping_total > 0 && $this->order->shouldBePaidUponDelivery()) {
$param['delivery_recipient_cost'] = [
'value' => $this->order->shipping_total + $this->order->shipping_tax,
];
}
В результате магазины с любым нестандартным платёжным шлюзом не могут воспользоваться полем delivery_recipient_cost: условие не выполняется никогда, поле в заказ не попадает, и стоимость доставки не выставляется получателю в пункте выдачи.
Схема у нас распространённая: товар оплачивается онлайн, доставка — получателем при выдаче. Штатными средствами плагина реализовать её нельзя — приходится патчить OrderCreateAction.php после каждого обновления.
Предлагаемое решение
Вариант 1 — настройка в админке
Добавить в настройки метода доставки мультиселект шлюзов, при которых доставку оплачивает получатель — по аналогии с уже существующей automate_wait_gateways. Механика полностью готова: список шлюзов собирается в SettingsFields.php, проверка делается через in_array($order->payment_method, ...) в DispatchOrderAutomationAction.php.
Вариант 2 — минимальный, WP-фильтр
final public function shouldBePaidUponDelivery(): bool
{
return apply_filters(
'cdek_should_be_paid_upon_delivery',
$this->payment_method === 'cod',
$this->order
);
}
Одной строки достаточно, чтобы магазины решали задачу на своей стороне и не правили файлы плагина.
Любой из вариантов решит проблему. Готов протестировать на боевом магазине.
Окружение
cod)Проблема
В
src/Model/Order.phpметод определения наложенного платежа жёстко привязан к ID стандартного шлюза WooCommerce:Он используется в
src/Actions/OrderCreateAction.php(строка 253):В результате магазины с любым нестандартным платёжным шлюзом не могут воспользоваться полем
delivery_recipient_cost: условие не выполняется никогда, поле в заказ не попадает, и стоимость доставки не выставляется получателю в пункте выдачи.Схема у нас распространённая: товар оплачивается онлайн, доставка — получателем при выдаче. Штатными средствами плагина реализовать её нельзя — приходится патчить
OrderCreateAction.phpпосле каждого обновления.Предлагаемое решение
Вариант 1 — настройка в админке
Добавить в настройки метода доставки мультиселект шлюзов, при которых доставку оплачивает получатель — по аналогии с уже существующей
automate_wait_gateways. Механика полностью готова: список шлюзов собирается вSettingsFields.php, проверка делается черезin_array($order->payment_method, ...)вDispatchOrderAutomationAction.php.Вариант 2 — минимальный, WP-фильтр
Одной строки достаточно, чтобы магазины решали задачу на своей стороне и не правили файлы плагина.
Любой из вариантов решит проблему. Готов протестировать на боевом магазине.