Как в плагине WooCommerce Deposits при выборе полной оплаты сделать скидку 10%?
Суть такая. Установлен плагин WooCommerce Deposits. Сделаны все настройки для выбора частичной оплаты (30% от общей суммы) и есть выбор полной оплаты. Так вот - Как сделать, что бы при выборе полной оплаты сделать скидку 10% и сумма выставленная к оплате (total) пересчитывалась и отображалась?
Дополнительные вопросы
Ответы:
Это решается с помощью функции:
// Функция для расчета скидки function custom_discount_total( $total, $cart ) { // Проверяем, выбрана ли полная оплата if ( isset( $_POST['wc_deposit_option'] ) && $_POST['wc_deposit_option'] === 'full' ) { // Применяем скидку 10% $total -= $total * 0.1; } return $total; } add_filter( 'woocommerce_cart_total', 'custom_discount_total', 10, 2 ); // Функция для обновления суммы к оплате на странице оформления заказа function custom_update_order_review( $data ) { // Проверяем, выбрана ли полная оплата if ( isset( $_POST['wc_deposit_option'] ) && $_POST['wc_deposit_option'] === 'full' ) { // Получаем общую сумму заказа $total = WC()->cart->get_total(); // Применяем скидку 10% $total -= $total * 0.1; // Обновляем сумму к оплате на странице оформления заказа $data['payment_total'] = wc_price( $total ); } return $data; } add_filter( 'woocommerce_get_order_item_totals', 'custom_update_order_review', 10, 1 ); |
// Функция для расчета скидки function custom_discount_total( $total, $cart ) { // Проверяем, выбрана ли полная оплата if ( isset( $_POST['wc_deposit_option'] ) && $_POST['wc_deposit_option'] === 'full' ) { // Применяем скидку 10% $total -= $total * 0.1; } return $total; } add_filter( 'woocommerce_cart_total', 'custom_discount_total', 10, 2 ); // Функция для обновления суммы к оплате на странице оформления заказа function custom_update_order_review( $data ) { // Проверяем, выбрана ли полная оплата if ( isset( $_POST['wc_deposit_option'] ) && $_POST['wc_deposit_option'] === 'full' ) { // Получаем общую сумму заказа $total = WC()->cart->get_total(); // Применяем скидку 10% $total -= $total * 0.1; // Обновляем сумму к оплате на странице оформления заказа $data['payment_total'] = wc_price( $total ); } return $data; } add_filter( 'woocommerce_get_order_item_totals', 'custom_update_order_review', 10, 1 );
eratnikstudio @eratnikstudio Автор вопроса There has been a critical error on this website. Сайт выдал критическую ошибку). Я тоже пробывал так - но что то не так))
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Скидку 10% при полной оплате нужно делать не просто визуально, а через пересчёт корзины/заказа. В WooCommerce правильное место для скидки — fee с отрицательным значением через
woocommerce_cart_calculate_fees. Но с WooCommerce Deposits нужно понять, где плагин хранит выбранный режим оплаты: в session, POST или cart item meta.Общая схема:
add_action('woocommerce_cart_calculate_fees', function ($cart) { if (is_admin() && ! defined('DOING_AJAX')) { return; } $is_full_payment = WC()->session ? WC()->session->get('full_payment_selected') : false; if (! $is_full_payment) { return; } $discount = $cart->get_subtotal() * 0.10; $cart->add_fee('Скидка за полную оплату', -$discount); });
Этот код не готов для вашего плагина, потому что ключ
full_payment_selectedусловный. Нужно найти реальный ключ, который ставит WooCommerce Deposits. Посмотрите POST-запрос при переключении оплаты, session WooCommerce или документацию плагина.Если плагин меняет totals через AJAX, после выбора полной оплаты нужно вызвать обновление checkout/cart fragments. Иначе сумма пересчитается только после обновления страницы.
Важно: не меняйте напрямую цену товара, если скидка зависит от способа оплаты. Fee понятнее в заказе: видно, что это именно скидка за полную оплату.
Порядок действий: найти признак полной оплаты, сохранить его в сессии, пересчитать корзину через fee, проверить корзину, checkout, письмо и админку заказа.