Redireccionar después de la compra en WooCommerce

En este artículo no solo vamos a ver cómo redirigir a una página en concreto después de la compra, sino cómo hacerlo en función de la categoría o producto.


por

Fecha original artículo: 9/07/2017. Actualizado el 11/02/2020

Una de las páginas más desaprovechadas según los expertos es la página de gracias o confirmación después de realizar una compra.

WooCommerce pedido recibido

Por defecto WooCommerce nos lleva a una página muy básica, y es una pena, ya que:

  • El tráfico que recibe es tráfico de mucha calidad: te acaban de contactar o comprar
  • Tienes la oportunidad de decirle al usuario que debe o puede hacer a continuación:  registrarse al newsletter, compartir en redes sociales, un cupón de descuento…

Las opciones son muchas y cualquiera será mejor que un simple «gracias»,

¿Cómo redireccionar a la página que nosotros queramos después de una compra en WooCommerce?

Para ello, podemos utilizar un código sencillo donde le indicamos a qué página queremos que redirija una vez realizada la compra:

Sin embargo es posible que a veces necesitemos poder modificar esta redirección en función del producto que el cliente haya comprado, ya sea para una categoría, o un producto en concreto, que por la razón que sea le quieres ofrecer información diferente en el momento de realizar el pedido.

En este código tenemos dos ejemplos, el primero mira si en el pedido hay un producto de la categoría que le indicamos. En el segundo si hay un producto de entre los de la lista de ID’s que hemos puesto.

También se pueden combinar de cualquier forma, o incluso con condiionales negativos, comprobando que un producto no está en el pedido.

Es una forma sencilla de personalizar el proceso de compra con WooCommerce dandole un toque de usabilidad y detalle que los usuarios lo agradeceran y aunque existen plugins para poder hacer estas redirecciones, podemos simplificarlo con un código.

Si necesitas más información sobre como personalizar la página de gracias de WooCommerce, en lugar de crear una redirección, estos dos artículos te pueden ser muy útiles:

https://www.tychesoftwares.com/how-to-customize-the-woocommerce-thank-you-page/
https://nicola.blog/2015/01/21/customize-the-thank-you-page-in-woocommerce/

¿Eres implementador o desarrollador WordPress?

En la Zona DPW encontrarás más recursos, tutoriales, plantillas, y una biblioteca de snippets para poder utilizar en tu día a día y ganar tiempo en tu trabajo:

ACCEDER AHORA

Comentarios

40 respuestas a «Redireccionar después de la compra en WooCommerce»

  1. Avatar de MDM

    |

    Hola, muchas gracias por el aporte.

    Sabes si es compatible con la ultima versión de wordpress?

    muchas graciasssssssss

    1. Avatar de esther

      |

      Hola! Pues diría que sí, pero estos temas delicados siempre es mejor probarlos en un duplicado o sitio en staging por si acaso.

      Saludos!

  2. Avatar de Jonatán

    |

    Hola Esther, muchas gracias por el aporte, todo funciona muy bien. Excelente trabajo.

    1. Avatar de esther

      |

      Muchas gracias Jonatán!

  3. Avatar de Giuliana

    |

    Hola! dónde se coloca estos códigos? gracias!

    1. Avatar de esther

      |

      Hola Giuliana,
      Normalmente se añaden en el archivo de funciones del tema o tema hijo (functions.php), pero ojo que un error en ese fichero puede hacer que falle toda la web.
      Otra opción es usar un plugin para añadir snippets de código, como el que comento aquí: https://www.esthersola.com/reaprovecha-codigo-wordpress-code-snippets/

      Saludos!

  4. Avatar de Erick

    |

    Hola yo quiero que si compran un producto de una categoria los mande a una pagina pero para las demas categorias quiero que los mande a la pagina de finalizar compra normal.
    que enlace debo pocomo hacer que al completar compra sean redirigidos wordpress poner porque puse ejemplo : https://midominio.com/order-received/ y no lleva a ningun lado….

  5. Avatar de Erick

    |

    Perdonen mi comentario jaja no me di cuenta que me comi palabras…. cuando compren un producto de alguna otra categoria quiero que sean redirigidos a la pagina normal de finalizar compra.

    1. Avatar de esther

      |

      Hola Erick,
      En principio no has de poner ninguna en concreto, simplemente salir de la función si no cumple la condición, por ejemplo:

      if ( $cat_in_cart ) {
      wp_redirect( ‘https://dominio.com/gracias-musica/’);
      }

      Saludos!

  6. Avatar de Benjamín

    |

    Esther, te acabas de convertir en mi ídolo. No tengo ni idea de código, pero en dos minutos he podido hacer el cambio que necesitaba.
    Un millón de gracias

    1. Avatar de esther

      |

      Jajaja, muchas gracias Benjamín… el siguiente paso es aprender algo de código 😉

    2. Avatar de lucas

      |

      Hola benjamin, como hiciste para que te funcione? a mi ninguna de las dos opciones me da. Espero tu respuesta. gracias

  7. Avatar de Jose Daniel

    |

    Muchas Gracias por el aporte… me está siendo muy útil. Verás estoy montando una web con woocommerce y un plugin llamado PayPerPost. Con este enlazamos un producto con un post y cuando se paga el post es visible. El problema que tengo es que cuando el cliente compra se queda en la página de finalizar compra y me gustaría que al terminar fuera redirigido al post donde está el contenido a ver.

    Muchas gracias de antemano y un saludo.

    1. Avatar de esther

      |

      Hola Jose Daniel, no conozco este plugin, pero quizás deberías contactar con su soporte para ver si te pueden ayudar, ya que dependerá de su funcionalidad y lo que permita realizar.

      Saludos!

  8. Avatar de CRISTIAN

    |

    ¡Hola Esther!
    Estoy configurando una tienda con 7-8 productos y necesito que cada producto redirija a una pagina diferente. Eso es posible?

    Gracias!

    1. Avatar de esther

      |

      Hola Cristian,

      Sí, si quieres hacerlo con código deberías adaptar el código para comprobar los productos en el carrito y un condicional para redireccionar en cada caso a la página correspondiente.
      En este caso igual te es más práctico utilizar un plugin como WC Thanks Redirect

      Saludos!

  9. Avatar de Eleuterio

    |

    Muchas Gracias Esther

    Estoy empezando en Worpress y me sirvio mucho.

    1. Avatar de esther

      |

      Gracias! Me alegra que te haya servido.

  10. Avatar de Guadalupe

    |

    Hola, gracias por su noble aportación
    me ha servido.
    Solo tengo una duda, para redirigir productos cada producto que tenga a diferentes paganías debería crear snippets diferentes para ello o en el mismo snippet creado se puede lograr?
    Soy nueva programando en php y no se jugar con las variables para poder lograrlo en el mismo snippet.
    Saludos.

    1. Avatar de esther

      |

      Hola Guadalupe!
      Puedes aprovechar el mismo snippet. En el ejemplo hay el código donde indicas un array de productos ($product_ids = array( 37, 25, 50 ); // lista de productos por ID ), puedes sustituirlo y diferenciar por producto en concreto, aunque necesitas algo de práctica con el PHP 😉

      Saludos!

  11. Avatar de Sergi

    |

    Hola Esther,

    Estoy usando tu código para redirigir a una página de agradecimiento después de que el cliente haga un pedido, pero me gustaría poder redirigir a una página de agradecimiento u otra en función del método de pago. En contacto tarjeta o transferencia bancaria.

    Gracias.

    1. Avatar de esther

      |

      Hola Sergi,

      Podrías hacer un condicional como en el código del ejemplo, pero comprobando el método de pago, que puedes obtenerlo con $order->get_payment_method();

      Saludos!

  12. Avatar de Sergi

    |

    Hola Esther. Gracias por tu respuesta, pero si el código inicial es este (abajo) no veo donde poner tu [$order->get_payment_method();] exactamente

    query_vars[‘order-received’] ) ) {
    wp_redirect( ‘http://www.yoururl.com/gracias/’ );
    exit;
    }
    }

    ?>

  13. Avatar de ELI

    |

    Hola Esther. Como todos te doy las gracias por tu aportación, yo estoy utilizando este trozo de código para que según qué producto compren les redirija a una pagina o a otra, en mi caso solo tengo 2 productos:

    add_action( ‘woocommerce_thankyou’, function ($order_id) {
    $order = wc_get_order( $order_id );
    $in_order = false;
    $products = array(108);

    foreach ($order->get_items() as $product) {
    if (in_array($product->get_product_id(), $products)) {
    $in_order = true;
    } break;
    }
    if ( ! $order->has_status( ‘failed’ )) {
    if ($in_order) {
    wp_safe_redirect(‘http://www.avempruebas.es.mialias.net/bienvenidx-a-avem/’);
    exit;
    } else {
    wp_safe_redirect(‘http://www.avempruebas.es.mialias.net/bienvenido/’);
    exit;
    }
    }
    });

    Ahora bien, mi pregunta es la siguiente… Si quiero que una vez hayan comprado, finalicen el proceso de compra y les haya redirigido a la pagina que corresponda LES CIERRE LA SESIÓN DE LA CUENTA…??? Como puedo hacer esto? Se te ocurre algo??
    Mil gracias anticipadas.
    Un saludo!!

    1. Avatar de esther

      |

      Hola Eli,
      Teóricamente podrías hacerlo con un wp_logout(); antes del redirect, pero ten en cuenta que en ese caso no les podrá mostrar información sobre su pedido ni nada.

      Saludos!

  14. Avatar de Maria

    |

    hola Esther, muchas gracias por tu aporte, una consulta como puedo hacer, para cuando el cliente realice una compra de un producto de una categoría es especifica me envié los datos del cliente y la compra a laravel

    1. Avatar de esther

      |

      Hola María!
      Pues la verdad es que ni idea… no utilizo Laravel. Igual en algún foro específico de ese lenguaje te pueden ayudar más.

      Saludos!

  15. Avatar de Miguel

    |

    Buenos Esther,
    Muchas gracias por tus aportaciones, en este y otros artículos , en más de una ocasión me has sacado de dudas y aportado soluciones fáciles de implementar…Buen trabajo.
    Te expongo mi problema, estoy utilizando tú código para redirigir al cliente después de la compra a una página determinada, y funciona muy bien.
    Como necesito grabar unos dato en mi base de datos, la dirección a la que reenvio, es una lista con una cabecera. Si esa cabecera la escribo a mano, todo funciona perfecto, pero el caso es que tengo que sacarla de un campo del formulario de pago.
    Te pongo un ejemplo para que me entiendas:
    Ejemplo que funciona perfectamente:
    wp_redirect( ‘https://midominio.com/creditpay30.php?usuario=manolo’);
    Ejemplo que no funciona:
    wp_redirect( ‘https://midominio.com/creditpay30.php?usuario='[‘billing_cliente’]);
    [‘billing_cliente’] es el campo que contiene el valor que necesito en el formulario de finalizar compra, tambíen he intentado meterlo en una variable ($variable1=[‘billing_cliente’], pero el código no funciona.

    Te agradecería que me dijeras si hay algún modo de hacerlo

    Muchas gracias y mucho ánimo para seguir con este trabajo maravilloso que haces

    1. Avatar de esther

      |

      Hola Miguel,
      El valor de la variable lo has de añadir así:
      wp_redirect( ‘https://midominio.com/pagina.php?usuario='.$variable);
      Pero te has de asegurar que $variable esté devolviendo el valor que necesitas, porque en el ejemplo [billing_cliente] no tiene el formato correcto, no se en tu caso concreto como será, pero normalmente es un array del estilo $datos[«billing_cliente»]
      No se si me he explicado, cualquier duda me dices!

      Saludos,

      1. Avatar de Miguel

        |

        Muchas gracias por tu respuesta, me va despejando dudas y aportando soluciones.
        Tu indicación de como añadir el valor de la variable me ha sido útil para añadirlo a la linea de código sin declarar previamente una variable.
        La linea de código queda así, sin errores en el editor:
        wp_redirect(‘https://midominio.com/creditpay30.php?usuario=’.[«billing_cliente»]);
        Pero el valor que me devuelve [«billing_cliente»] no es el del campo con el nombre del cliente, sino el texto «Array»
        Disculpa si mi ignorancia en php, me lleva a preguntar cosas que son más que evidentes para vosotros, es lo que tiene ser un apasionado autodidacta.
        Espero esto le sirva algún lector que tenga la misma duda que yo
        Muchas gracias por todo tú interés.
        Saludos

        1. Avatar de Miguel

          |

          Buenas de nuevo Esther.
          Ya he conseguido que tú código realice la función que necesito. ¡¡¡EUREKA!!!
          he declarado la variable así:
          $usuario= $order->get_billing_cliente(); /*
          y lo he añadido del modo que tu me dijiste:
          wp_redirect( ‘https://midominio.com/pagina.php?usuario=’.$variable);
          **Solo una salvedad, si el valor que necesitas, no es de un campo que por defecto venga en el checkout de woocommerce, NO FUNCIONA. Lo comento porque yo edité un campo nuevo con el pluging » Checkout Field Editor for WooCommerce» y utlizando la etiqueta de ese campo no funcionaba.
          Espero que este hilo sirva para alguien que tenga la misma necesidad.

          Nuevamente, muchísimas gracias por todo

          1. Avatar de esther

            |

            Gracias por compartirlo Miguel! y enhorabuena por conseguirlo :))

  16. Avatar de Jesus

    |

    Esther muchísimas gracias por compartir tus conocimientos, tu código me funciono perfectamente

  17. Avatar de Matias

    |

    Hola Esther, muchas gracias por el codigo funciona muy bien!!
    Quisiera saber si me puede ayudar a agregar a una pagina (la cual redireccione luego del pago) el formulario de pedido del cliente para que le aparezca el numero de pedido y lo que compró

    Muchas gracias!!

    1. Avatar de esther

      |

      Hola Matias,
      Por defecto WooCommerce ya te redirecciona a una página con los detalles del pedido, quizás en lugar de crear una redirección distinta podrías personalizar un poco esa página que genera el plugin.
      Saludos!

  18. Avatar de Rafa

    |

    Hola, muy chulo el post. Mi pregunta es, ¿si quiero que cada producto lleve a una página correspondiente como debería hacerlo?, ¿copiando el mismo código por cada uno de los producto y poniendo en la condición else una página genérica que no se va a usar?

    No se si me he explicado, es decir, tengo 3 producto y necesito 3 landings de agradecimiento distintas.

    Muchas gracias

    1. Avatar de esther

      |

      Hola Rafa!
      Sí, exacto, puedes crear un condicional o switch para los tres productos y una por defecto genérica para cualquier otro caso.

      Saludos!

  19. Avatar de Pau

    |

    Muy buenas a todos!
    Gracias Esther por tu maravilloso blog, he aprendido muchísimo!
    Me gustaría hacer una pregunta: he conseguido que redireccione a una pagina diferente cuando compran un producto de una categoría, pero no consigo de ninguna manera que me redirija a diferentes páginas según la categoría (es decir poniendo mas de una categoría), siempre me acaba llevando a la misma pagina sea la categoría que sea.
    Comparto aquí mi código para una mejor asesoría. Muy agradecido de cualquier respuesta!

    // Redirigir a una página diferente si compra un producto de la categoría ‘mezcla-y-mastering-online’

    add_action( ‘template_redirect’, ‘wc_custom_redirect_after_purchase’ );

    function wc_custom_redirect_after_purchase() {

    global $wp;

    if ( is_checkout() && ! empty( $wp->query_vars[‘order-received’] ) ) {

    $cat_in_cart = false;
    $order_id = isset( $wp->query_vars[‘order-received’] ) ? intval( $wp->query_vars[‘order-received’] ) : 0;
    $order = new WC_Order( $order_id );
    $product_categories = array( ‘mezcla-y-mastering-online’, ‘asesoria-personalizada’ );

    foreach( $order->get_items() as $item ){
    if( has_term( $product_categories, ‘product_cat’, $item->get_product_id() ) ) {
    $cat_in_cart = true;
    break;
    }
    }

    if ( $cat_in_cart) {
    if(in_array(«asesoria-personalizada», $product_categories)){
    wp_redirect( «https://artchitectsproductions.com/gracias-compra-asesoria/»);
    } elseif (in_array(«mezcla-y-mastering-online», $product_categories)){
    wp_redirect(«https://artchitectsproductions.com/gracias-compra-mezcla-y-mastering-online/»);
    }

    } else {
    wp_redirect(«https://artchitectsproductions.com/gracias-por-tu-compra/»);
    }
    exit;

    }
    }

    1. Avatar de esther

      |

      Hola Pau!
      El problema es el condicional que utilizas para redireccionar a uno u otro sitio, ya que en el array $product_categories están las dos siempre ($product_categories = array( ‘mezcla-y-mastering-online’, ‘asesoria-personalizada’ );) y estás fuera del foreach del carrito.
      Yo lo que probaría es de guardar una variable dentro del foreach si la categoría es la que te interesa saber (tipo if($product_categories == ‘mezcla-y-mastering-online’) $esmezcla= 1;), y luego comprobarlo a través de esa variable para redireccionar.

      No se si me explicado bien… sino me lo dices o cuando pueda preparo un post más desarrollado.

      Saludos!
      esther

      1. Avatar de Pau

        |

        Saludos Esther:) muchas gracias por tu rapida y logica respuesta!
        Soy completamente novato en esto del codigo aunque logro entender mas o menos la cadena que sigue cada elemento.
        Ayer llegué a esa conclusión, que el condicionante if ($cat_in_cart) estaba diciendo que si en el carrito hay un producto con categoria, da igual sea me llevará al enlace, por lo tanto nunca distinguirá entre categorías diferentes.
        Me alegra saber que no iba tañ desencaminado, ahora escribirlo ya… hahahah es otra cosa para mi.
        No se como representar tu respuesta en codigo, la entiendo pero no la ejecuto.
        Seria maravilloso dominarlo, es una forma muy interesante de hacer redirects sin tener otro plugin mas instalado.
        Agradezco mucho tu tiempo y la paciencia!