Formulario de producto variable con “Comprar ahora” y redirección directa al carrito (WordPress + WooCommerce)

Resumen: Este shortcode imprime el formulario nativo de WooCommerce para un producto (variable o simple) en cualquier página. Cambia el texto del botón a “COMPRAR AHORA” y, al enviar, redirige directamente al carrito.

Prerrequisitos

  • WordPress con WooCommerce activo.
  • Producto configurado (atributos y variaciones, si aplica).
  • Posibilidad de añadir un snippet en el tema hijo o con un gestor de snippets.

Shortcode

Inserta este código en tu tema hijo (functions.php) o en un plugin de snippets:

<?php
// Shortcode: [mini_add_to_cart id=123]
add_shortcode('mini_add_to_cart', function($atts){
  if ( ! function_exists('wc_get_product') ) return '';

  $a = shortcode_atts(['id' => ''], $atts);
  $product = wc_get_product( absint($a['id']) );
  if ( ! $product ) return '';

  // Cargar scripts necesarios para variaciones fuera de la ficha de producto
  wp_enqueue_script('wc-add-to-cart-variation');
  wp_enqueue_script('wc-add-to-cart');

  // Cambiar texto del botón SOLO en este bloque
  $btn_filter = function(){ return __('COMPRAR AHORA','woocommerce'); };
  add_filter('woocommerce_product_single_add_to_cart_text', $btn_filter, 999);

  // Insertar hidden para redirigir al carrito
  $hidden_cb = function(){ echo '<input type="hidden" name="wcacf_redirect" value="1">'; };
  add_action('woocommerce_before_add_to_cart_button', $hidden_cb, 1);

  // Preparar global para plantillas nativas
  $backup = isset($GLOBALS['product']) ? $GLOBALS['product'] : null;
  $GLOBALS['product'] = $product;

  ob_start();
  echo '<div class="mini-atc-wrap">';
  if ( $product->is_type('variable') ) {
    wc_get_template('single-product/add-to-cart/variable.php', [
      'available_variations' => $product->get_available_variations(),
      'attributes'           => $product->get_variation_attributes(),
      'selected_attributes'  => $product->get_default_attributes(),
    ]);
  } elseif ( $product->is_type('simple') ) {
    wc_get_template('single-product/add-to-cart/simple.php');
  } else {
    woocommerce_template_single_add_to_cart();
  }
  echo '</div>';
  $html = ob_get_clean();

  // Limpiar hooks y global
  remove_action('woocommerce_before_add_to_cart_button', $hidden_cb, 1);
  remove_filter('woocommerce_product_single_add_to_cart_text', $btn_filter, 999);
  $GLOBALS['product'] = $backup;

  return $html;
});

// Redirigir al carrito solo cuando el hidden está presente
add_filter('woocommerce_add_to_cart_redirect', function($url){
  if ( isset($_REQUEST['wcacf_redirect']) && $_REQUEST['wcacf_redirect'] === '1' ) {
    return wc_get_cart_url();
  }
  return $url;
}, 999);

// Evitar comillas tipográficas en el shortcode
add_filter('no_texturize_shortcodes', function($shortcodes){
  $shortcodes[] = 'mini_add_to_cart';
  return $shortcodes;
});

Uso

Coloca el shortcode en cualquier página (bloque “Shortcode” o elemento “Shortcode” del builder):

[mini_add_to_cart id=684]

Cómo funciona

  • Renderiza las plantillas nativas (variable.php / simple.php) para conservar precio dinámico, stock y validaciones.
  • El texto del botón se cambia a “COMPRAR AHORA” solo durante la renderización del bloque.
  • Se añade un campo oculto para solicitar la redirección al carrito tras añadir.
  • Se encolan los scripts de variaciones para que el formulario funcione fuera de la ficha de producto.

Solución de problemas

  • No cambia el precio al elegir variación: confirma que se encoló wc-add-to-cart-variation y que los nombres de atributos son attribute_* idénticos a los slugs.
  • No redirige al carrito: inspecciona el HTML y verifica el <input name="wcacf_redirect" value="1">; revisa que el filtro woocommerce_add_to_cart_redirect esté activo.
  • El shortcode se ve como texto: usa el bloque “Shortcode” y evita editores que conviertan comillas en tipográficas. El filtro no_texturize_shortcodes ya está incluido.