Forma alternativa de ordenar por producto secundario agrupado ya que el filtro `woocommerce_grouped_children_args` se eliminó de WooCommerce 3

3 minutos de lectura

avatar de usuario
Masqtto

En WordPress Woocommerce, he creado un producto agrupado, con muchos subproductos (hijos) en él. Intenté buscar en todas partes, pero no puedo encontrar una solución funcional para ordenarlos por SKU o nombre de producto. Parece que su orderby es generado solo por “Orden de menú”. Aunque como tengo más de 30 subproductos en estos múltiples productos agrupados, sería una gran pérdida de tiempo ordenarlos por valor de pedido de menú.

Probé el siguiente código, pero parece que funcionó en WC 2.5, pero no en 3.0+.

add_filter( 'woocommerce_grouped_children_args', 
'so_22661392_grouped_children_args' );

function so_22661392_grouped_children_args( $args ){

 $args['meta_key'] = 'sku';
 $args['orderby'] = 'meta_value';
 $args['order'] = 'ASC'; 
 return $args;

 }

También busqué explicaciones en Google pero no pude encontrar ninguna. Traté de borrar los transitorios, esto no funciona tan bien:

  WooCommerce>System Status>Tools>Clear Transients

El producto agrupado se puede ver en https://plastmet.ee/uus/toode/umartoru-kork-zzo-pealekaiv/ . La tabla html debería coincidir con los niños a continuación, pero no es así. SKU para niños es “563/9005”, “567/9005”, etc.

¡Cualquier ayuda sería muy apreciada!

  • Ese filtro se eliminó de 3.0 y no se documentó. Abre un problema en GitHub. github.com/woocommerce/woocommerce/problemas

    – Cristina

    19 de junio de 2017 a las 19:09

  • Publiqué algo, tú también deberías: github.com/woocommerce/woocommerce/pull/… Abrir un nuevo ticket

    – Cristina

    19 de junio de 2017 a las 19:13

  • ¿Alguna forma de agregar este filtro orderby al código mientras tanto?

    – Masqtto

    20 de junio de 2017 a las 11:42

  • No, el filtro ya no está, por lo que tendrías que escribir tu propia función, por lo que sé. Publicaría en el repositorio de github para ver cuál es la respuesta. Por lo general, son útiles para señalar en la dirección correcta.

    – Cristina

    20 de junio de 2017 a las 15:05

  • Agregué una recompensa y cambié el título.

    – Cristina

    21 de junio de 2017 a las 18:35

avatar de usuario
birgire

Espero haber entendido bien el problema:

Si hemos anulado el archivo de plantilla single-product/add-to-cart/grouped.phpentonces podríamos usar por ejemplo:

if( $grouped_products )
    usort( $grouped_products, 'wc_products_array_orderby_title' );

para ordenar los productos agrupados por títuloen lugar del predeterminado menú ordenando

También podríamos dar de baja:

add_action( 'woocommerce_grouped_add_to_cart', 'woocommerce_grouped_add_to_cart', 30 );

con una devolución de llamada personalizada en su lugar.

Como último recurso, se podría anular la woocommerce_grouped_add_to_cart() función, por ejemplo, dentro de un complemento, para cambiar el orden del menú.

Se define como:

if ( ! function_exists( 'woocommerce_grouped_add_to_cart' ) ) {

   function woocommerce_grouped_add_to_cart() {
       global $product;

       $products = array_filter( array_map( 'wc_get_product', $product->get_children() ) );

       if ( $products ) {
            usort( $products, 'wc_products_array_orderby_menu_order' );

       wc_get_template( 'single-product/add-to-cart/grouped.php', array(
           'grouped_product'    => $product,
           'grouped_products'   => $products,
           'quantites_required' => false,
       ) );
    }
  }
}

donde uno podría, por ejemplo, usar wc_products_array_orderby_title en cambio.

  • Gracias. Este filtro que se eliminó se detalla aquí cuando se agregó a WooCommerce y luego no se documentó y se eliminó sin saber cómo reemplazarlo. Los productos agrupados son un producto principal con productos secundarios en la página única del producto. github.com/woocommerce/woocommerce/issues/8820

    – Cristina

    22 de junio de 2017 a las 12:43

  • Supongo que una forma adecuada es usar un aviso de desaprobación para desarrolladores, por ejemplo apply_filters_deprecated. ¿Está buscando formas de ordenar el $grouped_products ¿formación? Miré en la dinámica woocommerce_product_get_children filtro (que vi en lo profundo de una clase con el get_prop() método 😉 pero solo se aplica antes del wc_products_array_orderby_menu_order ordenar de $grouped_products. @cristina

    – birgire

    22 de junio de 2017 a las 14:49

  • Póngase en contacto con los desarrolladores si no hay documentación sobre esto. Responden de manera muy oportuna.

    – Shawn

    23 de junio de 2017 a las 19:06

¿Ha sido útil esta solución?