Agregue un botón personalizado “Comprar ahora” en la página de un solo producto de WooCommerce que borre el carrito, agregue un producto y redirija al pago

4 minutos de lectura

Avatar de usuario de Bekk1111
Bekk1111

Estoy usando este código simple para agregar un botón ‘comprar ahora’ en una sola página de producto.

add_action( 'woocommerce_after_add_to_cart_button', 'add_content_after_addtocart' ); 
function add_content_after_addtocart() {
    // get the current post/product ID
    $current_product_id = get_the_ID();

    // get the product based on the ID
    $product = wc_get_product( $current_product_id );

    // get the "Checkout Page" URL
    $checkout_url = WC()->cart->get_checkout_url();
    
    // run only on simple products
    if( $product->is_type( 'simple' ) ) {
        echo '<a href="'.$checkout_url.'?add-to-cart=".$current_product_id."" class="mongo_single_add_to_cart_button button">Buy Now</a>';
    }
}

Este código redirige efectivamente a la página de pago y agrega el producto al carrito, pero quiero agregarle dos pequeñas características:

  1. Después de hacer clic en el botón, quiero que borre el carrito antes de realizar la acción.

  2. Después de agregar el producto al carrito, quiero que redirija a los usuarios a ‘/verificar’ página. En este momento envía a los usuarios en ‘pago/?agregar-al-carrito=3122’lo que significa que cualquier actualización en la página de pago agrega 1 producto al carrito automáticamente.

¿Algún consejo?

En lugar de usar el add-to-cart param en su url, lo que hará que se agregue el producto (pero también realizará otras acciones en WooCommerce), puede usar una url personalizada para su botón y el template_redirect gancho de acción

De esa manera, se deshace de la funcionalidad integrada en WooCommerce y puede realizar sus propias acciones personalizadas en función de los parámetros GET.

Entonces obtienes:

// Add new/extra button
function action_woocommerce_after_add_to_cart_button() {
    global $product;
    
    // Is a WC product
    if ( is_a( $product, 'WC_Product' ) ) {
        // Run only on simple products
        if ( $product->is_type( 'simple' ) ) {
            // Get product ID
            $product_id = $product->get_id();

            // Get permalink
            $permalink = $product->get_permalink();

            // Output url
            echo '<a href="' . $permalink . '?product_id=' . $product_id . '&redirect_checkout=true" class="mongo_single_add_to_cart_button button">'. __ ( 'Buy Now', 'woocommerce' ) . '</a>';
        }
    }
}
add_action( 'woocommerce_after_add_to_cart_button', 'action_woocommerce_after_add_to_cart_button', 10 );

// Redirect
function action_template_redirect() {
    // Determines whether the current request is for an administrative interface page
    if ( is_admin() ) return;

    // Returns true when viewing a single product
    if ( ! is_product() ) return;

    // Get params
    if ( isset( $_GET['product_id'] ) && isset( $_GET['redirect_checkout'] ) ) {
        // Get param 1
        $product_id = $_GET['product_id'];

        // Get param 2
        $boolean = $_GET['redirect_checkout'];

        // WC Cart
        if ( WC()->cart ) {
            // 1. Empty cart
            WC()->cart->empty_cart();

            // 2. Add to cart
            WC()->cart->add_to_cart( $product_id );

            // 3. Redirect
            // When true
            if ( $boolean ) {
                // Gets the url to the checkout page
                $checkout_url = wc_get_checkout_url();

                // Performs a safe (local) redirect
                wp_safe_redirect( $checkout_url );
                exit;
            }
        }
    }
}
add_action( 'template_redirect', 'action_template_redirect' );

Aquí está el código para borrar el carrito antes de agregar el artículo

add_filter( 'woocommerce_add_to_cart_validation', 'ji_remove_cart_item_before_add_to_cart', 20, 3 );
function ji_remove_cart_item_before_add_to_cart( $passed, $product_id, $quantity ) {
if( ! WC()->cart->is_empty() )
    WC()->cart->empty_cart();
return $passed;}
  1. Después de agregar el producto al carrito, quiero que redirija a los usuarios a la página ‘/pagar’. En este momento, envía a los usuarios a ‘checkout/?add-to-cart=3122’, lo que significa que cualquier actualización en la página de pago agrega 1 producto al carrito automáticamente.

    add_filter(‘woocommerce_add_to_cart_redirect’, ‘ji_redirect_checkout_after_add_to_cart’);

    función ji_redirect_checkout_after_add_to_cart() { return wc_get_checkout_url(); }

  • Gracias, pero mi objetivo es vaciar el carrito solo si un usuario hace clic en el botón “comprar ahora”. ¿Es posible?

    – Bekk1111

    22 de marzo a las 6:45

  • Sí, para eso necesita registrar una nueva acción ajax y llamar a esa acción cuando haga clic en el botón comprar ahora.

    – Usdad Pravin

    22 de marzo a las 6:57

¿Ha sido útil esta solución?