Вес товара в Woocommerce

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

Проблема в том, что я хочу установить вес товара до того, как товар будет добавлен в корзину. Калькулятор доставки в корзине будет рассчитывать вашу доставку на основе общего веса вашей корзины (WooCommerce Weight Based Shipping).

Я попробовал 2 хука WooCommerce довольно широко, чтобы сделать это без удачи.

add_filter( 'woocommerce_add_cart_item_data', 'update_weight_on_add_to_cart', 10, 3);

а также

add_action( 'woocommerce_add_to_cart', 'update_weight_on_add_to_cart', 10, 6 );

Я могу установить пользовательские поля, используя add_filter. Делая это, я вижу, что я успешно установил вес продукта на что-то новое. НО, как только я попадаю на страницу корзины, вес возвращается к тому, что установлено на странице редактирования продукта.

Это функция, которую я сейчас использую, чтобы проверить, что:

function update_weight_on_add_to_cart( $cart_item_data, $product_id, $variation_id )
{
$product = wc_get_product( $product_id );

$weight1 = $product->get_weight();

$product->set_weight(3.45);
$weight2 = $product->get_weight();

$cart_item_data['weight1'] = $weight1;
$cart_item_data['weight2'] = $weight2;

return $cart_item_data;
}

Затем я отображаю эти поля в корзине, чтобы увидеть, успешно ли я изменил данные, используя следующую функцию и функцию. (Я взял большую часть этого из сообщений в блоге или других сообщений StackOverflow)

add_filter( 'woocommerce_get_item_data', 'display_weight', 10, 2 );
function display_weight( $item_data, $cart_item ) {
$item_id = $cart_item['variation_id'];
if($item_id == 0) $item_id = $cart_item['product_id'];
$product_qty = $cart_item['quantity'];
$product = wc_get_product($item_id);
$weight3 = $product->get_weight();

$item_data[] = array(
'key'       => __('Weight3', 'woocommerce'),
'value'     => wc_clean( $weight3 ),
'display'   => ''
);
$item_data[] = array(
'key'     => __( 'Weight1', 'woocommerce' ),
'value'   => wc_clean( $cart_item['weight1'] ),
'display' => ''
);
$item_data[] = array(
'key'     => __( 'Weight2', 'woocommerce' ),
'value'   => wc_clean( $cart_item['weight2'] ),
'display' => ''
);

return $item_data;
}

Мои последние попытки с использованием вышеуказанного кода привели к следующему на странице корзины.

Weight3: 1

Вес1: 1

Weight2: 3,45

Любая помощь будет оценена! Если это невозможно сделать таким образом, есть ли лучший способ подойти к этому вопросу? Может быть, это нужно сделать в корзине?

1

Решение

Есть некоторые ошибки, ошибки и недостающие части … Вот способ сделать это (для всех типов продуктов, включая варианты продуктов):

// make and save a calculated weight as custom cart item data
add_filter( 'woocommerce_add_cart_item_data', 'add_weight_custom_cart_item_data', 10, 3 );
function add_weight_custom_cart_item_data( $cart_item_data, $product_id, $variation_id ){
// For product variations handling
$product_id = $variation_id > 0 ? $variation_id : $product_id;

// Get an instance of the product object
$product = wc_get_product( $product_id );

// The default product weight
$cart_item_data['weight']['default'] = $product->get_weight();

## ====> HERE YOU CAN MAKE YOUR WEIGHT CALCULATIONS <==== ##
$new_weight_value = 3.45;

// Set the new calculated weight
$cart_item_data['weight']['new'] = 3.45;

return $cart_item_data;
}

add_filter( 'woocommerce_get_item_data', 'display_cart_item_weight', 10, 2 );
function display_cart_item_weight( $item_data, $cart_item ) {
if ( isset($cart_item['weight']) ) {
// Display original weight
if ( isset($cart_item['weight']['default']) ) {
$item_data[] = array(
'key'       => __('Weight (original)', 'woocommerce'),
'value'     => wc_format_weight( $cart_item['weight']['default'] ),
);
}

// Display calculated weight
if ( isset($cart_item['weight']['new']) ) {
$item_data[] = array(
'key'     => __( 'Weight (new)', 'woocommerce' ),
'value'   => wc_format_weight( $cart_item['weight']['new'] ),
);
}
}
return $item_data;
}

// Set the new weight in cart items
add_action( 'woocommerce_before_calculate_totals', 'set_custom_cart_item_weight', 25, 1 );
function set_custom_cart_item_weight( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;

if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;

foreach( $cart->get_cart() as $cart_item ){
if ( isset($cart_item['weight']['new']) ) {
$cart_item['data']->set_weight($cart_item['weight']['new']);
}
}
}

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

введите описание изображения здесь

0

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

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

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