如果为 WooCommerce 中的变体填充了销售价格,则添加 "Sale" 徽章

Add a "Sale" badge if the sale price is filled for variations in WooCommerce

在 WooCommerce 中,对于简单的产品,我可以这样添加 "Sale!" 徽章:

add_action( 'woocommerce_before_shop_loop_item_title', function() {
    global $product; 
    $akc = get_post_meta(get_the_ID(), '_sale_price', true);
    if ( $akc > 0 ) {
        echo '<span class="onsale soldout">Sale!</span>';
    }
});

对于可变产品,它不起作用……
如何使用 'sale_price'?
获取所有变体字段的值 那么如何让它适用于可变产品

通过此代码结果仅适用于所有人可变产品:

add_action( 'woocommerce_before_shop_loop_item_title', function($price, $_this) {
    global $product; 

    if($product->product_type == 'variable') {

        $variation_rrp_price = get_sale_price( $variation_price, $product_id );

        $t = get_post_meta(get_the_ID(), $prices_array['_sale_price'], $variation_price); var_dump($t);
        if ( !empty ($t)  ) {
            echo '<span class="onsale soldout">Sale!</span>';
        }
    }
});

更新

所以我通过此代码获得自定义价格:

function get_rrp_price( $price, $product_id ) {
    $rooms2 = get_post_meta( $product_id, 'rooms2', true );
    if ( '' === $rooms2) {
        $rooms2 = 1; 
    }

    $kurs = 1;
    $kurs2 = 10;
    $kurs3 = 100;

    switch ( $rooms2 ) {
        case 1:
            $rrp_price = $price * $kurs2;
            break;
        case 2:
            $rrp_price = $price * $kurs3;
            break;
        default:
            $rrp_price = $price * $kurs;
            break;
    }

    return $rrp_price;
}

function filter_woocommerce_get_price( $price, $_this ) {
    $product_id = $_this->id;
    $rrp_price = get_rrp_price( $price, $product_id );
    update_post_meta( $product_id, 'rrp_price', $rrp_price );

    return $rrp_price;
}

function filter_736700_woocommerce_product_variation_get_price( $price, $_this) {
    if ( 'product_variation' === $_this->post_type ) {
        $data            = (object) $_this->get_data();
        $variation_price = $data->price;
        $product_id       = $data->parent_id;
        $variation_rrp_price = get_rrp_price( $variation_price, $product_id );
        $price = $variation_rrp_price;
    }

    return $price;
}

add_filter( 'woocommerce_product_variation_get_price', 'filter_736700_woocommerce_product_variation_get_price', 10, 2);

function filter_736700_woocommerce_variation_prices( $prices_array, $product, $include_taxes ) {


    $product_id = $product->id;

    foreach ( $prices_array['price'] as $key => $price ) {
        $prices_array['price'][ $key ] = get_rrp_price( $price, $product_id );
    }

    foreach ( $prices_array['regular_price'] as $key => $price ) {
        $prices_array['price'][ $key ] = get_rrp_price( $price, $product_id );
    }

    foreach ( $prices_array['sale_price'] as $key => $price ) {
        $prices_array['price'][ $key ] = get_rrp_price( $price, $product_id );
    }

    return $prices_array;
}

add_filter( 'woocommerce_variation_prices', 'filter_736700_woocommerce_variation_prices', 10, 3 );


function filter_738363_woocommerce_product_variation_get_regular_price( $price, $_this ) {
    if ( 'product_variation' === $_this->post_type ) {
        $data            = (object) $_this->get_data();
        $variation_price = $data->regular_price;
        $product_id       = $data->parent_id;
        $variation_rrp_price = get_rrp_price( $variation_price, $product_id );
        update_post_meta( $product_id, $data->name . ' - regular' , $variation_rrp_price );
        $price = $variation_rrp_price;
    }

    return $price;
}

add_filter( 'woocommerce_product_variation_get_regular_price', 'filter_738363_woocommerce_product_variation_get_regular_price', 10, 2);

但此后"Sale!"不再分配(仅适用于变量产品)

要使您的代码适用于所有产品类型,您应该使用 WC_Product is_on_sale() 方法。这样,您将只有一种功能适用于所有产品类型:

add_action( 'woocommerce_before_shop_loop_item_title', 'custom_shop_loop_on_sale_badge' );
function custom_shop_loop_on_sale_badge(){
    global $product;

    if($product->is_on_sale())
        echo '<span class="onsale soldout">Sale!</span>';
}

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。

已测试并有效。


更新 (与你问题中的更新相关).

要让您的销售计算价格发挥作用,请试试这个:

// Prices calculation common function
function get_rrp_price( $price, $product_id ) {
    $rooms2 = get_post_meta( $product_id, 'rooms2', true );
    if ( '' === $rooms2 )
        $rooms2 = 1;

    if ( $rooms2 == 1 )
        $price *= 10;
    elseif ( $rooms2 == 2 )
        $price *= 100;

    return $price;
}

// Simple products prices
add_filter( 'woocommerce_product_get_price', 'custom_simple_product_price', 20, 2 );
add_filter( 'woocommerce_product_get_regular_price', 'custom_simple_product_price', 20, 2 );
function custom_simple_product_price( $price, $product ) {
    $price = get_rrp_price( $price, $product->get_id() );
    update_post_meta( $product->get_id(), 'rrp_price', $price );

    return $price;
}

// Variable products: Selected variation prices
add_filter( 'woocommerce_variation_prices_price', 'custom_variations_prices', 10, 3 );
add_filter( 'woocommerce_variation_prices_regular_price', 'custom_variations_prices', 10, 3 );
add_filter( 'woocommerce_variation_prices_sale_price', 'custom_variations_prices', 10, 3 );
function custom_variations_prices( $price, $variation, $product ) {
    if (  $variation->is_type('variation') ) {
        $product_id = $product->get_id();

        $price = get_rrp_price( $price, $product_id );
    }
    return $price;
}

// Variable products: Min/Max variations prices
add_filter( 'woocommerce_product_variation_get_regular_price', 'custom_variations_get_prices' , 10, 2 );
add_filter( 'woocommerce_product_variation_get_sale_price', 'custom_variations_get_prices' , 10, 2 );
add_filter( 'woocommerce_product_variation_get_price', 'custom_variations_get_prices', 10, 2 );
function custom_variations_get_prices( $price, $variation ) {

    if (  $variation->is_type('variation') ) {
        $parent_product_id = $variation->get_parent_id();
        $rrp_price = get_rrp_price( $price, $product_id );

        // Adding/Updating "rrp regular price" custom field
        $regular_price = $variation->get_regular_price();
        if( $regular_price == $price )
            update_post_meta( $product_id, $variation->get_name() . ' - regular' , $rrp_price );

        $price = $rrp_price;
    }
    return $price;
}

代码进入您的活动子主题(或主题)的 function.php 文件或任何插件文件。

已测试并有效。