programing

우커머스, 배송 클래스 기준 배송 방법 숨김

muds 2023. 9. 13. 23:59
반응형

우커머스, 배송 클래스 기준 배송 방법 숨김

나는 배송 클래스를 기준으로 한 배송 방법을 제외한 모든 것을 숨기려고 노력하고 있는데, 본질적으로 특정 클래스에 속하는 제품이 선택되면 FedEx 밤샘 방법을 강요하는 것입니다.

코드부터 시작해서 아래와 같이 수정합니다.

add_filter( 'woocommerce_available_shipping_methods', 'hide_shipping_based_on_class' ,    10, 1 );

function check_cart_for_share() {

// load the contents of the cart into an array.
global $woocommerce;
$cart = $woocommerce->cart->cart_contents;

$found = false;

// loop through the array looking for the tag you set. Switch to true if the tag is     found.
foreach ($cart as $array_item) {
$term_list = wp_get_post_terms( $array_item['product_id'], 'product_shipping_class', array( "fields" => "names" ) );

if (in_array("Frozen",$term_list)) {

      $found = true;
      break;
    }
}

return $found;

}

function hide_shipping_based_on_class( $available_methods ) {

// use the function above to check the cart for the tag.
if ( check_cart_for_share() ) {

// remove the rate you want
unset( $available_methods['canada_post,purolator,fedex:FEDEX_GROUND,fedex:GOUND_HOME_DELIVERY'] ); 
}

// return the available methods without the one you unset.
return $available_methods;

}

배송 방법을 숨기고 있는 것 같지는 않습니다.제가 뭘 놓쳤는지...

멀티 사이트 설치입니다. 캐나다 측에서 http://stjeans.harbourcitydevelopment.com 에서 테스트하고 있습니다.

저는 Table Rate 배송 모듈과 FedEx, Purolator 및 Canada Post 모듈을 실행하고 있습니다.

저도 같은 문제가 있었는데 당신의 코드를 수정하는 것이 도움이 되었습니다.한 가지 문제는 "wocommerce_available_shipping_methods" 필터가 wocommerce 2.1에서 더 이상 사용되지 않는다는 것입니다.따라서 새로운 "wocommerce_package_rates"를 사용해야 합니다.비슷한 작업을 위한 WooCommerce 튜토리얼도 있습니다.

그래서 필터 후크를 변경하고 조건이 맞는 경우 모든 배송 방법/요금을 반복하여 고객에게 표시하고 싶은 것을 찾아서 그로부터 새로운 배열을 만들고 이 배열을 반환합니다(단 하나의 항목만 포함).

제 생각에 당신의 문제는 주로 잘못된 미설정($available_methods[...]) 라인에 있었습니다.그렇게 될 리가 없습니다.

제 코드는 이렇습니다.

add_filter( 'woocommerce_package_rates', 'hide_shipping_based_on_class' ,    10, 2 );
function hide_shipping_based_on_class( $available_methods ) {
    if ( check_cart_for_share() ) {
        foreach($available_methods as $key=>$method) {
            if( strpos($key,'YOUR_METHOD_KEY') !== FALSE ) {
                $new_rates = array();
                $new_rates[$key] = $method;
                return $new_rates;
            }
        }
    }
    return $available_methods;
}

경고!wocommerce_package_rates hook은 매번 불이 나는 것이 아니라 카트에 있는 아이템이나 수량을 바꿀 때만 이 난다는 것을 알게 되었습니다.아니면 제가 보기엔 그렇게 보이거든요.어쩌면 카트 콘텐츠에 대해 어떻게든 사용 가능한 요금이 캐시될 수도 있습니다.

만약 누군가가 여기서 비틀거리면 왜 그러는지 궁금해 합니다.woocommerce_package_rates실행 중이 아닙니다.다음 토막글을 사용하여 캐시를 지울 수 있습니다.

/**
 * This implementation will disable the shipping rate cache.
 * To conditionally disable the cache, replace `wp_rand()` with a conditional value. 
 * Changing the conditional value will invalidate the cache.
 * Example: A hidden form field or a query string parameter.
 */
function wc_shipping_rate_cache_invalidation( $packages ) {
    foreach ( $packages as &$package ) {
        $package['rate_cache'] = wp_rand();
    }
    unset($package);

    return $packages;
}
add_filter( 'woocommerce_cart_shipping_packages', 'wc_shipping_rate_cache_invalidation', 100 );

여기에 댓글이 달렸어요.woocommerce_package_rates이 코드 조각에 대한 깃허브 기스트를 가리킨 후크.

벨로우 코드 스니펫을 사용하면 배송 클래스에 따른 배송 방법을 숨길 수 있습니다.자세한 설명은 여기에서 확인할 수 있습니다.

add_filter('woocommerce_package_rates', 'wf_hide_shipping_method_based_on_shipping_class', 10, 2);

function wf_hide_shipping_method_based_on_shipping_class($available_shipping_methods, $package)
{
$hide_when_shipping_class_exist = array(
    42 => array(
        'free_shipping'
    )
);

$hide_when_shipping_class_not_exist = array(
    42 => array(
        'wf_shipping_ups:03',
        'wf_shipping_ups:02',
         'wf_shipping_ups:01'
    ),
    43 => array(
        'free_shipping'
    )
);


$shipping_class_in_cart = array();
foreach(WC()->cart->cart_contents as $key => $values) {
   $shipping_class_in_cart[] = $values['data']->get_shipping_class_id();
}

foreach($hide_when_shipping_class_exist as $class_id => $methods) {
    if(in_array($class_id, $shipping_class_in_cart)){
        foreach($methods as & $current_method) {
            unset($available_shipping_methods[$current_method]);
        }
    }
}
foreach($hide_when_shipping_class_not_exist as $class_id => $methods) {
    if(!in_array($class_id, $shipping_class_in_cart)){
        foreach($methods as & $current_method) {
            unset($available_shipping_methods[$current_method]);
        }
    }
}
return $available_shipping_methods;
}

언급URL : https://stackoverflow.com/questions/23701467/woocommerce-hide-shipping-method-based-on-shipping-class

반응형