Agregar botón "Checkout" adicional junto al botón "Añadir al carrito" en la página de producto de WooCommerce

28 jun 2017, 15:44:41
Vistas: 27.9K
Votos: 2

Estoy tratando de encontrar una función que agregue un botón ADICIONAL junto al botón estándar "Añadir al carrito" en la página de producto de WooCommerce.

  1. Agregué una carpeta woocommerce en mi tema hijo para modificar single-product => add-to-cart => simple.php
  2. Dentro de simple.php encontré el botón estándar "Añadir al carrito" y después de él es donde quiero agregar mi botón personalizado adicional de "checkout"

Encontré esta función:

function woo_redirect_to_checkout() {
    $checkout_url = WC()->cart->get_checkout_url();
    return $checkout_url;
}

Que funciona bien PERO modifica TODOS los botones "añadir al carrito" en el sitio y estoy tratando de agregarlo SOLO al nuevo botón personalizado que intento añadir (El nuevo botón de checkout). Logré agregar un botón que redirecciona a la página de checkout pero no agrega el artículo al carrito antes de ir al checkout

¿Alguien sabe cómo puedo agregar un NUEVO botón + que este botón no solo vaya a la página de checkout sino que también active la acción "Añadir al carrito" al mismo tiempo?

Gracias

2
Comentarios

¿Puedes explicar un poco más por qué necesitas un segundo botón de pago (en lugar de solo usar el predeterminado)?

Jami Gibbs Jami Gibbs
28 jun 2017 15:48:42

Esto es lo que pidió el cliente... Quiere otro botón que redirija a los clientes directamente a la página de pago

gil hamer gil hamer
28 jun 2017 16:26:22
Todas las respuestas a la pregunta 2
4
11

No necesitas modificar tus archivos de plantilla para esto, en su lugar puedes usar el hook de WooCommerce woocommerce_after_add_to_cart_button. Este hook agregará contenido después del botón "Agregar al carrito".

Si el cliente hace clic en este botón, el producto debería agregarse al carrito y el cliente debería ser enviado a la página de pago, ¿verdad?

Básicamente puedes agregar productos al carrito con un enlace como este:

http://example.com/cart/?add-to-cart=<ID del producto>

Entonces, usando el hook mencionado anteriormente y teniendo en cuenta esta URL, podemos agregar un segundo botón con este fragmento de código:

function add_content_after_addtocart() {

    // obtener el ID actual del producto/publicación
    $current_product_id = get_the_ID();

    // obtener el producto basado en el ID
    $product = wc_get_product( $current_product_id );

    // obtener la URL de la "Página de Pago"
    $checkout_url = WC()->cart->get_checkout_url();

    // ejecutar solo en productos simples
    if( $product->is_type( 'simple' ) ){
        echo '<a href="'.$checkout_url.'?add-to-cart='.$current_product_id.'" class="single_add_to_cart_button button alt">Pagar</a>';
    }
}
add_action( 'woocommerce_after_add_to_cart_button', 'add_content_after_addtocart' );

Esto agregará un botón después del botón normal de Agregar al carrito en las páginas de productos individuales. Como puedes ver, también agregué una verificación para ver si el producto actual es un producto simple o no. Si deseas usar esto con variaciones, es más difícil. Con estos productos necesitas generar una URL como:

http://example.com/cart/?add-to-cart=123&variation_id=456&attribute_pa_colour=negro

Quizás también necesites verificar la opción predeterminada de WooCommerce Habilitar AJAX Agregar al carrito (WooCommerce > Productos > Mostrar). No lo he probado con esta configuración.


Actualización para incluir la cantidad

Si deseas agregar una cantidad, también puedes agregar un parámetro a nuestra URL del botón, así:

http://example.com/cart/?add-to-cart=<ID del producto>&quantity=<número de cantidad>

Sin embargo, dado que un cliente puede cambiar la cantidad con el campo de entrada de WooCommerce, necesitamos una forma de obtener el valor actual de este campo.

Así que tenemos múltiples opciones aquí,

  • escuchar un evento de cambio en el campo de cantidad para actualizar nuestra URL,

  • o agregar el valor actual del campo de cantidad a la URL, solo si se hace clic en nuestro botón personalizado.

El siguiente código utiliza el segundo enfoque, solo cuando se hace clic en el botón se agrega el parámetro.

Dentro de la función if( $product->is_type( 'simple' ) ), antes del echo, ingresa este script:

<script>
    jQuery(function($) {
    <?php /* si se hace clic en nuestro botón personalizado, agregar la cadena "&quantity=", y también el número de cantidad a la URL */ ?>

        // si se hace clic en nuestro botón personalizado
        $(".custom-checkout-btn").on("click", function() {

            // obtener el valor del atributo "href"
            $(this).attr("href", function() {
                // devolver el valor de "href" + la cadena "&quantity=" + el número de cantidad seleccionado actualmente
                return this.href + '&quantity=' + $('input.qty').val();
            });

        });
    });
    </script>

¡No incluí las etiquetas de inicio y fin de PHP en el código anterior! Así que necesitas terminar PHP antes del (?>) y comenzarlo nuevamente después del script (

28 jun 2017 17:47:42
Comentarios

¡Gracias @LWS-Mo! Funciona bien y entiendo que usar variaciones es mucho más complejo porque el precio se establece según lo que el usuario elija. ¡Muchas gracias!

gil hamer gil hamer
28 jun 2017 18:08:20

¿Hay alguna manera de incluir también la cantidad? Ahora mismo solo funciona con un solo producto. Gracias

gil hamer gil hamer
28 jun 2017 19:45:25

@gilhamer Edité la respuesta y agregué algo de código jQuery para incluir la cantidad. Como esto no es tan fácil, ya que necesitamos obtener el valor actual ingresado en el campo de entrada de cantidad, necesitamos usar JS.

LWS-Mo LWS-Mo
30 jun 2017 15:00:51

Gracias colega (y)

Mohammad Arif Mohammad Arif
27 sept 2020 15:30:33
0

Acabo de venir aquí para compartir mi código, el cual me ayudó a resolver el problema de mi cliente de tener dos botones, uno para pagar y otro para añadir al carrito. Utilicé un enfoque diferente que también funciona con productos variables.

function wpcoderpro_direct_checkout_button() {
global $product;
$id = $product->get_id();
if( $product->is_type( 'variable' ) ){
    echo '
<script>
jQuery(document).ready(function($){
  $(".redirect_to_checkout").click(function(){
  $("button.single_add_to_cart_button ").click();
  window.location.href="/checkout/";
  });
});
</script>
<div class="button alt redirect_to_checkout" style="cursor:pointer;">PAGAR AHORA</div>
';
}
elseif( $product->is_type( 'simple' ) ){
  echo '
<script>
jQuery(document).ready(function($){
$(".input-text.qty").change(function(){
  $(".redirect_to_checkout a").attr("href", "/checkout/?add-to-cart='. $id .'" + "&quantity= " + $(this).val());
});
});
</script>
<div class="button alt redirect_to_checkout" style="cursor:pointer;"><a href="/checkout/?add-to-cart='. $id .'">PAGAR AHORA</a></div>
';
}
}
add_action( 'woocommerce_after_add_to_cart_button', 'wpcoderpro_direct_checkout_button', 20 );

Es importante mencionar que uso un plugin para AJAX Añadir al carrito en productos variables, pero no utilizo AJAX Añadir al carrito en productos simples.

Este código va en el archivo function.php de tu tema hijo. Déjame saber si necesitas una explicación :)

20 ago 2019 22:54:22