Я пытаюсь переписать цену товара в корзине WooCommerce.Проблема в том, что я использую Divi, который включает в себя обновление корзины ajax.Поэтому, когда я перезагружаю страницу оформления заказа, я вижу свои перезаписанные изменения в течение 1-2 секунд (во время загрузки ajax), и после этого данные корзины снова перезаписываются значениями по умолчанию.Я пробовал все, разные хуки, задержки, изменения приоритетов, но ничего не работает.
Это мой исходный код:
add_filter( 'woocommerce_calculate_totals', 'custom_cart_items_prices', 1000, 1 )
function custom_cart_items_prices( $cart_object ) {
$title = $_GET['form-title'];
$money = $_GET['money'];
if ($title && $money) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Iterating through cart items
foreach ( $cart_object->get_cart() as $cart_item ) {
// Get an instance of the WC_Product object
$wc_product = $cart_item['data'];
// Get the product name (WooCommerce versions 2.5.x to 3+)
$original_name = method_exists( $wc_product, 'get_name' ) ? $wc_product->get_name() : $wc_product->post->post_title;
// SET THE NEW NAME
$new_name = $title;
// Set the new name (WooCommerce versions 2.5.x to 3+)
if( method_exists( $wc_product, 'set_name' ) )
$wc_product->set_name( $new_name );
else
$wc_product->post->post_title = $new_name;
}
// Updated cart item price
$cart_item['data']->set_price( $money );
}}
Картинка во время загрузки (все отлично выглядит):
Когда загрузка будет завершена:
Обновление - я также попробовал другой подход, поскольку яЯ использую пользовательскую форму, созданную с помощью плагинов CRED Toolset и Toolset Woocommerce, где клиент создает продукт с пользовательским названием и ценой, добавляя в корзину существующий продукт по умолчанию (и перенаправленный на страницу оформления заказа) .Я пытаюсь заменить название и цену товара в корзине на предоставленные данные формы.
Вот мой код:
// Change the product ID
add_filter('cred_commerce_add_product_to_cart', function( $product_id, $form_id, $post_id ) {
error_log($form_id);
if( $form_id == 55 ) {
if (!session_id()) {
session_start();
}
$_SESSION['target_post_id'] = $post_id;
if(isset($_POST['product-id'])){
$product_id = $_POST['product-id'];
$_SESSION['target_post_id'] = $post_id;
}
}
return $product_id;
}, 20, 3);
// change the price in cart
add_action('woocommerce_before_calculate_totals', function(){
session_start();
if($form_id != 55 && !isset($_SESSION['target_post_id']))return;
global $woocommerce;
$post_id = $_SESSION['target_post_id'];
$price = 0;
foreach ( $woocommerce->cart->get_cart() as $key => $cart_item ) {
$product_id = $cart_item['data']->get_id();
$adult_price = get_post_meta($product_id, 'wpcf-prezzo-1', true);
$adult_num = get_post_meta($post_id, 'wpcf-adult-number', true);
$child_price = get_post_meta($product_id, 'wpcf-prezzo-2', true);
$child_num = get_post_meta($post_id, 'wpcf-children-number', true);
$price = $adult_price * $adult_num + $child_price * $child_num;
$cart_item['data']->set_price($price);
}
}, 999);
Но он тоже не работает.
Как я могу получить данные отправленной формы (пользовательское название и цена) иперезаписать название корзины и цену в Woocommerce?