Muchas veces nos encontramos con que necesitamos bloquear el checkout en Woocommerce en función de algunas condiciones como límites de peso, artículos, combinaciones entre ellos o según la época del año en la que nos encontremos. La mala noticia es que esta función no está incluida en Woocommerce. La buena noticia es que es muy fácil solucionarlo.

Por qué querríamos bloquear el checkout en Woocommerce?

Yo me he encontrado con algunos casos en los que he necesitado hacerlo.

  • Peso excesivo del envío. Para una tienda de venta al detalle es un problema realizar un envío de más de 20 ó 30 kilos.
  • Época del año. Hay tipos de productos que no soportan bien el calor. Es mejor no enviar estos productos durante los meses de verano.

Y se me ocurren algunas más que todavía no he tenido que implementar:

  • Combinaciones de productos. Es posible que no se permita la venta de un producto en combinación de otro (por ejemplo por su peligrosidad al combinarlos)
  • Descuentos no autorizados. También sería posible bloquear el checkout en Woocommerce en caso de que se esté utilizando un cupón con algún producto en concreto (aunque este caso ya está previsto por Woocommerce).

Como bloquear el checkout en Woocommerce

Para bloquear el checkout en Woocommerce solamente necesitamos escribir una sencilla función con las condiciones de bloqueo y “engancharla” a la función “woocommerce_after_checkout_validation”

Para esto, como siempre, es recomendable realizar los cambios en el fichero functions.php de nuestro tema hijo. Si aún no has creado un tema hijo en tu instalación de WordPress te explico aquí como hacerlo: Crear un tema hijo en WordPress.

En este ejemplo vamos a bloquear el checkout en función de una categoría de productos. Imaginemos que en tu web vendes “helados” y no quieres venderlos en agosto. Vamos a bloquear el checkout en Woocommerce para la categoría “helados”.

“hook” de la función

Añade esta línea a tu fichero functions.php del tema:

add_action( 'woocommerce_after_checkout_validation', 'ferbcn_check_deny_checkout', 1 );

Con esto haremos que WordPress ejecute la función ‘ferbcn_check_deny_checkout’ cada vez que compruebe el checkut.

Código para comprobar las condiciones

Y este es el código de la función:

function ferbcn_check_deny_checkout() {

  // Ponemos el flag "denegar chekout" en false
  $deny_checkout = false;

// INICIO COMPROBACIONES
  //Comprobamos la fecha. En caso de que estemos en agosto comprobamos si la categoría indicada está en el carrito
  $month = date('m');
  if ($month == 8){
  // Revisamos todo el carrito
    foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
      // Si encontramos la categoría indicada levantamos el flag "denegar checkout"
      if ( has_term( 'helados', 'product_cat', $cart_item['product_id'] ) ) {
          $deny_checkout = true;
          break;
      }
    }
  }
//FIN COMPROBACIONES

  // Hemos encontrado la categoría en el carrito, así que desactivamos el checkout con un mensaje de error.
  if ( $deny_checkout ) {
    $notice = 'No se realizan envíos de helados en agosto.';
    wc_add_notice( $notice, 'error' );

    }
}

Y eso es todo. Puedes cambiar el código de las comprobaciones para checkear cualquier condición que necesites.

En la variable $notice puedes añadir el mensaje que quieras para indicar el motivo del bloqueo del pedido.