如果特定商品在 Woocommerce 的购物车中,请更改购物车商品价格 [英] Change cart item price if a specific item is in the cart on Woocommerce

查看:27
本文介绍了如果特定商品在 Woocommerce 的购物车中,请更改购物车商品价格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 WooCommerce 会员资格,并希望将免费会员资格扩展到购买特定产品的首次会员.我可以让其中的一些单独工作,但无法将它们全部结合在一起.

I am using WooCommerce Memberships and want to extend a free membership to first time members if they purchase a specific product. I can get some of this to work separately, but am having trouble getting it to all come together.

他们必须购买的商品也有销售价格,所以我还要检查日期,看看该商品是否在销售窗口中.那部分正在起作用.

There is also a sale price on the item they have to purchase, so I am also checking the dates to see if the item is in the sale window. That part is working.

似乎当我添加参数来检查该商品是否在购物车中时,整个事情都被打破了.如果我分别运行这两个函数,它们都可以工作.

It seems that when I add the argument to check if the item is in the cart, this whole thing breaks. If I run the two functions separately, they both work.

function mps_registration_price($cart_object) {
    global $post, $product;

    // Bail if memberships is not active
    if ( ! function_exists( 'wc_memberships' ) ) {
        return;
    }

    $user_id = get_current_user_id();
    date_default_timezone_set("America/Chicago");
    $today = time();

    // Check if user was never a member 
    if ( !wc_memberships_get_user_memberships( $user_id )) {
        if( mps_check_for_product() ) {

        foreach ( $cart_object->get_cart() as $cart_item ) {

            // get the product id (or the variation id)
            $id = $cart_item['data']->get_id();

            if($id == 17) {
                    $salePrice = get_post_meta($id, '_sale_price', true);
                    $saleFrom = get_post_meta($id, '_sale_price_dates_from', true);
                    $saleTo = get_post_meta($id, '_sale_price_dates_to', true); 

                    if( !empty($salePrice) && $today >= $saleFrom && $today <= $saleTo ) {
                        $new_price = $salePrice;
                    } else {
                        $new_price = get_post_meta($id, '_regular_price', true);
                    }
                    // Updated cart item price
                    $cart_item['data']->set_price( $new_price ); 
                }
            }
        } else {

            foreach ( $cart_object->get_cart() as $cart_item ) {

                // get the product id (or the variation id)
                $id = $cart_item['data']->get_id();

                if($id == 17) {
                    $salePrice = get_post_meta($id, '_sale_price', true);
                    $saleFrom = get_post_meta($id, '_sale_price_dates_from', true);
                    $saleTo = get_post_meta($id, '_sale_price_dates_to', true); 

                    if( !empty($salePrice) && $today >= $saleFrom && $today <= $saleTo ) {
                        $new_price = $salePrice + 50;
                    } else {
                        $new_price = get_post_meta($id, '_regular_price', true);
                    }
                    // Updated cart item price
                    $cart_item['data']->set_price( $new_price ); 
                }
            }
        }
    }

}

add_filter( 'woocommerce_before_calculate_totals', 'mps_registration_price', 10, 1 );

function mps_check_for_product() {

    $product_id = 11;
    $product_cart_id = WC()->cart->generate_cart_id( $product_id );
    $in_cart = WC()->cart->find_product_in_cart( $product_cart_id );

    if ( $in_cart ) {
        return true;
    } else {
        return false;
    }
}

add_action('woocommerce_before_cart', 'mps_check_for_product');

推荐答案

更新 (2018 年 10 月)

您将这里的所有内容都复杂化了,因为您只想在客户还不是会员的情况下向销售的特定产品 (ID 17) 添加额外费用.

You have complicated everything here as you just want to add to a specific product (ID 17) on sale an additional cost when customer is not yet member.

为此您不需要 2 个单独的函数,并且您的第二个函数以错误的方式执行此操作.如果您在第一个挂钩函数中调用它,则不需要挂钩.

You don't need 2 separated functions for this and your 2nd function is doing it in the wrong way. It don't need to be hooked if you are calling it in your first hooked function.

我已经完全重新访问了您的代码,使用了 WC_Product 方法而不是 get_post_meta()...

I have revisited your code completely, using WC_Product methods instead of get_post_meta()

还有 WC_Product 方法is_on_sale() 管理一切,例如促销产品价格的起止日期.所以你不需要在你的函数中得到它.

Also the WC_Product method is_on_sale() manage everything like from/to dates for on sale product prices. So you don't need to get that in your function.

在您的代码中,当产品 11 在购物车中或不在您的 2 个购物车循环中的购物车中时,没有区别...因此您可能需要进行一些更改 在那里.

In your code there is no differences when product 11 is in cart or is NOT in cart within your 2 Cart loops… So you should may be need to make some changes there.

所以你的代码现在非常紧凑:

So your code is now very compact:

add_action( 'woocommerce_before_calculate_totals', 'mps_registration_price', 20, 1 );
function mps_registration_price( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Bail if memberships is not active
    if ( ! function_exists( 'wc_memberships' ) ) return; // Exit

    // Only for non members
    $user_id = get_current_user_id();
    if ( wc_memberships_get_user_memberships( $user_id ) ) return; // Exit

    // First loop to check if product 11 is in cart
    foreach ( $cart->get_cart() as $cart_item ){
        $is_in_cart = $cart_item['product_id'] == 11 ? true : false;
    }

    // Second loop change prices
    foreach ( $cart->get_cart() as $cart_item ) {

        // Get an instance of the WC_Product object (or the variation product object)
        $product = $cart_item['data'];

        // Method is_on_sale() manage everything (dates…)
        // Here we target product ID 17
        if( $product->is_on_sale() && $product->get_id() == 17 ) {

            // When product 11 is not cart
            if( ! $is_in_cart ){
                $product->set_price( $product->get_sale_price() + 50);
            }
        }
    }
}

代码位于活动子主题(或活动主题)的 function.php 文件或任何插件文件中.

经过测试并有效.

这篇关于如果特定商品在 Woocommerce 的购物车中,请更改购物车商品价格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆