add_action( 'woocommerce_cart_calculate_fees',
'wpf_wc_add_cart_fees_by_product_attribute' );
if ( ! function_exists( 'wpf_wc_add_cart_fees_by_product_attribute' ) )
{
function wpf_wc_add_cart_fees_by_product_attribute( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
// Attribute slug => fee per item
$fees = array(
'50ml' => 0.05,
'100ml' => 0.05,
'200ml' => 0.05,
'750ml' => 0.10,
'375ml' => 0.05,
'9pk' => 0.45,
// '12pk' => 0.60,
'15pk' => 0.75,
'18pk' => 0.90,
'24pk' => 1.20,
'30pk' => 1.50,
'crvbox' => 0.25,
);
foreach ( $cart->get_cart() as $cart_item ) {
$product = $cart_item['data'];
$product_id = $cart_item['product_id'];
// $quantity = $cart_item['quantity'];
// Adjust this attribute name to match what you use, e.g., 'pa_size'
$attribute_taxonomy = 'pa_size';
$terms = wc_get_product_terms( $product_id,
$attribute_taxonomy, array( 'fields' => 'slugs' ) );
if ( ! empty( $terms ) ) {
foreach ( $terms as $term_slug ) {
if ( isset( $fees[ $term_slug ] ) ) {
$fee = $fees[ $term_slug ];
// $fee_per_item = $fees[ $term_slug ];
// $total_fee = $fee_per_item * $quantity;
$cart->add_fee( 'CRV Fee - ' .
$product->get_name(), $fee, true );
break; // Prevent multiple fees if multiple matching attributes exist
}
}
}
}
}
}
< /code>
Это работает Octally только для моих отдельных продуктов. < /p>
Но ITE не работает для переменных продуктов, поскольку он занимает первый размер вариации. Независимо от размера пакета в корзине, плата всегда рассчитывается для первого размера 12pk
. Если я прокомментирую строку 12pk в моем коде, она использует следующие 18pk .
Как заставить код работать для простых и переменных продуктов правильным способом, принимая во внимание размер, назначенный продукту (или вариант переменных продуктов)?
Цель состоит в том, чтобы использовать размер атрибута корзины для расчета платы за элемент. < /p> Вот моя попытка кода: < /p> [code]add_action( 'woocommerce_cart_calculate_fees', 'wpf_wc_add_cart_fees_by_product_attribute' );
if ( ! function_exists( 'wpf_wc_add_cart_fees_by_product_attribute' ) ) { function wpf_wc_add_cart_fees_by_product_attribute( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
// Adjust this attribute name to match what you use, e.g., 'pa_size' $attribute_taxonomy = 'pa_size'; $terms = wc_get_product_terms( $product_id, $attribute_taxonomy, array( 'fields' => 'slugs' ) );
$cart->add_fee( 'CRV Fee - ' . $product->get_name(), $fee, true ); break; // Prevent multiple fees if multiple matching attributes exist } } } } } } < /code> Это работает Octally только для моих отдельных продуктов. < /p> Но ITE не работает для переменных продуктов, поскольку он занимает первый размер вариации. Независимо от размера пакета в корзине, плата всегда рассчитывается для первого размера 12pk [/code]. Если я прокомментирую строку 12pk в моем коде, она использует следующие 18pk . Как заставить код работать для простых и переменных продуктов правильным способом, принимая во внимание размер, назначенный продукту (или вариант переменных продуктов)?