programing

WooCommerce 관련 상품의 동일 카테고리 앞에 교차판매 표시

topblog 2023. 10. 25. 21:59
반응형

WooCommerce 관련 상품의 동일 카테고리 앞에 교차판매 표시

관련 상품 부분을 다음과 같이 수정하기 위해 코드를 작성합니다.

  • 어떤 상품이 교차 판매 상품을 가지고 있다면, 먼저 그 상품을 보여주고, 같은 카테고리의 다른 상품으로 총 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. 위 코드는 카테고리 상품으로 채워지지 않습니다.post_not_intax_query 인수를 제거하면 작성되지만 동일한 카테고리의 제품에서는 작성되지 않습니다.
  2. 교차판매 상품을 먼저 보여드리고, 카테고리 관련 상품을 보여드리고 싶습니다.어딘가에 순서를 혼동하는 또 다른 무작위화가 있는 것 같은데, 어디서 왔는지 알 수가 없습니다.

이걸 어떻게 고칠 수 있을까요?미리 감사드립니다.

코드 포함

  • 어떤 상품이 교차 판매 상품을 가지고 있다면, 그 상품들을 먼저 보여주고, 같은 카테고리의 다른 상품들로 총 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_posts = array_merge( $cross_sell_ids, $product_ids_from_cats_ids );
    } else {
        // Slice array until show products
        $related_posts = array_slice( $cross_sell_ids, 0, $show_products );
    }   

    // Return
    return $related_posts;

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

언급URL : https://stackoverflow.com/questions/62293670/show-cross-sells-before-same-category-on-related-products-in-woocommerce

반응형