Solution:
To restore cart items price based on a product category and on a specific chosen shipping method, try the following (for Woocommerce Dynamic Pricing):
add_filter('woocommerce_add_cart_item_data', 'add_default_price_as_cart_item_custom_data', 50, 3 );
function add_default_price_as_cart_item_custom_data( $cart_item_data, $product_id, $variation_id ){
// HERE define your product category(ies)
$categories = array('t-shirts');
if ( has_term( $categories, 'product_cat', $product_id ) ) {
$product_id = $variation_id > 0 ? $variation_id : $product_id;
// The WC_Product Object
$product = wc_get_product($product_id);
// Get product default base price
$price = (float) $product->get_price();
// Set the Product default base price as custom cart item data
$cart_item_data['default_price'] = $price;
}
return $cart_item_data;
}
add_action( 'woocommerce_before_calculate_totals', 'restore_cart_item_price', 900, 1 );
function restore_cart_item_price( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// HERE set the targeted Chosen Shipping method
$targeted_shipping_method = 'local_pickup';
// Get the chosen shipping method
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
$chosen_shipping_method_id = explode(':', reset($chosen_methods) );
$chosen_shipping_method = reset($chosen_shipping_method_id);
// Loop through cart items
foreach ( $cart->get_cart() as $cart_item ) {
if( $targeted_shipping_method == $chosen_shipping_method && isset($cart_item['default_price']) ){
// Set back the default cart item price
$cart_item['data']->set_price($cart_item['default_price']);
}
}
}
Code goes in function.php file of your active child theme (or active theme). It should works.
Note: When Using a negative fee (a cart discount), the tax is always applied.