web-dev-qa-db-ja.com

WooCommerce 3でプログラムによって製品の販売価格を設定する

Woocommerceストアにさまざまな製品カテゴリーを設定しています。

商品カテゴリカッコウに属するすべての商品に20%割引を適用したい

今のところ私が達成しようとしているのは、私のfunctions.phpにセール価格を設定することです

次のように試しました:

    /* 
     * 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 ); 

計算後に$ sale_priceの結果をvar_dumpすると、正しい答えが得られますが、フロントエンドの価格表示は通常の価格を取り消し、通常の価格としてセール価格を表示します。

enter image description here

これを達成するために使用できるフック/フィルターはありますか?

私はまた、次のようにして販売価格を設定しようとしました:

$product->set_sale_price($sale_price); 

無駄に。

5

フックwoocommerce_get_sale_priceはWooCommerce 3以降廃止され、woocommerce_product_get_sale_priceに置き換えられました。

また、製品の表示価格はキャッシュされます。 セール価格が有効な場合、通常価格も有効になります。

代わりにこれを試してください:

// 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;
}

コードは、アクティブな子テーマ(アクティブテーマ)のfunction.phpファイルに入ります。

単一の製品、ショップ、製品カテゴリ、タグのアーカイブページでテストされ、動作します。

続き:
プログラムで製品の販売価格を設定した後の誤ったWoocommerceカートアイテムの価格

3
LoicTheAztec

HTMLをそのまま使用できるようにするには、多かれ少なかれ、以下のすべてのフィルターが必要です。

add_filter( 'woocommerce_product_get_price', 'custom_dynamic_sale_price', 10, 2 );
add_filter( 'woocommerce_product_variation_get_price', 'custom_dynamic_sale_price', 10, 2 );
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 );
add_filter( 'woocommerce_variation_prices_price', 'custom_dynamic_sale_price', 10, 2 );
add_filter( 'woocommerce_variation_prices_sale_price', 'custom_dynamic_sale_price', 10, 2 );

また、変数製品で正しく表示したい場合は、保存されたトランジェントのためにwoocommerce_get_variation_prices_hashを変更したことを確認する必要があります。

クライアント用に作成したGist Gistが役立つ場合があります

https://www.rent-a-ninja.org/programming/wordpress-plugin-entwickler-naehe-graz/woocommerce-custom-sale-price-for-custom-role/

0
Xandl