添加可变产品后更新 WooCommerce 购物车 (AJAX)
Updating WooCommerce cart after adding a variable product (AJAX)
我正在覆盖 AJAX 函数以使用 WooCommerce 添加产品,这样我也可以将属性发送到购物车(开箱即用)。
我按照 上的说明进行了操作 - 它满足了我的要求 - 但它并不完全有效。
注销后一切正常。但是当我登录到 Wordpress 时,PHP 覆盖不会 work/gets 被忽略。我没有收到任何错误,也没有产品添加到购物车。我尝试了很多不同的方法,但没有任何帮助。
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' );
以确保它被触发,这在我注销时起作用 - 但在我登录时不起作用。
有人知道为什么吗?
平@helgatheviking
一个更新,如果我将以下内容添加到我的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' );
意思是,一个是给登录管理员的,一个是给普通用户的。不知道为什么我需要两者,因为我看到的每个例子都用这种 extension/override 只提到 wp_ajax_nopriv_$function
希望这对和我有同样问题的人有所帮助。如果有人能向我解释为什么需要这样做,我会很高兴听到。
我正在覆盖 AJAX 函数以使用 WooCommerce 添加产品,这样我也可以将属性发送到购物车(开箱即用)。
我按照
注销后一切正常。但是当我登录到 Wordpress 时,PHP 覆盖不会 work/gets 被忽略。我没有收到任何错误,也没有产品添加到购物车。我尝试了很多不同的方法,但没有任何帮助。
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' );
以确保它被触发,这在我注销时起作用 - 但在我登录时不起作用。
有人知道为什么吗?
平@helgatheviking
一个更新,如果我将以下内容添加到我的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' );
意思是,一个是给登录管理员的,一个是给普通用户的。不知道为什么我需要两者,因为我看到的每个例子都用这种 extension/override 只提到 wp_ajax_nopriv_$function
希望这对和我有同样问题的人有所帮助。如果有人能向我解释为什么需要这样做,我会很高兴听到。