2016-09-02 2 views
2

У меня есть преемник для реализации этого кода, чтобы удалить продукт из корзины с помощью Ajax. Но это не работает с переменным продуктом.Удалить переменный продукт из корзины с ajax в woocommerce

/** 
* Remove Cart via Ajax 
*/ 
function product_remove() { 
    global $wpdb, $woocommerce; 
    session_start(); 
    $cart = WC()->instance()->cart; 
    $id = $_POST['product_id']; 
    $cart_id = $cart->generate_cart_id($id); 
    $cart_item_id = $cart->find_product_in_cart($cart_id); 
    if($cart_item_id){ 
     $cart->set_quantity($cart_item_id,0); 
    } 
} 
add_action('wp_ajax_product_remove', 'product_remove'); 
add_action('wp_ajax_nopriv_product_remove', 'product_remove'); 

Может быть, мне нужно пройти $ variation_id до $ cart_id, но я не знаю, как это сделать.

+0

Также есть ошибка, когда я пытаюсь удалить переменный продукт в корзине: PHP Предупреждение: call_user_func_array() ожидает, что параметр 1 будет действительным обратным вызовом, ни один массив или строка не заданы – cutez7boyz

ответ

2

Создайте ссылку на корзину, используя $cart_item_key вместо $product_id.

Затем, на стороне сервера, вам не нужно использовать метод $cart->generate_cart_id($id);, потому что он у вас уже есть.

Смотрите пример, который работает для меня:

Во-первых, создание телеге:

// This is the logic that create the cart 
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) { ?> 
    <li class="<?php echo esc_attr(apply_filters('woocommerce_mini_cart_item_class', 'mini_cart_item', $cart_item, $cart_item_key)); ?>"> 
     // Remove product link 
     <a href="#" onclick="return js_that_call_your_ajax(this);" data-product_id="<?php echo esc_attr($cart_item_key); ?>">&times;</a> 
     // Other product info goes here... 
    </li> 
<?php } 

Теперь модификации на стороне сервера:

/** 
* Remove Cart via Ajax 
*/ 
function product_remove() { 
    global $wpdb, $woocommerce; 
    session_start(); 
    $cart = WC()->instance()->cart; 
    $cart_id = $_POST['product_id']; // This info is already the result of generate_cart_id method now 
    /* $cart_id = $cart->generate_cart_id($id); // No need for this! :) */ 
    $cart_item_id = $cart->find_product_in_cart($cart_id); 
    if($cart_item_id){ 
     $cart->set_quantity($cart_item_id,0); 
    } 
} 
add_action('wp_ajax_product_remove', 'product_remove'); 
add_action('wp_ajax_nopriv_product_remove', 'product_remove'); 

Это прекрасно работает для меня!