如果为WooCommerce的变化填写销售价格,请添加“促销”徽章

时间:2017-11-07 11:31:24

标签: php wordpress woocommerce product price

在WooCommerce中,对于一个简单的产品,我可以添加“促销!”以这种方式徽章:

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

但在此“促销!”之后(仅适用于可变产品)

1 个答案:

答案 0 :(得分:1)

要使代码适用于所有产品类型,您应使用 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文件中,或者放在任何插件文件中。

经过测试和工作。