Перезаписать название и цену элемента корзины из данных формы набора инструментов CRED в Woocommerce - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь переписать цену товара в корзине 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 ); 

}}

Картинка во время загрузки (все отлично выглядит):

enter image description here

Когда загрузка будет завершена:

enter image description here


Обновление - я также попробовал другой подход, поскольку яЯ использую пользовательскую форму, созданную с помощью плагинов 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?

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

1 woocommerce_add_cart_item_data

add_filter( 'woocommerce_add_cart_item_data', function($cart_item_data, $product_id, $variation_id ){
    if ( empty( $_GET['form-title'] ) ||  empty( $_GET['money'] ) ) {
        return;
    }
    $title = $_GET['form-title'];
    $money = $_GET['money'];
    $cart_item_data['form-title']   = $title  ;
    $cart_item_data['money']        = $money  ;
    return $cart_item_data;
} ,100,4);

2 woocommerce_before_calculate_totals

add_action( 'woocommerce_before_calculate_totals', 'update_custom_price', 10, 1 );
function update_custom_price( $cart_object ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }
    foreach ( $cart_object->cart_contents as $cart_item_key => $cart_item ) {
        if(isset($cart_item["money"]) ){
            $money = $cart_item["money"] ;
            $cart_item['data']->set_price( $money);
        }
        if(isset($cart_item["form-title"]) ){
            $title = $cart_item["form-title"] ;
        }
        $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;
        }
    }
    return $cart_object ;
}

Надеюсь, это поможет.

0 голосов
/ 25 сентября 2018

Вместо этого попробуйте следующее, поскольку вы используете плагин набора инструментов с пользовательской формой, где вы будете использовать WC_Sessions для хранения идентификатора продукта и изменения цены:

add_filter( 'cred_commerce_add_product_to_cart', 'cred_commerce_add_product_to_cart', 20, 3 );
function cred_commerce_add_product_to_cart( $product_id, $form_id, $post_id ) {
    if( $form_id == 55 && $post_id > 0 ) {
        WC()->session->set( 'cp_id', $post_id );
    }
    return $product_id;
}

add_filter( 'woocommerce_add_cart_item_data', 'filter_add_cart_item_data', 30, 4 );
function filter_add_cart_item_data( $cart_item_data, $product_id, $variation_id ){
    if ( WC()->session->get('cp_id') ) {
        $cp_id   = WC()->session->get('cp_id');
        $product = wc_get_product($cp_id);
        $cart_item_data['cp_price'] = $product->get_regular_price();
        $cart_item_data['cp_title'] = $product->get_title();
    }
    return $cart_item_data;
}

add_action( 'woocommerce_before_calculate_totals', 'custom_cart_items_price', 30, 1 );
function custom_cart_items_price( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

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

    // Iterating through cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        if( isset($cat_item['cp_price']) && isset($cat_item['cp_title']) ){
            $cart_item['data']->set_price( $cat_item['cp_price'] ); 
            $cart_item['data']->set_name( $cat_item['cp_title'] );
        }
    }
}

Код входит в функцию.PHP-файл вашей активной дочерней темы (или активной темы).Это должно работать.


Некоторые похожие ответы :

0 голосов
/ 24 сентября 2018

Деактивируйте все свои плагины и вуаля!Вы удивительно поймете, что это причина одного.

Включение их один за другим, даст вам знать, какой из них конфликтует.И ... Пожалуйста, подумайте об использовании обмена стеками WordPress для вопросов, связанных с WordPress.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...