Tối ưu sản phẩm tương tự trong Woo: chỉ lấy theo danh mục con sâu nhất

Cập nhật lần cuối 07/11/2025 by trong WordPress vào 07/11/2025 có 1 Views

Trong Woo, tính năng “Sản phẩm tương tự” (Related Products) thường lấy theo tất cả danh mục mà sản phẩm đang gắn. Điều này dẫn đến việc gợi ý sản phẩm không thật sự liên quan, nhất là khi bạn có hệ thống danh mục theo dạng cây cha → con → cháu.

Ví dụ:

  • Danh mục: A > A1
  • Sản phẩm nằm trong A1

Nhưng Woo lại gợi ý cả sản phẩm thuộc A, khiến kết quả thiếu chính xác và giảm hiệu quả chuyển đổi.

Để duy trì blog nên mình có làm aff cho 1 số bên hosting. Nhưng dù aff mình cũng chọn 1 số nhà cung cấp uy tín về chất lượng và support nên các bạn cứ yên tâm nhé.

Nếu có mua hosting mà có trong list dưới đây các bạn click vào link trước khi mua để ủng hộ mình nhé. Mình cảm ơn nhiều

Trong bài viết này, chúng ta sẽ tối ưu lại cơ chế chọn category, để liên kết sản phẩm chỉ theo danh mục con sâu nhất (leaf category). Việc này giúp:

  • Tăng độ liên quan của sản phẩm gợi ý
  • Tăng tỷ lệ xem thêm sản phẩm
  • Tăng tỷ lệ chuyển đổi đơn hàng

Code chỉ lấy theo danh mục con sâu nhất

Bạn chỉ cần chèn đoạn code sau vào wp-content/themes/{your-theme}/functions.php là xong nhé

/**
 * Author: levantoan.com
 * Chỉ trả về các category con sâu nhất (leaf) của sản phẩm.
 * Ví dụ A > A1 thì chỉ còn A1; nếu SP gắn A > A1 và B > B2 > B3 thì trả về [A1, B3].
 */
add_filter('woocommerce_get_related_product_cat_terms', function( $term_ids, $product_id ) {
    if ( empty( $term_ids ) || is_wp_error( $term_ids ) ) {
        return $term_ids;
    }

    $term_ids = array_unique( array_map( 'intval', (array) $term_ids ) );

    if ( count( $term_ids ) === 1 ) {
        return $term_ids;
    }

    $term_map = array_flip( $term_ids );
    $ancestors = [];

    foreach ( $term_ids as $tid ) {
        $ancs = get_ancestors( $tid, 'product_cat', 'taxonomy' );

        foreach ( $ancs as $anc_id ) {
            if ( isset( $term_map[$anc_id] ) ) {
                $ancestors[$anc_id] = true;
            }
        }
    }

    $leaf_ids = [];
    foreach ( $term_ids as $tid ) {
        if ( ! isset( $ancestors[$tid] ) ) {
            $leaf_ids[] = $tid;
        }
    }

    return ! empty( $leaf_ids ) ? $leaf_ids : $term_ids;
}, 10, 2);

Okie dc rồi. Nhớ clear cache và thử xem kết quả nhé!

5/5 - (1 vote)
  • Bình luận
Sản phẩm nổi bật của Toản
x