Я использую WooCommerce с плагином WPML.Я хочу реализовать функцию при оформлении заказа, когда клиент при определенных условиях может обновить свой продукт, но сохранить прежнюю цену продукта.
Продукты являются переменными со многими переменными атрибутами.Поэтому, в частности, я хочу, чтобы, если покупатель выбрал конкретный вариант продукта с x ценой при оформлении заказа (при определенных условиях), я мог бы изменить его товар в корзине с другим вариантом продукта, но оставить цену x.
Сначала я попытался изменить только название продукта с помощью крюка woocommerce_order_item_name
, но это изменение не последовало в заказе.Это важно, потому что некоторые данные заказа затем отправляются в API.
Впоследствии я использовал " Изменение имен элементов корзины WooCommerce " код ответа, который отлично работал для моегоЦель, пока я не установил WPML.По какой-то причине метод WC_Cart
set_name()
не работает с WPML.Я открыл ветку поддержки , но они все еще не могут найти решение.
Кто-нибудь может предложить другое решение?
Обновление
Я попробовал подход, при котором я удаляю товар в корзине, а затем добавляю тот, который мне нужен.После того, как я использую set_price (), чтобы изменить цену вновь добавленного элемента.Удаление / добавление, похоже, работает, но цена не изменяется на одном языке и не применяется на обоих языках после размещения заказа.Вот код, который я использую:
function berrytaxiplon_change_product_name( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Loop through cart items
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
// Get an instance of the WC_Product object
$product = $cart_item['data'];
// Get the product name (Added Woocommerce 3+ compatibility)
$product_id = method_exists( $product, 'get_parent_id' ) ? $product->get_parent_id() : $product->post->post_parent;
if ( ICL_LANGUAGE_CODE == 'en') {
if (isset($cart_item['s-member-level']) && $cart_item['s-member-level'] == 3 && $product_id == 12) {
$new_product = wc_get_product( 82 );
$atrributes = $product->get_attributes('view');
foreach ($atrributes as $atrribute_key => $atrribute_value) {
$new_attributes['attribute_' . $atrribute_key] = strtolower($atrribute_value);
}
$new_variation_id = find_matching_product_variation_id(82, $new_attributes);
$cart->remove_cart_item( $cart_item_key );
$cart->add_to_cart( 82, 1, $new_variation_id, $new_attributes, $cart_item );
foreach ( WC()->cart->get_cart() as $new_item ) {
$new_item['data']->set_price( $cart_item['s-fare'] );
}
}
} else {
if (isset($cart_item['s-member-level']) && $cart_item['s-member-level'] == 3 && $product_id == 282) {
$new_product = wc_get_product( 303 );
$atrributes = $product->get_attributes('view');
foreach ($atrributes as $atrribute_key => $atrribute_value) {
$new_attributes['attribute_' . $atrribute_key] = strtolower($atrribute_value);
}
$new_variation_id = find_matching_product_variation_id(303, $new_attributes);
$cart->remove_cart_item( $cart_item_key );
$cart->add_to_cart( 303, 1, $new_variation_id, $new_attributes, $cart_item );
foreach ( WC()->cart->get_cart() as $new_item ) {
$new_item['data']->set_price( $cart_item['s-fare']);
}
}
}
}
}
add_action( 'woocommerce_before_calculate_totals', 'berrytaxiplon_change_product_name', 10, 1 );
Есть идеи, почему метод set_price () не применяется?
Обновление 2
WPMl использует'woocommerce_before_calculate_totals' и переопределяет действие, добавленное к functions.php
Поддержка WPML предоставила решение с использованием 3 фильтров:
https://wpml.org/forums/topic/cant-use-set_name-method-for-the-product-object-on-checkout/#post-3977153