Giao lộ phân loại hiệu quả


9

Tôi có nhiều cách sử dụng cho việc này nhưng tôi muốn biết cách hiệu quả nhất để làm những gì sẽ là một hoạt động đắt tiền.

Để làm ví dụ tôi sẽ sử dụng một cửa hàng.

Được:

  • Một phân loại thương hiệu sản phẩm
  • Một nhóm phân loại sản phẩm
  • Một loại sản phẩm bài
  • Mẫu lưu trữ cho các nguyên tắc phân loại trên

Phương pháp hiệu quả nhất, hiệu quả nhất là gì, hiển thị menu thương hiệu khi trong kho lưu trữ loại sản phẩm và loại sản phẩm khi lưu trữ thương hiệu, nhưng, chỉ hiển thị các thuật ngữ áp dụng cho các bài đăng trong nhóm đó.

Vì vậy, ví dụ, nếu tôi ở trong nhóm sản phẩm 'phụ nữ', nó sẽ hiển thị các nhãn hiệu ở phía bên trái, nhưng chỉ các nhãn hiệu được chỉ định cho các sản phẩm trong nhóm sản phẩm của 'phụ nữ'. Ví dụ: nhãn hiệu 'Fancy quần áo phụ nữ Inc' sẽ hiển thị, nhưng không phải là 'Manly mens Manly ltd'.

Tôi cần một câu trả lời chung chung, mặc dù tôi rất vui khi sử dụng ví dụ về các sản phẩm quần áo và tôi biết cách thực hiện điều này bằng thuật toán tham lam bằng vũ lực, nhưng điều đó thật lãng phí và tôi không quan tâm đến một giải pháp sẽ tăng mỗi lần tải trang lên vài giây và tải toàn bộ bài đăng từ DB trong quá trình

chỉnh sửa: Ví dụ 2:

Pikachu là một pokemon màu vàng và nằm trong thẻ màu vàng, nhưng Pikachu cũng là một pokemon điện, do đó, nó nằm trong thẻ điện của loại phân loại. Làm thế nào tôi chỉ hiển thị các loại pokemon có màu vàng khi lưu trữ thẻ màu vàng? ví dụ: tất cả pokemon cỏ đều có màu xanh lá cây có nghĩa là sẽ không có mục menu cỏ khi ở trong kho lưu trữ màu vàng nhưng ở đó có màu xanh lá cây (vâng tôi biết có pokemon cỏ không có màu xanh lá cây)

Câu trả lời:


12

Để khái quát đây là vấn đề lấy tất cả các điều khoản của phân loại A mà các bài viết có thuật ngữ phân loại B cụ thể có.

Mặc dù điều này không phải là không thể trong một số bước và rất nhiều vòng lặp qua các bài đăng (điều này thực sự sẽ không hiệu quả), tôi nghĩ rằng việc sử dụng SQL để đạt hiệu quả là hợp lý.

Điều khó khăn của tôi về nó sẽ là:

/**
 * Get all terms of $tax_to taxonomy that posts in $term_from of $tax_from have.
 *
 * @param string $tax_from  taxonomy name
 * @param string $term_from term slug
 * @param string $tax_to    taxonomy name
 *
 * @return array|WP_Error
 */
function get_intersected_terms( $tax_from, $term_from, $tax_to ) {

    global $wpdb;

    $term_from = get_term_by( 'slug', $term_from, $tax_from );

    $query = "
    SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = '{$tax_to}' AND term_taxonomy_id IN (
        SELECT term_taxonomy_id FROM {$wpdb->term_relationships} WHERE object_id IN (
            SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id = {$term_from->term_taxonomy_id}
        )
    )
    ";

    $term_ids = $wpdb->get_col( $query );

    if( empty( $term_ids) )
        return array();

    return get_terms( $tax_to, array( 'include' => $term_ids ) );
}

// example
var_dump( get_intersected_terms( 'category', 'cat-a', 'post_tag' ) );
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.