Wie zeige ich Upsells von Einkaufswagenartikeln auf der WooCommerce-Checkout-Seite an?

Lesezeit: 3 Minuten

Benutzer-Avatar
Louise Fourie

Ich brauche Hilfe, um die Upsells aller Produkte in meinem Warenkorb auf der Checkout-Seite anzuzeigen. Der folgende Code gibt mir den folgenden Fehler:

Aufruf einer Member-Funktion get_upsell_ids() auf Array in…

Hier meine Funktion:

function show_cross_sell( $limit="-1", $columns = 4, $orderby = 'rand', $order="desc" ) {
    global $woocommerce;
    $items      = WC()->cart->get_cart();

    if ( !  $items ) {
        echo 'nothing';
      return;
    }

    // Handle the legacy filter which controlled posts per page etc.
    $args = apply_filters(
      'woocommerce_upsell_display_args',
      array(
        'posts_per_page' => $limit,
        'orderby'        => $orderby,
        'order'          => $order,
        'columns'        => $columns,
      )
    );
    
     foreach($items as $product) { 
    wc_set_loop_prop( 'name', 'up-sells' );
    wc_set_loop_prop( 'columns', apply_filters( 'woocommerce_upsells_columns', isset( $args['columns'] ) ? $args['columns'] : $columns ) );

    $orderby = apply_filters( 'woocommerce_upsells_orderby', isset( $args['orderby'] ) ? $args['orderby'] : $orderby );
    $order   = apply_filters( 'woocommerce_upsells_order', isset( $args['order'] ) ? $args['order'] : $order );
    $limit   = apply_filters( 'woocommerce_upsells_total', isset( $args['posts_per_page'] ) ? $args['posts_per_page'] : $limit );
    
    

    // Get visible upsells then sort them at random, then limit result set.
    $upsells = wc_products_array_orderby( array_filter( array_map( 'wc_get_product', $product->get_upsell_ids() ), 'wc_products_array_filter_visible' ), $orderby, $order );
    $upsells = $limit > 0 ? array_slice( $upsells, 0, $limit ) : $upsells;

    wc_get_template(
      'single-product/up-sells.php',
      array(
        'upsells'        => $upsells,

        // Not used now, but used in previous version of up-sells.php.
        'posts_per_page' => $limit,
        'orderby'        => $orderby,
        'columns'        => $columns,
      )
    );
         
    }
}

Es gibt einige Fehler in Ihrem Code… Im Folgenden werden alle Upsell-IDs (ohne Duplikate) aus Warenkorbartikeln zusammengeführt und als eindeutiger Upsell-Block angezeigt:

function show_items_upsells( $limit="-1", $columns = 4, $orderby = 'rand', $order="desc" ) {
    $cart  = WC()->cart;

    if ( WC()->cart->is_empty() ) {
        echo 'nothing';
        return;
    }

    $upsell_ids = $cart_item_ids = array();
    
    // Loop through cart items
    foreach( $cart->get_cart() as $cart_item ) { 
        // Merge all cart items upsells ids
        $upsell_ids      = array_merge( $upsell_ids, $cart_item['data']->get_upsell_ids() );
        $cart_item_ids[] = $cart_item['product_id'];
    }
    
    // Remove cart item ids from upsells
    $upsell_ids = array_diff($upsell_ids, $cart_item_ids);
    $upsell_ids = array_unique($upsell_ids); // Remove duplicated Ids
    
    // Handle the legacy filter which controlled posts per page etc.
    $args = apply_filters( 'woocommerce_upsell_display_args', array(
        'posts_per_page' => $limit,
        'orderby'        => $orderby,
        'order'          => $order,
        'columns'        => $columns,
    ));
    
    wc_set_loop_prop( 'name', 'up-sells' );
    wc_set_loop_prop( 'columns', apply_filters( 'woocommerce_upsells_columns', isset( $args['columns'] ) ? $args['columns'] : $columns ) );

    $orderby = apply_filters( 'woocommerce_upsells_orderby', isset( $args['orderby'] ) ? $args['orderby'] : $orderby );
    $_order  = apply_filters( 'woocommerce_upsells_order', isset( $args['order'] ) ? $args['order'] : $order );
    $limit   = apply_filters( 'woocommerce_upsells_total', isset( $args['posts_per_page'] ) ? $args['posts_per_page'] : $limit );
    
    // Get visible upsells then sort them at random, then limit result set.
    $upsells = wc_products_array_orderby( array_filter( array_map( 'wc_get_product', $upsell_ids ), 'wc_products_array_filter_visible' ), $orderby, $_order );
    $upsells = $limit > 0 ? array_slice( $upsells, 0, $limit ) : $upsells;

    wc_get_template( 'single-product/up-sells.php', array(
        'upsells'        => $upsells,

        // Not used now, but used in previous version of up-sells.php.
        'posts_per_page' => $limit,
        'orderby'        => $orderby,
        'columns'        => $columns,
    ) );
}

Der Code wird in die function.php-Datei Ihres aktiven untergeordneten Designs (oder aktiven Designs) eingefügt. Getestet und funktioniert.

VERWENDUNGSZWECK: echo show_items_upsells();

  • Deine Antworten sind immer die besten

    – Tami

    15. Juni 2021 um 23:17 Uhr

  • kann ich diesen Code auch verwenden, um Cross-Sells an der Kasse anzuzeigen?

    – ccmanz

    6. Juli um 4:17

1104540cookie-checkWie zeige ich Upsells von Einkaufswagenartikeln auf der WooCommerce-Checkout-Seite an?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy