代码之家  ›  专栏  ›  技术社区  ›  Rose Thorn

在WooCommerce单一产品页面和购物车上有条件地设置特定产品价格

  •  2
  • Rose Thorn  · 技术社区  · 6 年前

    产品价格需要增加10美元,但只能在单个产品页面上增加,而且只能在外部增加(这样WooCommerce中设置的内部价格或价格就不会改变)。

    此外,此价格也应在购物车中更改,但前提是特定类别的产品也不在购物车中。

    背景:如果有人自己购买这个产品,他们应该收取高于正常价格10美元的费用。如果有人将此商品与某一类别的产品一起购买,应按正常价格收取。 这实际上是一个反向折扣(我不想使用优惠券功能来收取额外费用)。

    对于购物车功能,到目前为止我有这个功能,但它不起作用-当当前的常规/基本价格是45美元时,购物车的价格是75美元。我不知道75是从哪里来的,应该是55岁。

    function wc_cart_custom_price( $cart_object ) {
            if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
            // set our flag to be false until we find a product in that category
            $cat_check = false;
    
            // check each cart item for our category
            foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
    
                $product = $cart_item['data'];
    
                // replace 'your-category' with your category's slug
                if ( has_term( 'your-category', 'product_cat', $product->id ) ) {
                    $cat_check = true;
                    // break because we only need one "true" to matter here
                    break;
                }
            }
    
            // if a product in the cart is in our category, stop there and don't change price
            if ( $cat_check ) {
                return;
            }
            // else continue and alter the product price
            else if ( $cart_item['product_id'] == 87 ) {
                // we have the right product, do what we want
                $price = $cart_item['data']->get_price(); // Get the product price
                $new_price = $price + 10; // the calculation
                $cart_item['data']->set_price( $new_price ); // Set the new price
                }
    }
    add_action( 'woocommerce_before_calculate_totals', 'wc_cart_custom_price' );
    

    我更改产品页面价格的代码是:

    function wc_change_product_price($price, $product) {
        if ( is_single('87') ) {
            $post_id = $product->id;
    
            $regular_price = get_post_meta( $post_id, '_regular_price', true);
            $custom_value = ( $regular_price + 10 );
            $price = $custom_value;
    
        return $price;
        }
    }
    add_filter('woocommerce_get_price', 'wc_change_product_price', 99);
    

    这是一个灾难,导致500服务器错误。我做错了什么?欢迎任何帮助。

    参考文献:

    Change cart item prices in WooCommerce version 3.0

    https://rudrastyh.com/woocommerce/change-product-prices-in-cart.html

    https://www.skyverge.com/blog/checking-woocommerce-cart-contains-product-category/

    2 回复  |  直到 6 年前
        1
  •  1
  •   LoicTheAztec    6 年前

    更新3 (仅用于定义的产品ID)

    使其按您只想在单个产品页面上更改简单产品价格的方式工作(不更改存档产品价格、相关产品价格、追加销售和交叉销售) 如果任何购物车项目不属于特定产品类别 .

    然后您将需要以下所有代码:

    // Change displayed price on single product pages
    add_action( 'woocommerce_single_product_summary', 'change_simple_product_price_html', 9 );
    function change_simple_product_price_html() {
        global $product;
    
        // Only for product ID 87
        if( $product->get_id() != 87 ) return;
    
        // HERE set your product category term ID, slug or name
        $product_category = 't-shirts';
    
        // Checking for the product category in cart items loop
        foreach ( WC()->cart->get_cart() as $cart_item ) {
            if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
                return; // Product category found ==> We EXIT from this function
        }
    
        remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
        add_action( 'woocommerce_single_product_summary', 'custom_simple_product_price_html', 10 );
    }
    
    function custom_simple_product_price_html(){
        global $product;
    
        $addp = 10; // Here the price additional amount
    
        if ( '' !== $product->get_price() && ! $product->is_on_sale() ) {
            $price = wc_price( wc_get_price_to_display( $product ) + $addp ) . $product->get_price_suffix();
        }
        echo '<p class="price">' . apply_filters( 'woocommerce_get_price_html', $price, $product ) . '</p>';
    }
    
    // Add custom calculated price to cart item data
    add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 );
    function add_cart_simple_product_custom_price( $cart_item_data, $product_id ){
        // Only for product ID 87
        if( $product_id != 87 ) 
            return $cart_item_data;
    
        $product = wc_get_product($product_id); // The WC_Product Object
    
        // Only if product is not on sale
        if( $product->is_on_sale() ) 
            return $cart_item_data;
    
        $price = (float) $product->get_price();
    
        // Set the custom amount in cart object
        $cart_item_data['new_price'] = $price + 10;
    
        return $cart_item_data;
    }
    
    // Set custom calculated price to cart
    add_action( 'woocommerce_before_calculate_totals', 'set_cart_simple_product_custom_price', 20, 1 );
    function set_cart_simple_product_custom_price( $cart ) {
        if ( is_admin() && ! defined( 'DOING_AJAX' ) )
            return;
    
        if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
            return;
    
        // HERE set your product category term ID, slug or name
        $product_category = 't-shirts';
    
        // 1st cart items Loop: checking for the product category
        foreach ( $cart->get_cart() as $cart_item ) {
            if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
                return; // Product category found ==> We EXIT from this function
        }
    
        // 2nd Loop: Changing cart item prices (Product category not found)
        foreach ( $cart->get_cart() as $cart_item ) {
            if( isset($cart_item['new_price']))
                $cart_item['data']->set_price( $cart_item['new_price'] );
        }
    }
    

    代码位于活动子主题(或活动主题)的function.php文件中。测试和工作。

        2
  •  0
  •   Eric Aya    6 年前

    如果你想改变单个产品页面上的产品价格。 请遵循下面的代码,我已经添加了我的产品ID“99”:

    add_action( 'woocommerce_single_product_summary', 'e_coding_change_simple_product_price_html', 9 );
    function e_coding_change_simple_product_price_html() {
        global $product;
    
    // Only for product ID 99
    if( $product->get_id() != 99 ) return;
    
    // HERE set your product category term ID, slug or name
    $product_category = 'my-book';
    
    // Checking for the product category in cart items loop
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) )
            return; // Product category found ==> We EXIT from this function
    }
    
    remove_action( 'woocommerce_single_product_summary', 'woocommerce_template_single_price', 10 );
    add_action( 'woocommerce_single_product_summary', 'custom_simple_product_price_html', 10 );
    }
    
    function custom_simple_product_price_html(){
    global $product;
    
    $addp = 10; // Here the price additional amount
    
    if ( '' !== $product->get_price() && ! $product->is_on_sale() ) {
        $price = wc_price( wc_get_price_to_display( $product ) + $addp ) . $product->get_price_suffix();
    }
    echo '<p class="price">' . apply_filters( 'woocommerce_get_price_html', $price, $product ) .'</p>';
    }
    
    // Add custom calculated price to cart item data
    
    add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 );
    
    function add_cart_simple_product_custom_price( $cart_item_data, $product_id ){
    
    // Only for product ID 87
    if( $product_id != 99 )
        return $cart_item_data;
    
    $product = wc_get_product($product_id); // The WC_Product Object
    
    // Only if product is not on sale
    if( $product->is_on_sale() )
        return $cart_item_data;
    
    $price = (float) $product->get_price();
    
    // Set the custom amount in cart object
    $cart_item_data['new_price'] = $price + 10;
    
    return $cart_item_data;
    }
    
    
    function cw_change_product_price_display( $price ) {
    
        $price .= ' At Each Item Product';
        return $price;
    
    }
    
    add_filter( 'woocommerce_get_price_html', 'cw_change_product_price_display' );
    add_filter( 'woocommerce_cart_item_price', 'cw_change_product_price_display' );