Persimpangan Taksonomi yang Efisien

9

Saya memiliki banyak kegunaan untuk ini, tetapi saya ingin tahu cara paling berkinerja melakukan apa yang akan menjadi operasi yang mahal.

Sebagai contoh saya akan menggunakan toko.

Diberikan:

  • Taksonomi merek produk
  • Taksonomi kelompok produk
  • Jenis posting produk
  • Template arsip untuk taksonomi di atas

Apa yang paling efisien, metode performan, untuk menampilkan menu merek ketika di arsip jenis produk, dan jenis produk ketika di arsip merek, tetapi, hanya menunjukkan persyaratan yang berlaku untuk posting di grup itu.

Jadi misalnya, jika saya berada di kelompok produk 'womens', itu akan menunjukkan merek di sisi kiri, tetapi hanya merek yang ditentukan untuk produk dalam kelompok produk 'womens'. Misalnya, merek 'Fancy womens clothes Inc' akan tampil, tetapi bukan 'Manly mens Manly ltd'.

Saya perlu jawaban umum, meskipun saya senang untuk contoh produk pakaian yang akan digunakan, dan saya tahu bagaimana melakukan ini dengan algoritma serakah oleh kekuatan kasar, tapi itu sangat boros, dan saya tidak tertarik dengan solusi yang akan meningkatkan setiap pemuatan halaman dengan beberapa detik dan memuat semua posting secara penuh dari DB dalam proses

sunting: Contoh 2:

Pikachu adalah pokemon kuning, dan ada di tag kuning, tetapi Pikachu juga merupakan pokemon listrik, jadi itu ada di tag listrik dari jenis taksonomi. Bagaimana saya hanya menampilkan jenis pokemon yang berwarna kuning ketika di arsip tag kuning? mis. semua pokemon rumput yang berwarna hijau berarti tidak akan ada item menu rumput ketika di arsip kuning tetapi akan ada di hijau (ya saya tahu ada pokemon rumput yang tidak hijau)

Tom J Nowell
sumber

Jawaban:

12

Untuk menggeneralisasi ini adalah masalah mengambil semua ketentuan taksonomi A yang diposkan dengan ketentuan taksonomi spesifik B miliki.

Walaupun ini bukan tidak mungkin dalam beberapa langkah dan banyak perulangan melalui posting (yang memang akan tidak efisien), saya pikir masuk akal untuk melalui SQL untuk efisiensi.

Pandangan kasar saya adalah:

/**
 * 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' ) );
Jarang
sumber