在 Woocommerce 3 中启用批发价

Enable Wholesale prices in Woocommerce 3

在 wooCommerce 中,我在编辑产品页面设置中添加了一个带有自定义价格(批发价)的自定义元字段。一切正常。

当我设置批发价时,它在任何地方都可以正常工作。但是,如果我尝试更改此批发价,那是行不通的。旧价格无处不在。

我做错了什么?我该如何解决这个问题以允许更改批发价?

我使用的代码:

function w4dev_get_wholesale_price( $product )
{
    if( 
        $product->is_type( array('simple', 'variable') ) 
        && get_post_meta( $product->id, '_wholesale_price', true ) > 0 
    ){
        return get_post_meta( $product->id, '_wholesale_price', true );
    }
    elseif( 
        $product->is_type('variation') 
        && get_post_meta( $product->variation_id, '_wholesale_price', true ) > 0 
    ){
        return get_post_meta( $product->variation_id, '_wholesale_price', true );
    }
    return 0;
}

add_action( 'woocommerce_product_options_pricing', 'w4dev_woocommerce_product_options_pricing' );
function w4dev_woocommerce_product_options_pricing()
{
    woocommerce_wp_text_input( array( 
        'id' => '_wholesale_price',
        'class' => 'wc_input_wholesale_price short',
        'label' => __( 'Wholesale Price', 'woocommerce' ) . ' ('.get_woocommerce_currency_symbol().')',
        'type' => 'text'
    ));
}

add_action( 'woocommerce_process_product_meta_simple', 'w4dev_woocommerce_process_product_meta_simple', 10, 1 );
function w4dev_woocommerce_process_product_meta_simple( $product_id )
{
    if( isset($_POST['_wholesale_price']) && $_POST['_wholesale_price'] > 0 ){
        update_post_meta( $product_id, '_wholesale_price', $_POST['_wholesale_price'] );
        }
}

add_filter( 'woocommerce_get_price', 'w4dev_woocommerce_get_price', 10, 2);
function w4dev_woocommerce_get_price( $price, $product )
{
    if(  w4dev_get_wholesale_price($product) > 0 ) {
        $price = w4dev_get_wholesale_price($product);
    return $price;
    }
}

你的代码有一些错误,还有很多缺失的部分:

  • 挂钩 woocommerce_get_price 已弃用且已过时
  • 要处理产品变体,您需要更多代码(可变产品价格范围也是如此)。
  • 其他错误,例如保存批发价时...

您重访的代码:

// Add "Wholesale Price" custom field to Products option pricing
add_action( 'woocommerce_product_options_pricing', 'w4dev_add_product_options_pricing' );
function w4dev_add_product_options_pricing()
{
    woocommerce_wp_text_input( array(
        'id' => '_wholesale_price',
        'class' => 'wc_input_wholesale_price short',
        'label' => __( 'Wholesale Price', 'woocommerce' ) . ' ('.get_woocommerce_currency_symbol().')',
        'type' => 'text'
    ));
}

// Add custom field to VARIATIONS option pricing
add_action( 'woocommerce_variation_options_pricing', 'w4dev_add_variation_options_pricing', 20, 3 );
function w4dev_add_variation_options_pricing( $loop, $variation_data, $post_variation )
{
    $value  = get_post_meta( $post_variation->ID, '_wholesale_price', true );
    $symbol = ' (' . get_woocommerce_currency_symbol() . ')';
    $key = 'wholesale_price[' . $loop . ']';

    echo '<div class="variable_wholesale-price"><p class="form-row form-row-first">
        <label>' . __( "Wholesale Price", "woocommerce" ) . $symbol . '</label>
        <input type="text" size="5" name="' . $key .'" value="' . esc_attr( $value ) . '" />
    </p></div>';
}

// Save "Wholesale Price" custom field to Products
add_action( 'woocommerce_process_product_meta_simple', 'w4dev_save_product_wholesale_price', 20, 1 );
function w4dev_save_product_wholesale_price( $product_id ) {
    if( isset($_POST['_wholesale_price']) )
        update_post_meta( $product_id, '_wholesale_price', $_POST['_wholesale_price'] );
}

// Save "Wholesale Price" custom field to VARIATIONS
add_action( 'woocommerce_save_product_variation', 'w4dev_save_product_variation_wholesale_price', 20, 2 );
function w4dev_save_product_variation_wholesale_price( $variation_id, $i ){
    if ( isset( $_POST['wholesale_price'][$i] ) ) {
        update_post_meta( $variation_id, '_wholesale_price', floatval( $_POST['wholesale_price'][$i] ) );
    }
}

// Simple, grouped and external products
add_filter('woocommerce_product_get_price', 'w4dev_custom_price', 90, 2 );
add_filter('woocommerce_product_get_regular_price', 'w4dev_custom_price', 90, 2 );

// Product variations (of a variable product)
add_filter('woocommerce_product_variation_get_regular_price', 'w4dev_custom_price', 99, 2 );
add_filter('woocommerce_product_variation_get_price', 'w4dev_custom_price', 90, 2 );;

function w4dev_custom_price( $price, $product ) {
    if( get_post_meta( $product->get_id(), '_wholesale_price', true ) > 0 )
        $price = get_post_meta( $product->get_id(), '_wholesale_price', true );

    return $price;
}

// Variable product price ramge
add_filter('woocommerce_variation_prices_price', 'w4dev_custom_variation_price', 90, 3 );
add_filter('woocommerce_variation_prices_regular_price', 'w4dev_custom_variation_price', 90, 3 ); 

function w4dev_custom_variation_price( $price, $variation, $product ) {
    if( get_post_meta( $variation->get_id(), '_wholesale_price', true ) > 0 )
        $price = get_post_meta( $variation->get_id(), '_wholesale_price', true );

    return $price;
}

代码进入您的活动子主题(或活动主题)的 functions.php 文件。 已测试并有效。


现在您将能够更改 'Wholesale Price' 的值并在产品变体中处理它。

产品变化批发价设置:


To handle sale prices regarding Sale prices in Woocommerce, there is those related hooks:

  • woocommerce_product_get_sale_price
  • woocommerce_product_variation_get_sale_price
  • woocommerce_variation_prices_get_sale_price