Condicionar condicionalmente el precio del producto específico en Woocommerce

Me gustaría alterar un producto específico en Woocommerce, agregando programáticamente a su cantidad original de $ 10, EXCEPTO en esos casos :

  • En páginas de productos específicos que se pueden reservar para alquiler (reservas de Woocommerce) que pertenecen a una determinada categoría “C”.
  • Si algún artículo del carrito pertenece a esa categoría “C”.

Estaba usando este código de respuesta a una de mis preguntas hasta ahora. Pero debería tener que mostrar el precio modificado de este producto específico en todas partes, excepto en las páginas de ese producto que se pueden reservar, en la parte delantera.

También tengo este código que muestra el precio de Force Sells junto a los títulos. Esto aún debe mostrar el precio original del producto específico en las páginas de ese producto que son productos que se pueden reservar en la sección Vender la fuerza:

function wc_forcesells_product_price( $name, $product ) { // Only in single product pages if( ! is_product() ) return $name; // The product name + the product formatted price return $name . ' (' . wc_price( wc_get_price_to_display( $product ) ) . ')'; } add_filter( 'woocommerce_product_title', 'wc_forcesells_product_price', 20, 2 ); 

Referencia para lo anterior: Agregar precio al lado de las Fuerzas de Woocommerce .

Actualizado para manejar múltiples ID de productos si es necesario

Intente lo siguiente que mostrará para un ID de producto específico un precio personalizado en todas partes, excepto :

  • Al reservar productos para contratar páginas.
  • Cuando una categoría de producto está en el carrito.

El código también cambiará el precio de este producto personalizado en los artículos del carrito, excepto cuando una categoría de producto específica esté en los artículos del carrito.

Tendrás que configurar en esas funciones:

  • Este ID de producto específico
  • Los productos de reserva IDs a contratar.
  • El importe del precio adicional
  • La categoría de producto (Id slug o nombre)

El código:

 // Change product ID 87 price everywhere on front end EXCEPT: // - On booking products to hire pages // - When a product category is in cart add_filter( 'woocommerce_get_price_html', 'product_id_87_displayed_price', 10, 2 ); function product_id_87_displayed_price( $price_html, $product ) { // Only for product ID 87 if( in_array( $product->get_id(), array( 87, 2799 ) ) ){ return $price_html; // Exit // HERE set booking products IDs to hire in the array $product_ids_to_hire = array( 53, 738 ); // HERE set your product category term ID, slug or name $product_category = 'hoodies'; // HERE set the price additional amount $addp = 10; // EXCEPT on booking products to hire pages if( is_single($product_ids_to_hire) ) return $price_html; // Exit // Checking for the product category in cart items loop foreach ( WC()->cart->get_cart() as $cart_item ) { if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) ) return $price_html; // Product category found ==> Exit } if ( '' !== $product->get_price() && ! $product->is_on_sale() ) { $price_html = wc_price( wc_get_price_to_display( $product ) + $addp ) . $product->get_price_suffix(); } return $price_html; } // Add custom calculated price to cart item data for product ID 87 add_filter( 'woocommerce_add_cart_item_data', 'add_cart_simple_product_custom_price', 20, 2 ); function add_cart_simple_product_custom_price( $cart_item_data, $product_id ){ // Only for product ID 87 if( ! in_array( $product->get_id(), array( 87 ) ) ) return $cart_item_data; // Exit // HERE set the price additional amount $addp = 10; $product = wc_get_product($product_id); // The WC_Product Object $price = (float) $product->get_price(); // The product price // Set the custom amount in cart object $cart_item_data['new_price'] = $price + $addp; return $cart_item_data; } // Set custom calculated price to cart for product ID 87 add_action( 'woocommerce_before_calculate_totals', 'set_cart_simple_product_custom_price', 20, 1 ); function set_cart_simple_product_custom_price( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return; // HERE set your product category term ID, slug or name $product_category = 'hoodies'; // 1st cart items Loop: checking for the product category foreach ( $cart->get_cart() as $cart_item ) { if ( has_term( $product_category, 'product_cat', $cart_item['product_id'] ) ) return; // Product category found ==> We EXIT from this function } // 2nd Loop: Changing cart item prices (Product category not found) foreach ( $cart->get_cart() as $cart_item ) { if( isset($cart_item['new_price'])) $cart_item['data']->set_price( $cart_item['new_price'] ); } } 

El código va en el archivo function.php de su tema secundario activo (o tema activo). Probado y funciona.

También debería funcionar con la función wc_forcesells_product_price() .