Denegar el pago de artículos específicos del carrito en Woocommerce según las categorías de productos

3 minutos de lectura

avatar de usuario
omukiguy

Basado en Permitir el pago solo cuando un producto de una categoría obligatoria está en el carrito, intenté crear mi propio ejemplo de código que muestra un aviso y evita el pago si el carrito solo contiene productos en categorías específicas. Funciona en la prevención y el aviso de error; sin embargo, al agregar otros productos, aún niega el pago.

/**
 * Renders a notice and prevents checkout if the cart
 * only contains products in a specific category
 */
//add_action( 'woocommerce_check_cart_items', 'brown_wc_prevent_checkout_for_category' );

function brown_wc_prevent_checkout_for_category() {

    // set the slug of the category for which we disallow checkout
    $categories = array('drinks','extra-accompaniments');

    foreach ($categories as $category => $value) {
        // get the product category
        $product_cat = get_term_by( 'slug', $category, 'product_cat' );

        // sanity check to prevent fatals if the term doesn't exist
        if ( is_wp_error( $product_cat ) ) {
            return;
        }

        // check if this category is the only thing in the cart
        if ( brown_wc_is_category_alone_in_cart( $category ) ) {

            // render a notice to explain why checkout is blocked
            wc_add_notice( sprintf( 'Please choose atleast one bento.', $category ), 'error' );
        }
    }

}

/**
 * Checks if a cart contains exclusively products in a given category
 * 
 * @param string $category the slug of the product category
 * @return bool - true if the cart only contains the given category
 */
function brown_wc_is_category_alone_in_cart( $category ) {

    //When the cart is empty, remove warning message that I have set for when the snippet takes effect
    if (!WC()->cart->is_empty()) {
        // All the code
        // check each cart item for our category
        foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {

            // if a product is not in our category, bail out since we know the category is not alone
            if ( ! has_term( $category, 'product_cat', $cart_item['data']->id ) ) {
                return false;
            }
        }

        // if we're here, all items in the cart are in our category
        return true;

    } else {

        return false;   //  Assume you'd want false here, since the cart is empty

    }

}

avatar de usuario
LoicTheAztec

Hay algunos errores en su código que evitan que funcione correctamente. Su código y requisitos son bastante diferentes a los de mi respuesta anterior.

Tendrá que configurar la URL del botón y el texto necesarios para el aviso, como el enlace de la categoría de producto “bento” y el nombre del botón.

Aquí está el código:

// Conditional function that check if the non mandatory product categories are in all cart items
function has_not_mandatory_category(){
    // DEFINE HERE the your non mandatory product categories (Ids, slugs or names)
    $categories = array('drinks','extra-accompaniments');

    // Iterrating each item in cart and detecting…
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $product_id = $cart_item['product_id']; // <== This is the right way (working for product variations too)
        if ( ! has_term( $categories, 'product_cat', $product_id ) )
            return false;
    }
    return true;
}

// Display a message and prevent checkout if the non mandatory product categories are not in all cart items
add_action( 'woocommerce_check_cart_items', 'prevent_checkout_display_notice' ); // for cart and checkout
function prevent_checkout_display_notice() {
    // DEFINE HERE the return button URL and title
    $button_url="#";
    $button_title="Go there";

    // Display message if the non mandatory product categories are not in all cart items
    if ( has_not_mandatory_category() )
        wc_add_notice(
            sprintf( __( 'Please choose at least one bento. <a class="button" href="https://stackoverflow.com/questions/48533752/%s">%s</a>', 'your_theme_domain'),
                $button_url,
                $button_title
            ), 'error'
        );
}

El código va en el archivo function.php de su tema secundario activo (o tema activo).

Probado y funciona…

En lugar de apuntar a categorías de productos no obligatorias, debe hacer lo contrario…

  • Muchas gracias. Esto funciona muy bien y tiene un código más ligero. PD; Tengo menos artículos para denegar el pago que permitir.

    – omukiguy

    31 de enero de 2018 a las 9:28

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad