Verbessertes WooCommerce: Upsells basierend auf Produktattributen anzeigen
P粉107991030
P粉107991030 2024-03-27 22:14:56
0
1
443

Ich habe diese großartige Lösung gefunden, um verwandte Produkte basierend auf Produktattributen anzuzeigen, aber zusätzlich möchten wir dasselbe für Upsells tun.

Was ich bisher versucht habe, funktioniert nicht, da ich glaube, dass wir einige zusätzliche Informationen hinzufügen müssen, da die Funktion „related_products“ nicht mit Upsell identisch ist.

add_filter( 'woocommerce_upsell_products', 'upsell_products_by_attribute', 10, 3 );
function upsell_products_by_attribute( $upsells, $product_id, $args ) {
    $taxonomy   = 'pa_attribute';

    $term_slugs = wp_get_post_terms( $product_id, $taxonomy, ['fields' => 'slugs'] );

    if ( empty($term_slugs) )
        return $upsells;

    $posts_ids = get_posts( array(
        'post_type'            => 'product',
        'ignore_sticky_posts'  => 1,
        'posts_per_page'       => 6,
        'post__not_in'         => array( $product_id ),
        'tax_query'            => array( array(
            'taxonomy' => $taxonomy,
            'field'    => 'slug',
            'terms'    => $term_slugs,
        ) ),
        'fields'  => 'ids',
        'orderby' => 'rand',
    ) );

    return count($posts_ids) > 0 ? $posts_ids : $upsells;
}

Also habe ich mich gefragt, ob es möglich wäre, dasselbe mit dem Upsell-Teil zu tun.

P粉107991030
P粉107991030

Antworte allen(1)
P粉806834059

您可以删除默认操作挂钩 woocommerce_after_single_product_summary 并重新添加它,您可以自定义 upsells 产品。检查下面的代码。代码将进入您的活动主题functions.php文件。

$taxonomy = 'pa_color'; 更改为您的自定义分类法。

function modify_woocommerce_upsell_display_based_on_attribute( $limit = '-1', $columns = 4, $orderby = 'rand', $order = 'desc' ){
    
    remove_action( 'woocommerce_after_single_product_summary', 'woocommerce_upsell_display', 15 );

    global $product;

    if ( ! $product ) {
        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,
        )
    );

    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 );

    // set your custom taxonomy here.
    $taxonomy   = 'pa_color';

    $term_slugs = wp_get_post_terms( $product->get_id(), $taxonomy, ['fields' => 'slugs'] );

    $posts_ids = get_posts( array(
        'post_type'            => 'product',
        'ignore_sticky_posts'  => 1,
        'posts_per_page'       => 6,
        'post__not_in'         => array( $product->get_id() ),
        'tax_query'            => array( array(
            'taxonomy' => $taxonomy,
            'field'    => 'slug',
            'terms'    => $term_slugs,
        ) ),
        'fields'  => 'ids',
        'orderby' => 'rand',
    ) );

    if( !empty( $posts_ids ) ){

        // Get visible upsells then sort them at random, then limit result set.
        $upsells = wc_products_array_orderby( array_filter( array_map( 'wc_get_product', $posts_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 the previous version of up-sells.php.
                'posts_per_page' => $limit,
                'orderby'        => $orderby,
                'columns'        => $columns,
            )
        );
    }

}

add_action( 'woocommerce_after_single_product_summary', 'modify_woocommerce_upsell_display_based_on_attribute', 15 );
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage