Cómo ordenar artículos de una categoría de producto definida para que estén al final de un pedido de carrito, por ejemplo, quiero que todos los productos que pertenecen a una categoría de producto 'botella' estén al final del pedido de carrito.

Encontré este código que ordena por precio, pero me gustaría ajustarlo como se describe arriba.

add_action( 'woocommerce_cart_loaded_from_session', 'prefix_cart_order_prod_cat' );

function prefix_cart_order_prod_cat() {

    $products_in_cart = array();
    // Assign each product's price to its cart item key (to be used again later)
    foreach ( WC()->cart->cart_contents as $key => $item ) {
        $product = wc_get_product( $item['product_id'] );
        $products_in_cart[ $key ] = $product->get_price();
    }

    // SORTING - use one or the other two following lines:
    //asort( $products_in_cart ); // sort low to high
   arsort( $products_in_cart ); // sort high to low

    // Put sorted items back in cart
    $cart_contents = array();
    foreach ( $products_in_cart as $cart_key => $price ) {
       $cart_contents[ $cart_key ] = WC()->cart->cart_contents[ $cart_key ];
    }

    WC()->cart->cart_contents = $cart_contents;

}
2
neilgee 20 ene. 2021 a las 02:02

1 respuesta

La mejor respuesta

Puede usar has_term() función condicional de WordPress para verificar si los artículos del carrito pertenecen a una categoría de producto (pero las categorías definidas deben establecerse para los productos (artículos) relacionados) .

Por lo tanto, el siguiente código clasificará los artículos del carrito con artículos pertenecientes a categorías específicas al final:

add_action( 'woocommerce_cart_loaded_from_session', 'product_category_cart_items_sorted_end' );
function product_category_cart_items_sorted_end() {
    $category_terms    = __('T-shirts'); // Here set your category terms (can be names, slugs or Ids)
    $items_in_category = $other_items = array(); // Initizlizing

    // Assign each item in a different array depending if it belongs to defined category terms or not
    foreach ( WC()->cart->cart_contents as $key => $item ) {
        if( has_term( $category_terms, 'product_cat', $item['product_id'] ) ) {
            $items_in_category[ $key ] = $item;
        } else {
            $other_items[ $key ] = $item;
        }
    }

    // Set back merged items arrays with the items that belongs to a category at the end
    WC()->cart->cart_contents = array_merge( $other_items, $items_in_category );
}

El código va en el archivo functions.php del tema hijo activo (o tema activo). Probado y funciona.

1
LoicTheAztec 19 ene. 2021 a las 23:29