2015-10-27 2 views
0

Я переопределяю функцию AJAX для добавления продукта с использованием WooCommerce, чтобы я мог также отправлять атрибуты в корзину (что не работает из коробки).Обновление корзины WooCommerce после добавления переменной продукции (AJAX)

Я следовал инструкциям на Update WooCommerce Cart After Adding Variable Product Via AJAX - что делает то, что я хочу - но он не работает полностью.

Все хорошо, когда я вышел из системы. Но когда я вхожу в Wordpress, переопределение PHP не работает/игнорируется. Я не получаю ошибок, и в корзину не добавляется продукт. Я пробовал много разных подходов, но ничего не помогает.

function ajax_add_to_cart_script() { 
    $vars = array('ajax_url' => admin_url('admin-ajax.php')); 
    wp_enqueue_script('wc-variation-add-to-cart', get_template_directory_uri() . '/js/jquery.add-to-cart.js', array('jquery'), null, true); 
    wp_localize_script('wc-variation-add-to-cart', 'WC_VARIATION_ADD_TO_CART', $vars); 
} 

add_action('wp_enqueue_scripts', 'ajax_add_to_cart_script'); 
add_action('wp_ajax_nopriv_woocommerce_add_variation_to_cart', 'so_27270880_add_variation_to_cart'); 

function so_27270880_add_variation_to_cart() { 
    ob_start(); 

    $product_id  = apply_filters('woocommerce_add_to_cart_product_id', absint($_POST['product_id'])); 
    $quantity   = empty($_POST['quantity']) ? 1 : wc_stock_amount($_POST['quantity']); 
    $variation_id  = isset($_POST['variation_id']) ? absint($_POST['variation_id']) : ''; 
    $variations  = ! empty($_POST['variation']) ? (array) $_POST['variation'] : ''; 
    $passed_validation = apply_filters('woocommerce_add_to_cart_validation', true, $product_id, $quantity); 

    if ($passed_validation && WC()->cart->add_to_cart($product_id, $quantity, $variation_id, $variations)) { 

     do_action('woocommerce_ajax_added_to_cart', $product_id); 

     if (get_option('woocommerce_cart_redirect_after_add') == 'yes') { 
      wc_add_to_cart_message($product_id); 
     } 

     // Return fragments 
     WC_AJAX::get_refreshed_fragments(); 

    } else { 

     // If there was an error adding to the cart, redirect to the product page to show any errors 
     $data = array(
      'error' => true, 
      'product_url' => apply_filters('woocommerce_cart_redirect_after_error', get_permalink($product_id), $product_id) 
     ); 

     wp_send_json($data); 

    } 

    die(); 
} 

Я убедившись, что add_action('wp_ajax_nopriv_woocommerce_add_variation_to_cart', 'so_27270880_add_variation_to_cart'); добавляется перед сниппета, чтобы убедиться, что увольняют, который работает, когда я вышел из системы. - но не тогда, когда я вошел в

Каждый получил какой-либо подскажите почему?

Ping @helgatheviking

+0

При входе в систему перейдите в WooCommerce -> Статус системы -> Инструменты, прокрутите вниз и найдите «Режим отладки шаблона», убедитесь, что он не включен. –

+0

Это не включено. – Chris

+0

Кроме того, когда я возвращаю данные в консоли из вызова jQuery AJAX, я возвращаю «0», когда я вошел в систему. Когда я не получаю HTML-код, который ** WC_AJAX :: get_refreshed_fragments(); ** выводит HTML, который я определил в ** woocommerce_header_add_to_cart_fragment ($ fragments) ** – Chris

ответ

0

обновление, кажется, работает, если добавить следующее к моей functions.php

add_action('wp_ajax_nopriv_woocommerce_add_variation_to_cart', 'so_27270880_add_variation_to_cart'); 
add_action('wp_ajax_woocommerce_add_variation_to_cart', 'so_27270880_add_variation_to_cart'); 

Значение, что один для зарегистрированных в админов и один для обычных пользователей. Не уверен, зачем мне это нужно, потому что каждый пример, который я видел с помощью такого расширения/переопределения, упоминает только wp_ajax_nopriv_$function

Надеюсь, это поможет любому, у кого есть такая же проблема, как и я. И если бы кто-нибудь мог объяснить мне, почему это необходимо, я был бы рад услышать это.

Смежные вопросы