【问题标题】:Disable AJAX to cart on Private products only Woocommerce禁用 AJAX 以仅购买私人产品 Woocommerce
【发布时间】:2021-03-17 13:54:45
【问题描述】:

我最初的问题是 Woocommerce 上的 AJAX 添加到购物车按钮似乎不适用于私人产品(我们仅向部分客户显示):轮子出现在添加到购物车上按钮,页面重新加载,产品被添加到购物车,但没有注意到它有,所以很混乱。

经过大量研究,我只能找到这个线程 https://wordpress.org/support/topic/add-to-cart-redirecting-only-on-private-products-2/,它让我相信它很可能是一个错误?

我试图想出一个解决方法:禁用 AJAX 添加到购物车并仅在私有产品上恢复默认行为,这样我们仍然可以显示某种产品已添加到购物车的通知。我认为这段代码是一个起点:

add_action( 'wp_enqueue_scripts', 'bbloomer_disable_woocommerce_cart_fragments', 11 ); 
 
function bbloomer_disable_woocommerce_cart_fragments() { 
   if ( is_front_page() ) wp_dequeue_script( 'wc-cart-fragments' ); 
}

这行得通吗?我将如何修改它以使条件为“如果是私有产品”?

【问题讨论】:

    标签: php ajax wordpress woocommerce


    【解决方案1】:

    你可以换个思路来解决问题。除了只为特定用户显示私有产品您可以为所有其他用户角色隐藏它们 (让产品保持“发布”状态)

    这样就不会出现Ajax问题了。

    如果用户具有以下函数的$user_roles数组中定义的角色之一,它将隐藏$product_ids_to_hide数组中的所有产品:

    // hide products based on user role
    add_filter( 'woocommerce_product_is_visible', 'hide_products_by_user_role', 10, 2 );
    function hide_products_by_user_role( $visible, $product_id ) {
        // only if the user is logged in
        if ( ! is_user_logged_in() ) {
            return $visible;
        }
        // set the product ids to hide
        $product_ids_to_hide = array( 12, 14 );
        // sets the user roles for which products are to be hidden
        $user_roles = array( 'custom_role_1', 'custom_role_2' );
        $user = wp_get_current_user();
        if ( array_intersect( $user_roles, $user->roles ) && in_array( $product_id, $product_ids_to_hide ) ) {
            return false;
        }
        return $visible;
    }
    

    回复您的评论:

    如果您希望允许用户根据用户角色修改要隐藏的产品 ID,您可以创建一个 .csv 文件以上传到 FTP,其中包含产品 ID 列表,每行一个强>.

    如果您的客户将来想要删除或添加产品 ID,他可以简单地使用 FTP 导入覆盖 .csv 文件或直接在文件管理器中(如果托管允许)。

    我作为示例创建的文件名为product-ids-to-hide.csv,需要上传到与functions.php 文件相同的目录。 不需要标题。这是一个示例:

    349
    235
    456
    745
    

    这将是新的更新功能:

    // hide products based on user role
    add_filter( 'woocommerce_product_is_visible', 'hide_products_by_user_role', 10, 2 );
    function hide_products_by_user_role( $visible, $product_id ) {
        // only if the user is logged in
        if ( ! is_user_logged_in() ) {
            return $visible;
        }
    
        // sets the user roles for which products are to be hidden
        $user_roles = array( 'custom_role_1', 'custom_role_2' );
        $user = wp_get_current_user();
        // only if the user has at least one role present in the array
        if ( empty( array_intersect( $user_roles, $user->roles ) ) ) {
            return $visible;
        }
    
        // get an array with product ids
        $product_ids_to_hide = file( realpath( __DIR__ . '/product-ids-to-hide.csv' ), FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES );
        if ( in_array( $product_id, $product_ids_to_hide ) ) {
            return false;
        }
    
        return $visible;
    }
    

    代码已经过测试并且可以运行。将其添加到您的活动主题的 functions.php 中。

    【讨论】:

    • 您好文森佐,感谢您的帮助。不幸的是,如果我正确理解这一点,它在我们的案例中将不起作用,因为产品会在商店中显示给未登录的用户。
    • 您可以设置:if ( ! is_user_logged_in() ) { return false; }对未登录的用户隐藏产品。
    • 我也刚刚注意到您正在指定产品 ID,不幸的是,这并不是真正可持续的。我的客户不会喜欢每次想要添加隐藏产品时都回来找我,这样我就可以编辑代码。
    • 我已经更新了我的答案,使其适合未来的客户变化。
    猜你喜欢
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2019-08-16
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多