Sume las cantidades de productos pedidos por categorías de productos de un pedido de WooCommerce

6 minutos de lectura

avatar de usuario
sentir contenido

Estoy realmente atascado en esto y realmente agradecería cualquier ayuda con esto.

El objetivo es contar la cantidad de artículos en cada categoría en un pedido de Woocommerce para que cada sección pueda estar encabezada por el nombre de la categoría y la cantidad de productos. p.ej:

Hamburguesas x 5

Debajo de esto habrá una lista de todas las hamburguesas en ese pedido.

Ahora pensé que tenía esto trabajando con este código:

$categories = [];
foreach ($order->get_items() as $item) {
  $product_id = $item['product_id'];
  $meta = $item['item_meta'];
  $meta = array_filter($meta, function ($key) {
                    return !in_array($key, Order::getHiddenKeys());
  }, ARRAY_FILTER_USE_KEY);
  $terms = get_the_terms($product_id, 'product_cat');
  $cat_id = $terms[0]->term_id;
  $categories[$cat_id][] = $item;
  $cat_name = $terms[0]->name;
}

foreach($categories as $category => $items){
?>
  <tr>
    <td colspan="3">
      <h4>
        <?php 
        if( $term = get_term_by( 'id', $category, 'product_cat' ) ){
          echo $term->name.' ('.$term->count.')';
          echo " &times; ";
          echo count($items);
        }
        ?>
      </h4>
    </td>
  </tr>
  <?php

Pero me di cuenta de que esto simplemente cuenta la cantidad de productos que se han pedido en esa categoría, no el cantidad. Entonces, si uno de ellos era más de uno del mismo producto, no lo contaría. Entonces, por ejemplo, si la categoría contenía estos tres elementos:

Hamburguesa con queso x 2
Hamburguesa x 1

Volvería dos en lugar de tres.

He estado buscando en las matrices de categorías y términos, pero parece que no puedo encontrar nada que funcione. Estoy seguro de que me estoy perdiendo algo, pero estoy perdido en este momento.

¿Puede alguien señalarme en la dirección correcta, por favor?

(Además, si es de alguna utilidad, esta es una continuación indirecta de una pregunta anterior Filtrado de los artículos de $order de Woocommerce por categoría (término))

  • ¿Cada producto pertenece a una sola categoría de productos? ¿Podría existir la posibilidad de inicializar una matriz con los slugs/ids de todas las categorías de las que desea obtener el conteo?

    – Vincenzo Di Gaetano

    18 de febrero de 2021 a las 19:56

  • Sí, creo que es seguro asumir que los productos solo pertenecerán a una categoría. Hay una variedad de categorías, de ahí proviene la variable $category. Acabo de actualizar mi pregunta para incluir ese bit. Pero solo se deben contar los productos en el orden, no los productos en la categoría en general.

    – Sentir contenido

    18 de febrero de 2021 a las 20:34

Puede hacer esto de dos maneras:

  1. Suma las cantidades de los productos pedidos basado en la categoría de producto obtenida del producto (así que debe ser solo 1)
  2. Configurar una lista de categorías de productos específicas para los que se quiere obtener un recuento de las cantidades de productos adquiridos

SOLUCIÓN #1

Puedes usar el get_the_terms() función para obtener la categoría del producto.

El parámetro de la función debe ser el ID de la orden que se va a contar.

Tenga en cuenta que solo la primera categoría de producto devuelta por el get_the_terms() se comprobará la función. Si un producto tiene más de uno, es posible que tenga resultados inesperados.

// gets an array with the quantities of the ordered products grouped by product categories
function gets_the_quantities_of_products_ordered_grouped_by_product_categories( $order_id ) {

    // initializes the array that will contain the product categories with the ordered quantities of each
    $count_by_cat = array();

    // get the order object
    $order = wc_get_order( $order_id );

    // for each product ordered
    foreach ( $order->get_items() as $item ) {
        $product = $item->get_product();
        // get product categories
        $terms = get_the_terms( $product->get_id(), 'product_cat' );
        foreach ( $terms as $term ) {
            $cat_name = $term->name;
            // if the product category is already present in the array, add the quantities
            if ( array_key_exists( $cat_name, $count_by_cat ) ) {
                $count_by_cat[$cat_name] += $item->get_quantity();
            // otherwise it adds the category and quantity to the array
            } else {
                $count_by_cat[$cat_name] = $item->get_quantity();
            }
            break;
        }
    }

    return $count_by_cat;
}

SOLUCIÓN #2

En este caso tendrá que inicializar una matriz con la lista de nombres de las categorías de productos desea obtener el número de productos pedidos.

Con el has_term() función puede verificar si el producto pertenece a una categoría de producto específica.

El parámetro de la función debe ser el ID de la orden que se va a contar.

// gets an array with the quantities of the ordered products grouped by product categories
function gets_the_quantities_of_products_ordered_grouped_by_product_categories( $order_id ) {

    // initializes the array that will contain the product categories with the ordered quantities of each
    $count_by_cat = array();

    // set the product categories you want to get counts for
    $categories = array(
        'Clothes',
        'Shoes',
        'Pants',
        'Jackets',
        'Hats'
    );

    // get the order object
    $order = wc_get_order( $order_id );

    // for each product ordered
    foreach ( $order->get_items() as $item ) {
        $product = $item->get_product();
        // for each product category
        foreach ( $categories as $cat_name ) {
            // check if the product belongs to one of the product categories
            if ( has_term( $cat_name, 'product_cat', $product->get_id() ) ) {
                // if the product category is already present in the array, add the quantities
                if ( array_key_exists( $cat_name, $count_by_cat ) ) {
                    $count_by_cat[$cat_name] += $item->get_quantity();
                // otherwise it adds the category and quantity to the array
                } else {
                    $count_by_cat[$cat_name] = $item->get_quantity();
                }
                break;
            }
        }
    }

    return $count_by_cat;
}

Ambas funciones devolverá una matriz similar a ésto:

$count_by_cat = array(
    'Shoes' => 4,
    'Pants' => 2,
    'Hats'  => 11
)

Asi que podrías imprimir un código HTML Similar a:

// print the counts for each product category
foreach ( $count_by_cat as $category_name => $count ) {
    echo "<p><strong>" . $category_name . ":</strong> " . $count . "</p>";
}

Ambos códigos han sido probados y funcionan. Agrégalos a functions.php de tu tema activo.

  • ¡Muchas gracias capullo! Lo estaba viendo todo mal al suponer que se podía hacer a partir de las matrices tal como se presentaron. he usado tu Solución #1 y luego reemplazó esta línea: echo count($items); Con esta llamada de función: echo gets_the_quantities_of_products_ordered_grouped_by_product_categories($order->id)[$term->name]; Y está funcionando perfectamente. No creo que me hubiera acercado a eso, así que muchas gracias @Vincenzo-Di-Gaetano

    – Sentir contenido

    18 de febrero de 2021 a las 22:15


¿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