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
'programing' 카테고리의 다른 글
AngularJS : 디렉티브에서의 최소화 문제 (0) | 2023.03.14 |
---|---|
PHP json_decode()에서 잘못된 json 데이터를 감지하시겠습니까? (0) | 2023.03.14 |
Java에서 목록을 Json으로 변환하는 방법 (0) | 2023.03.09 |
W3C 인증에 신경을 써야 합니까? (0) | 2023.03.09 |
Respon on Click - 매개 변수를 사용하여 이벤트 전달 (0) | 2023.03.09 |