Wordpress Woocommerce-can';是否不使用快速订购单页店铺作为客人添加到购物车?
使用插件@ 看起来,如果我作为管理员的普通用户登录,我就可以很好地将项目添加到购物车中。但是,如果我以来宾身份添加到购物车,它会执行ajax请求并返回“1”,但该项目从未添加到购物车 有人知道为什么会这样吗?我在网站上停用的另外两个插件仍然可以复制,所以我相信这是这个插件中的一个bug 编辑:我确认应用了“客人可以结帐”设置框,所以似乎不是这样 编辑#2:以下是添加到购物车fn:Wordpress Woocommerce-can';是否不使用快速订购单页店铺作为客人添加到购物车?,wordpress,woocommerce,Wordpress,Woocommerce,使用插件@ 看起来,如果我作为管理员的普通用户登录,我就可以很好地将项目添加到购物车中。但是,如果我以来宾身份添加到购物车,它会执行ajax请求并返回“1”,但该项目从未添加到购物车 有人知道为什么会这样吗?我在网站上停用的另外两个插件仍然可以复制,所以我相信这是这个插件中的一个bug 编辑:我确认应用了“客人可以结帐”设置框,所以似乎不是这样 编辑#2:以下是添加到购物车fn: function wqo_add_prod(pid,vid){ var qty= jQuery('#pr
function wqo_add_prod(pid,vid){
var qty= jQuery('#product_qty_'+vid).val();
if(qty==0){
jQuery('#wqo_alert_info').text('Out of Stock');
jQuery('#wqo_alert_info').show()
setTimeout(function(){jQuery('#wqo_alert_info').hide()}, 1500);
return false;
}
if(vid==0){
qty= jQuery('#product_qty_'+pid).val();
}
var ajax_url = 'http://DOMAIN.com/wp-admin/admin-ajax.php';
jQuery.ajax({
type: "POST",
url:ajax_url,
data : {
'action': 'wqo_addtocart',
'wqo_prod_id': pid,
'wqo_prod_var_id': vid,
'wqo_prod_qty': qty
},
success: function(response){
if(response==1){
jQuery('#wqo_alert_info').text('Added to your cart');
}else{
jQuery('#wqo_alert_info').text(response);
}
jQuery.ajax({
type: "POST",
url:ajax_url,
data : {'action': 'wqo_cart_amount'},
success: function(data){
jQuery('#wqo_cart_price').html(data);
}
});
jQuery('#wqo_alert_info').show()
setTimeout(function(){jQuery('#wqo_alert_info').hide()}, 2000);
}
});
}
编辑#3:php回调的源代码
function wqo_addtocart() {
global $woocommerce;
$vid=$_POST['wqo_prod_var_id'];
$pid=$_POST['wqo_prod_id'];
$vid=$_POST['wqo_prod_var_id'];
$pqty=$_POST['wqo_prod_qty'];
if($vid==0){
$product = WC_Product_Factory::get_product($pid);
}else{
$product = WC_Product_Factory::get_product($vid);
}
$stock=$product->get_stock_quantity();
$availability = $product->get_availability();
if($availability['class']=='out-of-stock'){
echo 'Out of stock';
exit;
}
if($stock!=''){
foreach($woocommerce->cart->cart_contents as $cart_item_key => $values ) {
$c_item_id='';
$c_stock='';
if($values['variation_id']!=''){
$c_item_id=$values['variation_id'];
}else{
$c_item_id=$values['product_id'];
}
$c_stock=$values['quantity']+$pqty;
if($vid==0 && $pid==$c_item_id && $c_stock>$stock){
$product = WC_Product_Factory::get_product($pid);
echo 'You have cross the stock limit';
exit;
}else if($vid==$c_item_id && $c_stock>$stock){
$product = WC_Product_Factory::get_product($vid);
echo 'You have cross the stock limit';
exit;
}
}
}
if($vid==0){
$z=$woocommerce->cart->add_to_cart($pid,$pqty,null, null, null );
}else{
$z=$woocommerce->cart->add_to_cart($pid, $pqty, $vid, $product->get_variation_attributes(),null);
}
echo '1';
exit;
}
在woo quick order/includes/wqo view.php的底部注册(也在上述FN被盗的地方)
编辑4:我认为这是一个会议问题。在调用wqo\u addtocart
的第一个ajax调用中,如果我这样做:
var\u转储($woocommerce->cart->cart\u内容)代码>
它返回数组,主键是$z
返回的哈希
但是,在第二个ajax请求中,这将丢失:
59 function wqo_cart_amount(){
60 global $woocommerce;
61 var_dump($woocommerce->cart->cart_contents);
62 echo $woocommerce->cart->get_cart_total();
63 exit;
64 }
这将返回一个空数组。因此,在第一次和第二次ajax请求之间,它会丢失。答案是:)
WooCommerce对“添加到购物车”功能进行了一些更改
问题在于:
正确的代码应该是:
if ( did_action( 'wp' ) || defined( 'DOING_AJAX' ) ) {
$this->set_cart_cookies( sizeof( $this->cart_contents ) > 0 );
}
我们可以看到hookwp\uajax\uwqo\uaddtocart
?这是当您单击add_to_cart时调用的函数button@XcID-我添加了JS回调,但我认为这是标准的,不是定制的。试图找到那个,但没看到。只是对它的引用<代码>676添加操作(“wp_ajax_wqo_addtocart”、“wqo_addtocart”)
对于第一次调用,它以1
响应,顺便说一句,这意味着成功,但购物车数量甚至没有更新。有一些代码行可以接受更新,但我没有立即在回调中看到任何限制登录用户使用功能的内容。在他们的演示站点上,我能够将项目添加到购物车中,因此问题仍然是特定于您的设置的。您是否已禁用所有插件?切换到默认主题如何?能否尝试修改回调:用echo($z?'1':'0')
替换echo'1'
,ajax调用的响应是什么?谢谢,我的朋友有这个问题,但您的代码解决了它。美好的
// Hook after add to cart
add_action( 'woocommerce_add_to_cart' , 'repair_woocommerce_2_2_8_session_add_to_cart');
function repair_woocommerce_2_2_8_session_add_to_cart( ){
if ( defined( 'DOING_AJAX' ) ) {
wc_setcookie( 'woocommerce_items_in_cart', 1 );
wc_setcookie( 'woocommerce_cart_hash', md5( json_encode( WC()->cart->get_cart() ) ) );
do_action( 'woocommerce_set_cart_cookies', true );
}
}
if ( did_action( 'wp' ) || defined( 'DOING_AJAX' ) ) {
$this->set_cart_cookies( sizeof( $this->cart_contents ) > 0 );
}