kojak
kojak

Reputation: 43

WooCommerce change price when adding product to order in admin

We have customers who have different discount percentages. This is all programmed and working on the front end when adding products to the cart, but if using the back end order admin to add a new product I can't seem to find a way to calculate the new product price based on the user's discount. Is there a way to change the price in the woocommerce_new_order_item hook when adding a product to an existing order in the order admin?

Here's what I have so far:

function action_woocommerce_new_order_item( $item_id, $item, $order_id ) { 
    // only run this from the WP admin section
    if ( !is_admin() )
        return;

    $item_type = $item->get_type();

    // return if this is not a product (i.e. fee, tax, etc.)
    if ( $item_type != 'line_item' )
        return;

    $product = wc_get_product( $item->get_product_id() );

    if ( !$product )
        return;

    $current_price = $product->get_price();
    $quantity = $item->get_quantity();

    // here I get the order's user's discount percentage and calculate the new discounted price
    // custom function
    $discounted_price = get_discounted_price( $current_price, $users_discount );

    $new_price = ( !empty($discounted_price) ) ? $discounted_price : $current_price;

    // this doesn't work
    $item->set_price( $new_price );

    // and this doesn't work
    $product->set_price( $new_price );

    // this appears to work but I'm not sure if this the best way to accomplish this
    $item->set_total( $price * $quantity );
}
add_action( 'woocommerce_new_order_item', 'action_woocommerce_new_order_item', 10, 3 );

Any help would be greatly appreciated! Thanks

Upvotes: 1

Views: 3082

Answers (1)

kojak
kojak

Reputation: 43

This works for adding item meta and changing the item price in the order admin screen:

function action_woocommerce_new_order_item( $item_id, $item, $order_id ) { 
    // only run this from the WP admin section
    if ( !is_admin() )
        return;

    $item_type = $item->get_type();

    // return if this is not a product (i.e. fee, tax, etc.)
    if ( $item_type != 'line_item' )
            return;

    $product = wc_get_product( $item->get_product_id() );

    if ( !$product )
            return;

    $current_price = $product->get_price();
    $size = $product->get_attribute('size');

    // add custom item meta to order
    if ( $size ) {
            wc_add_order_item_meta( $item_id, 'Size', $size , false );
    }

    $order = wc_get_order( $order_id );

    $order_user = $order->get_user();
    $order_user_id = $order->get_user_id();

    // get this order's user's discount %
    $users_discount = get_user_meta( $order_user_id, 'discount', true );
    $users_discount = ( $users_discount > 0 ) ? $users_discount : 0;

    // calculate the discounted price based on the user's discount (custom function)
    $discounted_price = get_discounted_price( $current_price, $users_discount );

    $quantity = $item->get_quantity();
    $new_price = ( !empty($discounted_price) ) ? $discounted_price : $current_price;

    $item->set_total( $new_price * $quantity );
}; 
add_action( 'woocommerce_new_order_item', 'action_woocommerce_new_order_item', 10, 3 ); 

Upvotes: 0

Related Questions