Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
11.0k views
in Technique[技术] by (71.8m points)

php - Enable Wholesale prices in Woocommerce 3

In wooCommerce, I have added a custom meta field with a custom price (wholesale price) in edit product pages settings. Everything works well.

When I set a wholesale price it works fine everywhere. But if I try to change this wholesale price it doesn't work. the old price remains everywhere.

What I am doing wrong? How can I solve this problem to allow wholesale price changes?

The code I am using:

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;
    }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

There are some errors in your code and a lot of missing parts too:

  • The hook woocommerce_get_price is deprecated and outdated
  • To handle Product variations you need some more code (same thing for the variable products price range).
  • Other errors, like when saving your Wholesale price…

Your revisited code:

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

Code goes in functions.php file of your active child theme (or active theme). Tested and works.


Now you will be able to change the value of your 'Wholesale Price' and to handle it in product variations.

Product variations Wholesale price setting:

enter image description here


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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...