Применить комиссию за корзину в Woocommerce

Я пытаюсь программно добавить плату в корзину woocommerce из сценария, который выполняется при отправке формы. Насколько мне известно, я не думаю, что смогу использовать ловушку, поскольку мне нужно применить настраиваемую плату после отправки формы на странице (интеграция с настраиваемым API).

Я пробовал делать в скрипте следующее:

add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );
function woo_add_cart_fee( $cart ){
    $valid = false;

    if ( ! $_POST || ( is_admin() && ! is_ajax() ) ) {
        return;
    }

    if (isset($_POST['coupon_code'])) {
        $code = $_POST['coupon_code'];
        $coupon = new WC_Coupon($code);
        if($coupon->get_amount() != null){
            $valid == true;
        }

        //if not then lets check to see if its a giftcard.
        if($valid == false){
            $api_login="xxxxxx";
            $api_password="xxxxxx";
            $url = "https://xxxxxx.com/xxxxx/xxxxx.svc";
            $client = new SoapClient( $url . "?singleWsdl",
                array(
                "location" => $url,
                "login" => $api_login,
                "password" => $api_password,
                "trace" => 1
                )
            );  

            $request = new StdClass();
            $request->bonId = $code;
            $request->bonType = 'GiftCard';

            // call the correct database
            $request->context = new StdClass();
            $request->context->DatabaseId = 'xxxxx';    

            try {
                $resu = $client->GetBonAvailableAmount($request);
                if (isset($resu->GetBonAvailableAmountResult->Amount)) {
                    $amount = $resu->GetBonAvailableAmountResult->Amount;
                    $cart->add_fee('xxxxxx Gift Card ', floatval('-'.$amount * 0.83333), false, '' );                     
                } else {
                    $response['status'] = 'error';
                    $response['message'] = 'Gift card not recognized.';
                }
            } catch (Exception $e) {

            }
        }
    }
} 

и я вижу, что когда я echo объект корзины, есть объект fee, который содержит все правильные данные.

Кажется, что корзина или итоги не обновляются, если я обновляю страницу, они все равно не отражают ожидаемые мной значения.

Я просмотрел почти все сообщения о переполнении стека и, похоже, не нашел ничего, что решало бы проблему.

Что мне здесь не хватает?


person Lewis Browne    schedule 10.12.2018    source источник
comment
Когда вы говорите «внешний скрипт php» - что вы имеете в виду?   -  person markmoxx    schedule 10.12.2018
comment
Скрипт, который не является частью темы, находится в каталоге с именем /scripts/. Внутри скрипта я загрузил wordpress и т. Д.   -  person Lewis Browne    schedule 10.12.2018
comment
Вы загружаете этот внешний скрипт при загрузке страницы корзины? Это почти наверняка не самый предпочтительный метод. Вам следует использовать хуки, так как это способ WordPress практически все.   -  person markmoxx    schedule 10.12.2018
comment
Я делаю это так, потому что я выполняю вызов ajax, который вычисляет комиссию, чтобы добавить его в ловушку, мне нужно будет попытаться найти соответствующий крючок, который используется для применения кода купона.   -  person Lewis Browne    schedule 10.12.2018
comment
Какое отношение купоны имеют к вопросу?   -  person markmoxx    schedule 10.12.2018
comment
Игнорируйте часть купона. Скрипт выполняется при отправке формы на странице корзины. Я не могу использовать крючок для достижения того, что мне нужно.   -  person Lewis Browne    schedule 10.12.2018
comment
Ответ @LoicTheAztec вам не подходит?   -  person markmoxx    schedule 10.12.2018
comment
Нет, потому что я не могу использовать крючок.   -  person Lewis Browne    schedule 10.12.2018
comment
Единственный способ включить комиссию (и получить расчет) - использовать специальный крючок woocommerce_cart_calculate_fees… Итак, в вашем случае вы можете установить переменную сеанса, чтобы включить эту комиссию…   -  person LoicTheAztec    schedule 10.12.2018
comment
Это помогает? stackoverflow.com/questions/32119053/   -  person markmoxx    schedule 10.12.2018
comment
@LoicTheAztec Не могли бы вы дать мне информацию по этому поводу?   -  person Lewis Browne    schedule 10.12.2018
comment
Вы можете использовать классическую переменную PHP SESSION, COOKIE или некоторые другие методы (включая переменную сеанса Woocommerce). Есть много тем, объясняющих использование. Затем в моей функции с привязкой к ответу вы протестируете переменную сеанса в операторе if, чтобы разрешить сбор. Вы даже можете передать сумму комиссии в переменной сеанса.   -  person LoicTheAztec    schedule 10.12.2018
comment
@LoicTheAztec, я обновил вопрос более подробно.   -  person Lewis Browne    schedule 11.12.2018
comment
@LewisBrowne Где находится связанный с вами сценарий кода, пробовали ли вы установить переменную сеанса php при отправке вашего сценария? Ваш вопрос остается неясным, и никто не может догадаться, что вы делаете.   -  person LoicTheAztec    schedule 11.12.2018
comment
@LoicTheAztec Теперь мне удалось получить плату за добавление в корзину, единственная проблема заключается в том, что когда я перехожу к этапу оплаты, плата исчезает.   -  person Lewis Browne    schedule 11.12.2018
comment
@LewisBrowne Как тебе это удалось? … Добавьте свой новый код в свой вопрос. Помните, что вам нужно использовать woocommerce_cart_calculate_fees хук, чтобы разрешить расчет комиссии повсюду. Без него не получится.   -  person LoicTheAztec    schedule 11.12.2018
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Lewis Browne    schedule 11.12.2018
comment
Добавлен новый код.   -  person Lewis Browne    schedule 11.12.2018
comment
Вы просто сбиваете с толку ... Хук woocommerce_cart_calculate_fees должен использоваться только для добавления платы ... Весь ваш другой код должен быть в другой функции. и вам нужно использовать WC_Session или PHP $ _SESSION, чтобы установить размер комиссии. Затем в ловушке платы вы протестируете переменную сеанса в операторе IF, чтобы применить свой FEE. Не используйте $ _POST в крючке комиссии, так как вы потеряете его при оформлении заказа или если клиент перейдет на другую страницу.   -  person LoicTheAztec    schedule 11.12.2018


Ответы (1)


Вам нужно использовать настраиваемую функцию, подключенную к хуку действия woocommerce_cart_calculate_fees:

add_action( 'woocommerce_cart_calculate_fees', 'add_a_custom_fee', 10, 1 );
function add_a_custom_fee( $cart ) {
        $amount = 20;
        $cart->add_fee( __('Custom fee'), $amount );
}

Код находится в файле function.php вашей активной дочерней темы (или активной темы). Проверено и работает.

person LoicTheAztec    schedule 10.12.2018