Soporte » Plugins y Hacks » WooCommerce » Compra por categorías

  • Buenos días tengo el siguiente código que me permite que mis productos compren solo en una categoría:

    function is_product_the_same_cat($valid, $product_id, $quantity) 
    {
        global $woocommerce; 
        if($woocommerce->cart->cart_contents_count == 0) { 
            return true; 
        } 
        foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) { 
            $_product = $values['data']; 
            $terms = get_the_terms( $_product->id, 'product_cat' ); 
            $target_terms = get_the_terms( $product_id, 'product_cat' ); 
            foreach ($terms as $term) { 
                $cat_ids[] = $term->term_id; 
            } 
            foreach ($target_terms as $term) { 
                $target_cat_ids[] = $term->term_id; 
            } 
        } 
        $same_cat = array_intersect($cat_ids, $target_cat_ids); 
        if(count($same_cat) > 0) return $valid; 
        else {
    		wc_add_notice( 'No puedes comprar productos de restaurantes diferentes, Tienes que hacer un nuevo pedido', 'error' );
    		return false;
        } 
    }
    add_filter( 'woocommerce_add_to_cart_validation', 'is_product_the_same_cat',10,3);

    Pero quería incluir lo siguiente:
    Hay 3 categorías en mi tienda:
    a
    b
    c
    cada una tiene 3 subcategorías:
    a
    a.1
    a.2
    a.3
    b
    b.1
    b.2
    b.3
    c
    c.1
    c.2
    c.3
    Y lo que quisiera es que si compra un producto de la categoría «a» solo permita comprar del a, a.1, a.2 y a.3
    La única modificación del código sería que dejase solo comprar en una categoría y sus subcategorías.
    Sería de gran ayuda, por favor.
    Muchas gracias.
    Un saludo.`

    • Este debate fue modificado hace 1 año, 1 mes por ijdl.
    • Este debate fue modificado hace 1 año, 1 mes por José Arcos.
Viendo 6 respuestas - de la 1 a la 6 (de un total de 6)
  • Moderador José Arcos

    (@josearcos)

    Hola, @ijdl. Dentro del bloque:

    foreach ($target_terms as $term) { 
      $target_cat_ids[] = $term->term_id; 
    }

    Puedes añadir una consulta para que te de todos los terms hijos, asumiendo que siempre será el parent el que se compre.
    Sería algo así:

    foreach ($target_terms as $term) { 
      $args = array(
        'taxonomy' => $taxonomy,
        'parent' => $term->term_id,
      );
      $child_terms = get_terms( $args );
      $terms_string = join(', ', wp_list_pluck($child_terms, 'ID'));
      $target_cat_ids[] = $term->term_id; 
      $target_cat_ids[] = $terms_string; 
    }

    Espero que te sirva la pista, saludos.

    Iniciador del debate ijdl

    (@ijdl)

    Hola @josearcos , lo primero gracias por ayudarme, pero no tengo conocimientos para hacer eso, ¿me podrías decir cómo resulta finalmente? por favor, muchas gracias, un saludo.

    Moderador José Arcos

    (@josearcos)

    Hola, @ijdl. ¿El código que pusiste en el primer mensaje lo creaste tú o lo has encontrado en Internet?
    La idea es poner este código en el archivo functions.php de tu tema:

    function is_product_the_same_cat($valid, $product_id, $quantity) 
    {
        global $woocommerce; 
        if($woocommerce->cart->cart_contents_count == 0) { 
            return true; 
        } 
        foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) { 
            $_product = $values['data']; 
            $terms = get_the_terms( $_product->id, 'product_cat' ); 
            $target_terms = get_the_terms( $product_id, 'product_cat' ); 
            foreach ($terms as $term) { 
                $cat_ids[] = $term->term_id; 
            } 
            foreach ($target_terms as $term) { 
              $args = array(
               'taxonomy' => $taxonomy,
               'parent' => $term->term_id,
              );
              $child_terms = get_terms( $args );
              $terms_string = join(', ', wp_list_pluck($child_terms, 'ID'));
              $target_cat_ids[] = $term->term_id; 
              $target_cat_ids[] = $terms_string; 
            }
        } 
        $same_cat = array_intersect($cat_ids, $target_cat_ids); 
        if(count($same_cat) > 0) return $valid; 
        else {
    		wc_add_notice( 'No puedes comprar productos de restaurantes diferentes, Tienes que hacer un nuevo pedido', 'error' );
    		return false;
        } 
    }
    add_filter( 'woocommerce_add_to_cart_validation', 'is_product_the_same_cat',10,3);

    Como te comentaba, no he probado el código, te recomendaría que buscaras a un desarrollador independiente para hacer esto o a alguna agencia de desarrollo.

    Saludos.

    Iniciador del debate ijdl

    (@ijdl)

    Buenas tardes, el código que te mostré me funciona perfectamente, pero claro al comprar de 2 sub categorías diferentes no me deja ni con este código tampoco.
    No sé si sabrías otra manera de hacerlo sin necesidad de contactar con una agencia.
    Porfavor, muuchas gracias @josearcos , un saludo.

    Moderador José Arcos

    (@josearcos)

    Hola, @ijdl. Tal como te indiqué, tienes que añadir unas líneas al código que me pusiste, lee por favor el mensaje anterior. Si no tuvieras estos conocimientos técnicos, me temo que no te puedo ayudar más en este asunto, puesto que se requiere saber algo de programación para modificar el código.

    Saludos.

    Iniciador del debate ijdl

    (@ijdl)

    De acuerdo, muchas gracias por tu ayuda, un saludo

Viendo 6 respuestas - de la 1 a la 6 (de un total de 6)
  • El debate ‘Compra por categorías’ está cerrado a nuevas respuestas.