Set product sale price programmatically in WooCommerce 3

ε祈祈猫儿з 提交于 2019-11-28 01:16:15

问题


I have a Woocommerce store set up with various product categories.

I want to apply a 20% discount to all products, which belong to the product category Cuckoo

For now all I'm trying to achieve is set a sale price in my functions.php

It tried as follows:

    /* 
     * For a specific date, 20% off all products with product category as cuckoo clock.
     */
    function cuckoo_minus_twenty($sale_price, $product) { 
        $sale_price = $product->get_price() * 0.8;
        return $sale_price;
    }; 

    // add the action 
    add_filter( 'woocommerce_get_sale_price', 'cuckoo_minus_twenty', 10, 2 ); 

If I var_dump the result of $sale_price after the calculation I get the correct answer, however the price display on the front-end strikes out the regular price and displays the sale price as the regular price.

Is there a hook/filter I can use to achieve this?

I've also tried setting the sale price by doing:

$product->set_sale_price($sale_price); 

to no avail.


回答1:


The hook woocommerce_get_sale_price is deprecated since WooCommerce 3 and replaced by woocommerce_product_get_sale_price.

Also Product displayed prices are cached. When sale price is active, regular price is also active.

Try this instead:

// Generating dynamically the product "regular price"
add_filter( 'woocommerce_product_get_regular_price', 'custom_dynamic_regular_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_regular_price', 'custom_dynamic_regular_price', 10, 2 );
function custom_dynamic_regular_price( $regular_price, $product ) {
    if( empty($regular_price) || $regular_price == 0 )
        return $product->get_price();
    else
        return $regular_price;
}


// Generating dynamically the product "sale price"
add_filter( 'woocommerce_product_get_sale_price', 'custom_dynamic_sale_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_sale_price', 'custom_dynamic_sale_price', 10, 2 );
function custom_dynamic_sale_price( $sale_price, $product ) {
    $rate = 0.8;
    if( empty($sale_price) || $sale_price == 0 )
        return $product->get_regular_price() * $rate;
    else
        return $sale_price;
};

// Displayed formatted regular price + sale price
add_filter( 'woocommerce_get_price_html', 'custom_dynamic_sale_price_html', 20, 2 );
function custom_dynamic_sale_price_html( $price_html, $product ) {
    if( $product->is_type('variable') ) return $price_html;

    $price_html = wc_format_sale_price( wc_get_price_to_display( $product, array( 'price' => $product->get_regular_price() ) ), wc_get_price_to_display(  $product, array( 'price' => $product->get_sale_price() ) ) ) . $product->get_price_suffix();

    return $price_html;
}

Code goes in function.php file of your active child theme (active theme).

Tested and works on single product, shop, product category and tag archive pages.

The continuation in:
Wrong Woocommerce cart item price after setting programmatically product sale price




回答2:


use woocomerce_get_sale_price filter.

add_filter('woocommerce_get_sale_price', 'my_custom_price', 99, 2);
add_filter('woocommerce_get_price', 'my_custom_price', 99, 2);

function my_custom_price( $price, $product )
{
    //your logic for calculating the new price here
     $price = $product->get_regular_price() * 0.8;

    //Return the new price (this is the price that will be used everywhere in the store)
    return $price;
}


来源:https://stackoverflow.com/questions/48763989/set-product-sale-price-programmatically-in-woocommerce-3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!