Agregar campo de cantidad para cada producto en la página de tienda de WooCommerce

10 dic 2013, 13:19:46
Vistas: 31.7K
Votos: 0

Quiero agregar un campo de cantidad para cada producto en la página de tienda. He utilizado

<input type="number" step="1" min="1" name="quantity" value="" title="Cantidad" class="input-text qty text"/>

el código en woocommerce/templates/loop/add-to-cart.php

Pero no logra agregar la cantidad al momento del envío. Por favor, dame alguna sugerencia. Gracias de antemano

0
Todas las respuestas a la pregunta 3
0

Si prefieres hacer esto con ajax, puedes hacerlo con:

Crea un archivo wp-content/themes/your-theme/templates/loop/add-to-cart.php con:

<?php
/**
 * Personalización del botón Añadir al carrito en el Loop.
 *
 * Plantilla con cantidad y soporte para ajax.
 */

if ( ! defined( 'ABSPATH' ) exit; // Salir si se accede directamente.

global $product;
?>

<?php if ( ! $product->is_in_stock() ) : ?>

    <a href="<?php echo apply_filters( 'out_of_stock_add_to_cart_url', get_permalink( $product->id ) ); ?>" class="button"><?php echo apply_filters( 'out_of_stock_add_to_cart_text', __( 'Ver más', 'woocommerce' ) ); ?></a>

<?php else : ?>

    <?php
        $link = array(
            'url'   => '',
            'label' => '',
            'class' => ''
        );

        switch ( $product->product_type ) {
            case "variable" :
                $link['url']    = apply_filters( 'variable_add_to_cart_url', get_permalink( $product->id ) );
                $link['label']  = apply_filters( 'variable_add_to_cart_text', __( 'Seleccionar opciones', 'woocommerce' ) );
            break;
            case "grouped" :
                $link['url']    = apply_filters( 'grouped_add_to_cart_url', get_permalink( $product->id ) );
                $link['label']  = apply_filters( 'grouped_add_to_cart_text', __( 'Ver opciones', 'woocommerce' ) );
            break;
            case "external" :
                $link['url']    = apply_filters( 'external_add_to_cart_url', get_permalink( $product->id ) );
                $link['label']  = apply_filters( 'external_add_to_cart_text', __( 'Ver más', 'woocommerce' ) );
            break;
            default :
                if ( $product->is_purchasable() ) {
                    $link['url']    = apply_filters( 'add_to_cart_url', esc_url( $product->add_to_cart_url() ) );
                    $link['label']  = apply_filters( 'add_to_cart_text', __( 'Añadir al carrito', 'woocommerce' ) );
                    $link['class']  = apply_filters( 'add_to_cart_class', 'add_to_cart_button' );
                } else {
                    $link['url']    = apply_filters( 'not_purchasable_url', get_permalink( $product->id ) );
                    $link['label']  = apply_filters( 'not_purchasable_text', __( 'Ver más', 'woocommerce' ) );
                }
            break;
        }

        // Si es un producto simple.
        if ( $product->product_type == 'simple' ) {
            ?>
            <form action="<?php echo esc_url( $product->add_to_cart_url() ); ?>" class="cart" method="post" enctype="multipart/form-data">
                <?php
                    // Muestra el campo de cantidad.
                    woocommerce_quantity_input();

                    // Muestra el botón de envío.
                    echo sprintf( '<button type="submit" data-product_id="%s" data-product_sku="%s" data-quantity="1" class="%s button product_type_simple">%s</button>', esc_attr( $product->id ), esc_attr( $product->get_sku() ), esc_attr( $link['class'] ), esc_html( $link['label'] ) );
                ?>
            </form>
            <?php
        } else {
          echo apply_filters( 'woocommerce_loop_add_to_cart_link', sprintf('<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" class="%s button product_type_%s">%s</a>', esc_url( $link['url'] ), esc_attr( $product->id ), esc_attr( $product->get_sku() ), esc_attr( $link['class'] ), esc_attr( $product->product_type ), esc_html( $link['label'] ) ), $product, $link );
        }

    ?>

<?php endif; ?>

Y en el archivo functions.php de tu tema pega:

function cs_wc_loop_add_to_cart_scripts() {
    if ( is_shop() || is_product_category() || is_product_tag() || is_product() ) : ?>

<script>
    jQuery(document).ready(function($) {
        $(document).on( 'change', '.quantity .qty', function() {
            $(this).parent('.quantity').next('.add_to_cart_button').attr('data-quantity', $(this).val());
        });
    });
</script>

    <?php endif;
}

add_action( 'wp_footer', 'cs_wc_loop_add_to_cart_scripts' );
11 dic 2013 20:05:18
0

Así es como modifiqué mi archivo loop/add-to-cart.php para lograr esto:

<?php
/**
 * Loop Add to Cart
 *
 * @author      WooThemes
 * @package     WooCommerce/Templates
 * @version     1.6.4
 */

if ( ! defined( 'ABSPATH' ) ) exit; // Salir si se accede directamente

global $product;
?>

<?php if ( ! $product->is_in_stock() ) : ?>

    <a href="<?php echo apply_filters( 'out_of_stock_add_to_cart_url', get_permalink( $product->id ) ); ?>" class="button"><?php echo apply_filters( 'out_of_stock_add_to_cart_text', __( 'Leer más', 'woocommerce' ) ); ?></a>

<?php else : ?>

    <?php
        $link = array(
            'url'   => '',
            'label' => '',
            'class' => ''
        );

        $handler = apply_filters( 'woocommerce_add_to_cart_handler', $product->product_type, $product );

        switch ( $handler ) {
            case "variable" :
                $link['url']    = apply_filters( 'variable_add_to_cart_url', get_permalink( $product->id ) );
                $link['label']  = apply_filters( 'variable_add_to_cart_text', __( 'Seleccionar opciones', 'woocommerce' ) );
            break;
            case "grouped" :
                $link['url']    = apply_filters( 'grouped_add_to_cart_url', get_permalink( $product->id ) );
                $link['label']  = apply_filters( 'grouped_add_to_cart_text', __( 'Ver opciones', 'woocommerce' ) );
            break;
            case "external" :
                $link['url']    = apply_filters( 'external_add_to_cart_url', get_permalink( $product->id ) );
                $link['label']  = apply_filters( 'external_add_to_cart_text', __( 'Leer más', 'woocommerce' ) );
            break;
            default :
                if ( $product->is_purchasable() ) {
                    $link['url']    = apply_filters( 'add_to_cart_url', esc_url( $product->add_to_cart_url() ) );
                    $link['label']  = apply_filters( 'add_to_cart_text', __( 'Añadir al carrito', 'woocommerce' ) );
                    $link['class']  = apply_filters( 'add_to_cart_class', 'add_to_cart_button' );
                } else {
                    $link['url']    = apply_filters( 'not_purchasable_url', get_permalink( $product->id ) );
                    $link['label']  = apply_filters( 'not_purchasable_text', __( 'Leer más', 'woocommerce' ) );
                }
            break;
        }
        if ( $product->product_type == 'simple' ) {

            ?>
            <form action="<?php echo esc_url( $product->add_to_cart_url() ); ?>" class="cart" method="post" enctype='multipart/form-data'>

                <?php woocommerce_quantity_input(); ?>

                <button type="submit" class="button alt"><?php echo $label; ?></button>

            </form>
            <?php

        } else {
            echo apply_filters( 'woocommerce_loop_add_to_cart_link', sprintf('<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" class="%s button product_type_%s">%s</a>', esc_url( $link['url'] ), esc_attr( $product->id ), esc_attr( $product->get_sku() ), esc_attr( $link['class'] ), esc_attr( $product->product_type ), esc_html( $link['label'] ) ), $product, $link );
        }
    ?>

<?php endif; ?>

Nota: esto solo es válido para productos simples.

10 dic 2013 15:49:18
0

Intercepta el botón de añadir al carrito y reemplázalo con el que se usa en la página de producto individual.

/**
* Inicia la personalización
*/
add_action('woocommerce_before_shop_loop', function() {
    add_filter('woocommerce_loop_add_to_cart_link', 'wpse_125946_add_to_cart', 10, 3);
});

/**
* Personaliza el enlace/botón de Añadir al carrito para el bucle de productos
* @param string $button
* @param object $product
* @param array $link
* @return string
*/
function wpse_125946_add_to_cart($button, $product, $link) {
    // No para productos variables, agrupados o externos
    if (!in_array($product->product_type, array('variable', 'grouped', 'external'))) {
        // Solo si se puede comprar
        if ($product->is_purchasable()) {
            // Muestra cantidad +/- con el botón
            ob_start();
            woocommerce_simple_add_to_cart();
            $button = ob_get_clean();
        }
    }

    return $button;
}

Mejor aún, haz eso y soporta añadir al carrito con AJAX -- código disponible en este gist.

11 dic 2013 23:41:17