Включить только метод бесплатной доставки для определенного значения настраиваемого поля в Woocommerce

Я пытаюсь добавить код, подобный приведенному ниже, в файл functions.php. Общая функция заключается в проверке продуктов в корзине и их настраиваемых полей (post_meta), называемых auto_delivery_default.

Если это определенный текст в пользовательском поле, отображается только бесплатная доставка, если весь другой текст, то отображаются все другие способы доставки.

Вот что я получил до сих пор, но я упускаю из виду что-то, из-за чего это не работает правильно;

function show_free_ship_to_autodelivery ( $autodelivery_rate ) {
$autodelivery_free = array();

foreach( WC()->cart->get_cart() as $cart_item ){
$product = $cart_item['data'];
$product_id = $product->get_id(); // get the product ID

$autodelivery = get_post_meta( $product->get_id(), 'auto_delivery_default', true );

    if( $autodelivery == "90 Days" ) {
            $autodeliveryfree = array();
            foreach ( $rates as $rate_id => $rate ) {
                if ( 'free_shipping' === $rate->method_id ) {
                    $autodelivery_free[ $rate_id ] = $rate;
                    break;
                }
            }
            return ! empty( $autodelivery_free ) ? $autodelivery_free : $autodelivery_rate;
    }
}
}

add_filter( 'woocommerce_package_rates', 'show_free_ship_to_autodelivery', 10);

person user1924165    schedule 19.09.2018    source источник


Ответы (1)


В вашем коде есть некоторые ошибки и ошибки… Вместо этого попробуйте следующее, которое скроет другие способы доставки, когда доступна бесплатная доставка и когда элемент корзины с настраиваемым полем auto_delivery_default имеет значение 90 Days:

add_filter( 'woocommerce_package_rates', 'show_only_free_shipping_for_autodelivery', 100, 2 );
function show_only_free_shipping_for_autodelivery ( $rates, $package ) {
    // Loop through cart items
    foreach( $package['contents'] as $cart_item ){
        if( $cart_item['data']->get_meta('auto_delivery_default') == '90 Days' ) {
            $found = true;
            break; // Stop the loop
        }
    }

    if( ! ( isset($found) && $found ) )
        return $rates; // Exit

    $free = array();
    foreach ( $rates as $rate_id => $rate ) {
        if ( 'free_shipping' === $rate->method_id ) {
            $free[ $rate_id ] = $rate;
            break;
        }
    }
    return ! empty( $free ) ? $free : $rates;
}

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

person LoicTheAztec    schedule 19.09.2018
comment
но является ли get_meta для настраиваемого поля продукта или универсального настраиваемого поля? - person user1924165; 20.09.2018
comment
это имеет смысл. Теперь единственная проблема, с которой я сталкиваюсь, - это бесплатная доставка установки клиента только для продуктов стоимостью более 50 долларов США, любая идея, как я могу принудительно включить опцию бесплатной доставки, скрыть все остальные на основе значения get_meta против 50 долларов США без изменения настроек клиентов. - person user1924165; 20.09.2018
comment
Извините, @LoicTheAztec, я так и сделаю. :D - person user1924165; 20.09.2018
comment
сделал новый вопрос для этого конкретного вопроса, если вы хотите помочь (заголовок stackoverflow.com/questions/52430551/) - person user1924165; 20.09.2018
comment
@user1924165 user1924165 Спасибо, посмотрю… - person LoicTheAztec; 20.09.2018