搜尋

首頁  >  問答  >  主體

增強 WooCommerce:根據產品屬性顯示追加銷售

我發現了這個很棒的解決方案,可以根據產品屬性顯示相關產品,但此外,我們還希望對追加銷售執行相同的操作。

到目前為止我所嘗試的方法還不起作用,因為我相信我們必須添加一些附加信息,因為 related_products 功能與追加銷售不同。

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

所以我想知道是否有可能對追加銷售部分做同樣的事情。

P粉107991030P粉107991030247 天前423

全部回覆(1)我來回復

  • P粉806834059

    P粉8068340592024-03-28 11:41:33

    您可以刪除預設操作掛鉤 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 );

    回覆
    0
  • 取消回覆