我正在重写使用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 :(得分: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
希望这可以帮助任何与我有同样问题的人。如果有人能向我解释为什么需要这样做,我会很高兴听到它。