Я пытаюсь добавить дополнительную стоимость доставки для всех дополнительных сборов за доставку, которые не рассчитываются от сторонней доставки Компания:
//add additional extra cost to shipping except for local pickup
add_filter( 'woocommerce_package_rates', 'shipping_extra_cost' );
function shipping_extra_cost( $rates ) {
foreach($rates as $key => $rate ) {
$rates[$key]->cost = $rates[$key]->cost + get_field('extra_cost', "51");
}
return $rates;
}
Но тогда дополнительная плата также добавляется к местной доставке. что неправильно.
Я не могу работать с классами доставки WC, потому что это мешает работе сторонней программы расчета стоимости доставки.
Есть ли способ проверить, существует ли «местный самовывоз», а затем исключить из него дополнительную плату?
Вы можете исключить 1 или несколько способов доставки, используя $rate->method_id
Примечание:, потому что get_field()
применяется только при использовании плагина ACF. Я заменил его фиксированным номером, настройте в соответствии с вашими потребностями.
Итак, вы получаете:
function filter_woocommerce_package_rates( $rates, $package ) {
//$field = get_field( 'extra_cost', '51' );
$field = 50;
// Multiple can be added, separated by a comma
$exclude = array( 'local_pickup' );
// Loop through
foreach ( $rates as $rate_key => $rate ) {
// Targeting
if ( ! in_array( $rate->method_id, $exclude ) ) {
// Set the new cost
$rates[$rate_key]->cost += $field;
}
}
return $rates;
}
add_filter( 'woocommerce_package_rates','filter_woocommerce_package_rates', 10, 2 );
Для цели отладки вы можете временно использовать:
function filter_woocommerce_cart_shipping_method_full_label( $label, $method ) {
// Getters
$id = $method->id;
$method_id = $method->method_id;
// Output
$label .= '<span style = "color:red; font-size:20px; display:block;">Id = ' . $id . '</span>';
$label .= '<span style = "color:red; font-size:20px; display:block;">Method id = ' . $method_id . '</span>';
return $label;
}
add_filter( 'woocommerce_cart_shipping_method_full_label', 'filter_woocommerce_cart_shipping_method_full_label', 10, 2 );
Результат: