Tengo un escenario en el que necesito eliminar el botón “Realizar pedido” en la pantalla de pago de Woo-commerce.
Actualmente tengo 2 métodos de envío: Envío flexible y Flete
Si un cliente agrega un artículo con la clase de envío “Flete” a su carrito, mi código actual desactiva el método de envío flexible y luego el método de envío muestra un mensaje de “Llame para conocer las tarifas actuales”.
El problema es que todavía pueden pagar esencialmente sin pagar nada por el envío, por lo que si el flete es el único método de envío disponible, necesito que se elimine o reemplace el botón de realizar el pedido.
Aquí está el código que estoy usando actualmente y tratando de modificar sin éxito:
add_filter( 'woocommerce_package_rates', 'wc_hide_free_shipping_for_shipping_class', 10, 2 );
function wc_hide_free_shipping_for_shipping_class( $rates, $package ) {
$shipping_class_target = 332;
$in_cart = false;
foreach( WC()->cart->cart_contents as $key => $values ) {
if( $values[ 'data' ]->get_shipping_class_id() == $shipping_class_target ) {
$in_cart = true;
break;
}
}
if( $in_cart ) {
unset( $rates['flexible_shipping_7_2'] );
}
return $rates;
}
¿Hay un gancho simple o algo que me estoy perdiendo?
He estado jugando con esto por un tiempo y estoy golpeando una pared.
Intente lo siguiente, que generará un botón de pedido gris inactivo “Hacer pedido” cuando se encuentre una clase de envío específica en los artículos del carrito:
add_filter('woocommerce_order_button_html', 'inactive_order_button_html' );
function inactive_order_button_html( $button ) {
// HERE define your targeted shipping class
$targeted_shipping_class = 332;
$found = false;
// Loop through cart items
foreach( WC()->cart->get_cart() as $cart_item ) {
if( $cart_item['data']->get_shipping_class_id() == $targeted_shipping_class ) {
$found = true; // The targeted shipping class is found
break; // We stop the loop
}
}
// If found we replace the button by an inactive greyed one
if( $found ) {
$style="style="background:Silver !important; color:white !important; cursor: not-allowed !important;"";
$button_text = apply_filters( 'woocommerce_order_button_text', __( 'Place order', 'woocommerce' ) );
$button = '<a class="button" '.$style.'>' . $button_text . '</a>';
}
return $button;
}
El código va en el archivo function.php de su tema secundario activo (o tema activo). Probado y funciona.

Para eliminar completamente el botón “Realizar pedido”, usará este similar en su lugar:
add_filter('woocommerce_order_button_html', 'remove_order_button_html' );
function remove_order_button_html( $button ) {
// HERE define your targeted shipping class
$targeted_shipping_class = 332;
$found = false;
// Loop through cart items
foreach( WC()->cart->get_cart() as $cart_item ) {
if( $cart_item['data']->get_shipping_class_id() == $targeted_shipping_class ) {
$found = true; // The targeted shipping class is found
break; // We stop the loop
}
}
// If found we remove the button
if( $found )
$button = '';
return $button;
}
El código va en el archivo function.php de su tema secundario activo (o tema activo). Probado y funciona.