错误:WooCommerce 避免为非登录用户添加到购物车

Posted

技术标签:

【中文标题】错误:WooCommerce 避免为非登录用户添加到购物车【英文标题】:Error with: WooCommerce Avoid add to cart for non logged user 【发布时间】:2020-03-04 22:53:09 【问题描述】:

我想知道是否有人可以帮助我?

我正在使用带有 Woocommerce 插件的 Wordpress 网站。

我正在使用一段代码来避免将我在本网站上找到的未登录客户添加到购物车中,除了一个问题外,它的效果很好。它在产品页面上不起作用。当您单击添加到购物车按钮时,它不会像您按下类别视图页面上的按钮那样重定向到自定义登录页面。相反,页面只是刷新。

我将代码放入functions.php 文件中。然后我试着把它放到其他几个地方,但没有奏效。谁能帮我解决这个问题,让我知道我是否应该将代码放入另一个位置?提前致谢,非常感谢您的帮助!

这是问题的链接,代码如下:WooCommerce Avoid add to cart for non logged user

 // Replacing add-to-cart button in shop pages and archives pages (forn non logged in users)
add_filter( 'woocommerce_loop_add_to_cart_link', 'conditionally_change_loop_add_to_cart_link', 10, 2 );
function quantity_inputs_for_woocommerce_loop_add_to_cart_link( $html, $product ) 
    if ( ! is_user_logged_in() ) 
        $link = get_permalink($product_id);
        $button_text = __( "View product", "woocommerce" );
        $html = '<a href="'.$link.'" class="button alt add_to_cart_button">'.$button_text.'</a>';
    
    return $html;


// Avoid add to cart for non logged user (or not registered)
add_filter( 'woocommerce_add_to_cart_validation', 'logged_in_customers_validation', 10, 3 );
function logged_in_customers_validation( $passed, $product_id, $quantity) 
    if( ! is_user_logged_in() ) 
        $passed = false;

        // Displaying a custom message
        $message = __("You need to be logged in to be able adding to cart…", "woocommerce");
        $button_link = get_permalink( get_option('woocommerce_myaccount_page_id') );
        $button_text = __("Login or register", "woocommerce");
        $message .= ' <a href="'.$button_link.'" class="login-register button" style="float:right;">'.$button_text.'</a>';

        wc_add_notice( $message, 'error' );
    
    return $passed;

【问题讨论】:

woocommerce_add_to_cart_validation 也应该在产品页面上工作。 woocommerce_loop_add_to_cart_link 仅适用于商店和存档页面。 嗨,对不起,你能澄清一下你的意思吗? 另外,使用下面的代码,我是否将其与我使用的当前代码一起添加? 【参考方案1】:

首先,woocommerce_loop_add_to_cart_link 的函数挂钩不正确。您使用的是conditionally_change_loop_add_to_cart_link 而不是quantity_inputs_for_woocommerce_loop_add_to_cart_link

其次,您的链接 URL 使用当前产品页面 ID,它将指向当前产品页面 URL,而不是另一个页面。

除此之外,您对woocommerce_add_to_cart_validation 的看法基本正确。

编辑:

对于产品单页,如果您查看 Woocommerce 中的 content-single-product.php,则操作 woocommerce_template_single_add_to_cart 似乎可以处理“添加到购物车”表单的外观。如果您不想显示添加到购物车表单,您需要先从 woocommerce_single_product_summary 挂钩中删除该操作。

if(!is_user_logged_in()) 
    remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart',30);

然后在该优先级添加您自己的操作以放入您的消息中:

add_action('woocommerce_single_product_summary', function() 
    global $product_id;
    if(!is_user_logged_in()) 
        $message = __("You need to be logged in to be able adding to cart…", "woocommerce");
        $button_link = get_permalink( get_option('woocommerce_myaccount_page_id') );
        $button_text = __("Login or register", "woocommerce");
        $message .= ' <a href="'.$button_link.'" class="login-register button" style="float:right;">'.$button_text.'</a>';
        echo $message;
    

);

【讨论】:

您好,非常感谢您的帮助,我想您不能澄清第二部分吗?哪个链接,应该是什么?感谢帮助!谢谢, 您有机会查看并澄清一下吗? 第二部分,我的意思是你的代码使用$link = get_permalink($product_id);,其中$product_id是指当前产品ID,get_permalink($product_id);是指你当前产品页面的URL,用户已经开始了。如果您想让他们进入登录页面,您需要使用wc_get_page_permalink('my-account') 非常感谢您的帮助,非常感谢。它在类别页面上运行良好,但在产品页面上似乎不起作用。我已将代码放入 functions.php 文件中,这就是它适用于该类别的地方。我在 content-product.php 文件中进行了尝试,但这只是通过错误,它已经在 functions.php 文件中完成。发生的情况是,当在产品页面上并单击添加到购物车时,它只是重新加载产品页面,而不像在类别视图中那样重定向到自定义登录页面。是否还有其他文件需要进入? 我已更新我的答案以包含单个产品页面。 woocommerce_loop_add_to_cart_link 似乎只适用于产品存档页面。您需要连接到产品单页上的woocommerce_single_product_summary 以修改那里的内容。即从摘要挂钩中删除 woocommerce_template_single_add_to_cart 操作并添加您自己的内容。【参考方案2】:

是的,您只需将以下代码添加到您的活动主题 function.php 文件中即可。

add_filter('woocommerce_get_price_html','login_before_addtocart');

function login_before_addtocart($price)

if(is_user_logged_in() )
return $price;


else 
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart' );
remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30 );

$response .= $price;
$response .= '<br> <a href="' .get_permalink(woocommerce_get_page_id('myaccount')). '">Login</a> to add product into cart';

return $response;
  


【讨论】:

以上是关于错误:WooCommerce 避免为非登录用户添加到购物车的主要内容,如果未能解决你的问题,请参考以下文章

避免在 WooCommerce 结帐中进行计费电话验证

登录重定向后的woocommerce

Wordpress登录页面重定向到普通用户的Woocommerce我的帐户页面

在 WooCommerce 新用户注册电子邮件中添加自定义字段

woocommerce购物车会话复制

如果用户状态为非活动状态,则阻止用户登录