在WooCommerce的相关产品上,在同一类别前显示交叉销售。

问题描述 投票:1回答:1

我在写一些代码,修改相关产品部分,如下。

  • 如果一个产品有交叉销售的产品,就先显示这些产品,然后用同一类别的其他产品填充最多4个产品*。

  • 如果一个产品没有交叉销售的产品,则显示4个同一类别的产品*。

这是我目前筛选相关产品的功能。

add_filter( 'woocommerce_related_products', 'fivem_add_linked_to_related_products', 9999, 3 );
function fivem_add_linked_to_related_products( $related_posts, $product_id, $args ) {

    $product = wc_get_product( $product_id );
    $cross_sell_ids = $product->get_cross_sell_ids();
    $product_categories = $product->get_category_ids();

    // Get cross sell products
    $cross_sell_products = get_posts( array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'fields' => 'ids',
        'post__in' => $cross_sell_ids,
        'posts_per_page' => 4,
        'exclude' => array( $product_id ),
    ));

    // Calculate how many filler products are needed
    $category_product_count = 4 - count( $cross_sell_products );

    // Exclude main product and cross sell products
    $excluded_products = array_push( $cross_sell_ids, $product_id );

    // Get filler products from same category
    $category_products = get_posts( array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'orderby' => 'rand',
        'fields' => 'ids',
        'post__not_in' => $excluded_products,
        'posts_per_page' => $category_product_count,
        'tax_query' => array(
            array(
                'taxonomy' => 'product_cat',
                'field' => 'id',
                'terms' => $product_categories,
                'operator' => 'IN',
            )
        )
    ));

    // Merge cross sell products with filler products
    $related_products = array_merge( $cross_sell_products, $category_products );

    // Return related products
    return $related_products;

}

目前,上面的代码大部分都能用。

  • 如果设置了交叉销售,则只显示那些交叉销售的产品--即不会填写到4个总的产品
  • 如果没有设置交叉销售,则会按照预期显示同一类别的产品。

我想解决的问题有两个。

  1. 上面的代码没有填满类目产品。如果我删除了 岗位__不在税务查询 参数,它就会被填满,但显然不是同一类别的产品。
  2. 我想先显示交叉销售的产品,然后再显示类别相关的产品。似乎有另一个随机化的地方把顺序搞混了,我不知道这是从哪里来的。

有什么办法可以解决这个问题吗?先谢谢你了。

php wordpress woocommerce categories product
1个回答
3
投票

代码包含

  • 如果一个产品有交叉销售的产品,请先显示这些产品,并将同一类别的其他产品填充到总共4个产品中去
  • 如果一个产品没有交叉销售的产品,则显示4个同一类别的产品。
function filter_woocommerce_related_products( $related_posts, $product_id, $args ) {    
    // Taxonomy
    $taxonomy = 'product_cat';

    // Show products
    $show_products = 4;

    // Get product
    $product = wc_get_product( $product_id );

    // Get cross sell IDs
    $cross_sell_ids = $product->get_cross_sell_ids();

    // Calculate how many filler products are needed
    $category_product_needed_count = $show_products - count( $cross_sell_ids );

    // If category product needed 
    if ( $category_product_needed_count >= 1 ) {
        // Retrieves product term ids for a taxonomy.
        $product_cats_ids = wc_get_product_term_ids( $product_id, $taxonomy );

        // Get product id(s) from a certain category, by category-id
        $product_ids_from_cats_ids = get_posts( array(
            'post_type'   => 'product',
            'numberposts' => $category_product_needed_count,
            'post_status' => 'publish',
            'fields'      => 'ids',
            'tax_query'   => array(
                array(
                    'taxonomy' => $taxonomy,
                    'field'    => 'id',
                    'terms'    => $product_cats_ids,
                    'operator' => 'IN',
                )
            ),
        )); 

        // Merge array
        $related_products = array_merge( $cross_sell_ids, $product_ids_from_cats_ids );
    } else {
        // Slice array until show products
        $related_products = array_slice( $cross_sell_ids, 0, $show_products );
    }   

    // Return
    return $related_products;

}
add_filter( 'woocommerce_related_products', 'filter_woocommerce_related_products', 10, 3 );

// Order by
function filter_woocommerce_output_related_products_args( $args ) { 
    $args['orderby'] = 'id';
    $args['order'] = 'ASC';

    return $args;
}
add_filter( 'woocommerce_output_related_products_args', 'filter_woocommerce_output_related_products_args', 10, 1 );
© www.soinside.com 2019 - 2024. All rights reserved.