programing

Ajax를 통한 체크아웃 시 Woocommerce 업데이트 배송 방법

topblog 2023. 3. 14. 21:20
반응형

Ajax를 통한 체크아웃 시 Woocommerce 업데이트 배송 방법

내가 달성하고자 하는 것:woocommerce에서는 사용자가 날짜를 선택할 때 datepicker 필드를 통해 배송된 날짜를 확인하고 그에 따라 ajax를 통해 배송 옵션을 업데이트하여 무료 배송 등이 적절하지 않을 때 배송을 꺼낼 수 있도록 해야 합니다.

현재 알고 있는 것/알고 있는 것: 현재 jQuery 이벤트를 기동하여 커스텀 스크립트로 날짜를 전송하고 있습니다.이것이 제가 해야 할 부분입니다.woocommerce 클래스 내에서는 배송 데이터만 반환하는 기능을 찾을 수 없었기 때문에 이미 체크아웃을 하고 있는 것처럼 호출하여 fragment로 반환할 수 없을 것 같습니다.

하지만, 나는 그것을 발견했다.

WC_AJAX::update_order_review()

액션콜이 들어있고, 그 액션에 성공적으로 함수를 연결해서

t( 'body' ).trigger( 'update_checkout' );

체크 아웃 리뷰 블록을 갱신하는 액션을 기동합니다.

진짜 질문입니다.이 모든 것은 훌륭하고, 올바른 방향으로 가고 있는 것 같습니다만, 필요에 따라서, 후크 동작으로 배송 방법을 파악할 수 있을 만큼 woocommerce를 잘 모릅니다.$woocommerce global object를 통해 WC_AJAX 메서드로 읽을 수 있는지 아는 사람 있나요?

어떤 도움이라도 주시면 감사하겠습니다.

** 주의: 예, jQuery에서 "$"가 아닌 "t"로 표시됩니다.틀리지 않다

따라서 이것이 필요한 분들을 위해 배송 및 결제 옵션에 대한 카트/체크아웃 값 출력을 처리하는 방식 때문에 woocommerce에서 약간의 미세조정이 필요했지만, 결국 woocommerce의 후크 및 매우 적은 플러그인 수정으로 실행할 수 있어 매우 깔끔한 솔루션입니다.

기본적으로는 woocommerce 세션과 2개의 훅, 체크아웃 오더 리뷰를 갱신하는 Javascript 트리거를 사용했습니다.

를 조합하여woocommerce_checkout_update_order_review에서 일어나는 훅WC_AJAX::update_order_review상기한 것을 사용한다.$( 'body' ).trigger( 'update_checkout' );체크 아웃 리뷰 블록을 갱신하는 액션에 접속할 수 있습니다.아직까지는 좋아.

하고 값이 있으면 합니다.WC()->session그러면...WC_AJAX::update_order_review ®woocommerce_order_review()을 모두 에 관련된 후크인 훅을 .woocommerce_review_order_before_shipping이 루프되기 전에 배송 할 수 , 「」에서 배송 할 수 있습니다.★★★★★★★★★★★★★★★★★★,wc_cart_totals_shipping_html().

지금, 당신이 생각하는 건 알아요, 잠깐만요, 쇼핑 카트가 아니라 체크아웃 배송 방법이 필요하지만, 실제로는 같은 것 같아요.

제 낭비된 시간이 비슷한 문제를 겪고 있는 다른 사람에게 도움이 되기를 바랍니다.

건배.

편집: 이 답변은 아마도 오래되었을 것입니다.

카트를 갱신하고 싶은 유저:

foreach (WC()->cart->get_cart() as $key => $value) {
    WC()->cart->set_quantity($key, $value['quantity']+1);
    WC()->cart->set_quantity($key, $value['quantity']);
    break;
}

수량을 변경했다가 다시 변경합니다.그런 다음 Woocommerce는 배송비를 다시 계산합니다.

(코드 브라우징에 5시간 이상 소요되었습니다.다음 번에는 커스터마이즈 가능한 좋은 틀을 사용할 수 있는 독자적인 ecom을 작성하겠습니다.

그래서 Trevor의 답변은 제게는 효과가 없었습니다(아마 WC가 만들어진 이후로 바뀌었을 것입니다). 하지만 그것은 저를 올바른 방향으로 이끌었습니다.

저는 약간 다른 필터를 사용했어요.제가 해결해야 할 문제는 커스텀 필드에 따라 특정 배송 옵션을 추가/삭제하는 것이었습니다.

add_action('woocommerce_checkout_update_order_review', function ($rawFields) {
            // This function checks for the value of my custom field on the checkout page.
            parse_str($rawFields, $checkoutFields);
            $this->myField = $checkoutFields['my_field'] ?? null;
});

add_filter('woocommerce_shipping_packages', 'modifyShippingPackages']);

public function modifyShippingPackages($packages)
    {
        if ($this->myField) {
            //.. modify $packages. In my case, I had to remove shipping methods.
            $rates = $packages[0]['rates'];

            $newRates = array_filter($rates, function ($shippingRate)
            {
                // figure out what should be in the rates
            });

            $packages[0]['rates'] = $newRates;

            $session = WC()->session;
            $session->set('shipping_method_counts', [count($newRates)]);
            $session->set('chosen_shipping_methods', [$newRates[0]->id]);
        }

        return $packages;
    }

위의 스니펫은 제 코드의 불완전한 버전이지만, 요점을 이해시킬 수 있을 것입니다.타이핑으로 간단하게 테스트할 수 있습니다.jQuery( 'body' ).trigger( 'update_checkout' ); consolesavascript 솔솔 in in in in in in in in in in in in in .

Trevor에게 알려줘서 고마워.

언급URL : https://stackoverflow.com/questions/29777497/woocommerce-update-shipping-methods-in-checkout-via-ajax

반응형