添加变量产品(AJAX)后更新WooCommerce购物车

时间:2015-10-27 17:37:55

标签: php ajax wordpress woocommerce cart

我正在重写使用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

1 个答案:

答案 0 :(得分: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

希望这可以帮助任何与我有同样问题的人。如果有人能向我解释为什么需要这样做,我会很高兴听到它。