Я создаю особый тип интернет-магазина, используя плагин Woocommerce и Extra Product Options, и столкнулся с проблемой веса товаров.
Я хочу изменить вес каждого продукта внутри корзины, в зависимости от выбранного атрибута, без удачи. Я использую это, чтобы изменить вес без какого-либо успеха.
add_action( 'woocommerce_before_calculate_totals', 'add_custom_weight', 10, 1);
function add_custom_weight( WC_Cart $cart ) {
if ( sizeof( $cart->cart_contents ) > 0 ) {
foreach ( $cart->cart_contents as $cart_item_key => $values ) {
$_product = $values['data'];
//very simplified example - every item in cart will be 100 kg
$values['data']->weight = '100';
}
}
var_dump($cart->cart_contents_weight);
}
var_dump возвращает вес корзины без изменений (если он был 0,5 до моего изменения, он останется 0,5) и, конечно, стоимость доставки (в зависимости от веса) останется неизменной. Есть идеи?
Поскольку WooCommerce 3+, вам нужно будет использовать WC_Product
методы на WC_Product
объекты. Вот функциональный способ сделать это:
add_action( 'woocommerce_before_calculate_totals', 'add_custom_weight', 10, 1);
function add_custom_weight( $cart_object ) {
if ( (is_admin() && ! defined( 'DOING_AJAX' ) ) || $cart_object->is_empty() )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
foreach ( $cart_object->get_cart() as $cart_item ) {
//very simplified example - every item in cart will be 100 kg
$cart_item['data']->set_weight( 100 );
}
// Testing: cart weight output
echo '<pre>Cart weight: '; print_r( $cart_object->get_cart_contents_weight() ); echo '</pre><br>';
}
Этот код находится в файле function.php вашей активной дочерней темы (или темы), а также в любом файле плагина.
Этот код протестирован и работает.
Других решений пока нет …