programing

WooCommerce에서 특정 배송 클래스에 대한 배송 방법 숨기기

goodsources 2023. 2. 14. 20:16
반응형

WooCommerce에서 특정 배송 클래스에 대한 배송 방법 숨기기

기본적으로 정액 요금 방식 ID를 만들려고 합니다.flat_rate:7 배송 클래스 "Roller"(ID)를 가진 카트 품목이 있는 경우 비활성화됩니다.92).

제가 시도한 코드는 다음과 같습니다.

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(
        92 => array(
            'flat_rate:7'
        )
    );

    $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]);
            }
        }
    }

    return $available_shipping_methods;
}

배송 클래스 ID는 배송 클래스이며 숨기고 싶다.flat_rate:7할 수 있을 것 같아요.

내 사이트: http://www.minimoto.me/ WordPress: 4.8.4 WooCommerce: 3.1.1

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

업데이트 2019: 대신 다음과 같이 짧고 컴팩트하며 효과적인 방법을 시도해 보십시오.

add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // HERE define your shipping class to find
    $class = 92;
    
    // HERE define the shipping method to hide
    $method_key_id = 'flat_rate:7';
    
    // Checking in cart items
    foreach( $package['contents'] as $item ){
        // If we find the shipping class
        if( $item['data']->get_shipping_class_id() == $class ){
            unset($rates[$method_key_id]); // Remove the targeted method
            break; // Stop the loop
        }
    }
    return $rates;
}

코드가 기능합니다.php 파일 또는 임의의 플러그인 파일에 있는 활성 자식 테마(또는 테마)입니다.

테스트 및 동작.

경우에 따라서는, 배송지로의 배송 방법을 갱신하고 나서, 「정액 운임」의 배송 방법을 무효화/저장하고, 다시 유효/저장할 필요가 있습니다.

관련: WooCommerce에서 특정 배송 클래스에 대한 배송 방법 숨기기

배송 방법 ID와 배송 클래스 ID를 찾으려면 아래를 참조하십시오.


다양한 배송 방법 업데이트(코멘트 관련):

add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // HERE define your shipping class to find
    $class = 92;

    // HERE define the shipping methods you want to hide
    $method_key_ids = array('flat_rate:7', 'local_pickup:3');

    // Checking in cart items
    foreach( $package['contents'] as $item ) {
        // If we find the shipping class
        if( $item['data']->get_shipping_class_id() == $class ){
            foreach( $method_key_ids as $method_key_id ){
                unset($rates[$method_key_id]); // Remove the targeted methods
            }
            break; // Stop the loop
        }
    }
    return $rates;
}

테스트 및 동작...


배송 클래스 ID를 찾는 중입니다.

  1. 아래의 데이터베이스wp_terms테이블:

용어 이름 또는 용어 slug를 검색하면 용어 ID(출고 클래스 ID)가 표시됩니다.

  1. Woocommerce 출하 설정에서 "Flat rate"를 편집하는 경우 브라우저 html 검사 도구를 사용하여 다음과 같은 출하 클래스 환율 필드를 검사합니다.

여기에 이미지 설명 입력

input name Attribute에는 다음과 같은 특징이 있습니다.woocommerce_flat_rate_class_cost_6464는 배송 클래스 아이디입니다.


배송 방법 요금 ID를 가져옵니다.

예를 들어 관련된 배송방식의 레이트 ID를 취득하려면 브라우저 코드인스펙터에서 다음과 같은 각 관련 옵션버튼 속성을 검사합니다.

여기에 이미지 설명 입력

Loic The Aztec의 코드(치어)를 수정함으로써 카트 전체가 아닌 내용물의 배송 등급에 따라 각 패키지배송 방법을 설정할 수 있었습니다.다른 사람에게도 도움이 될 수 있습니다.

// UNSET A SHIPPING METHOD FOR PACKAGE BASED ON THE SHIPPING CLASS(es) OF ITS CONTENTS
add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    foreach( $package['contents'] as $package_item ){ // Look at the shipping class of each item in package

        $product_id = $package_item['product_id']; // Grab product_id
        $_product   = wc_get_product( $product_id ); // Get product info using that id

        if( $_product->get_shipping_class_id() != 371 ){ // If we DON'T find this shipping class ID
            unset($rates['wbs:9:dae98e94_free_ups_ground']); // Then remove this shipping method
            break; // Stop the loop, since we've already removed the shipping method from this package
        }
    }
    return $rates;
}

이 코드를 사용하면 패키지에 '표준' 항목(내 경우 shipping_class_id 371)이 포함되지 않은 경우 '무료 UPS Ground' 배송 설정을 해제할 수 있습니다.

원래의 투고로부터의 시나리오(배송 클래스 y의 경우는 메서드x 를 무효로 합니다)는, 다음과 같이 동작합니다.

// UNSET A SHIPPING METHOD FOR PACKAGE BASED ON THE SHIPPING CLASS(es) OF ITS CONTENTS
add_filter( 'woocommerce_package_rates', 'hide_shipping_method_based_on_shipping_class', 10, 2 );
function hide_shipping_method_based_on_shipping_class( $rates, $package )
{
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    foreach( $package['contents'] as $package_item ){ // Look at the shipping class of each item in package

        $product_id = $package_item['product_id']; // Grab product_id
        $_product   = wc_get_product( $product_id ); // Get product info using that id

        if( $_product->get_shipping_class_id() == 92 ){ // If we DO find this shipping class ID
            unset($rates['flat_rate:7']); // Then remove this shipping method
            break; // Stop the loop, since we've already removed the shipping method from this package
        }
    }
    return $rates;
}

언급URL : https://stackoverflow.com/questions/47718180/hide-shipping-methods-for-specific-shipping-class-in-woocommerce

반응형