Включить только бесплатный метод доставки для определенного значения настраиваемого поля в 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);

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 вашей активной дочерней темы (или активной темы). Проверено и работает.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]