Skuteczne skrzyżowanie taksonomii

9

Mam do tego wiele zastosowań, ale chcę poznać najbardziej wydajny sposób robienia tego, co będzie kosztowną operacją.

Jako przykład skorzystam ze sklepu.

Dany:

  • Taksonomia marki produktu
  • Taksonomia grupy produktów
  • Rodzaj postu produktu
  • Archiwizuj szablony dla powyższych taksonomii

Jaka jest najskuteczniejsza i najskuteczniejsza metoda wyświetlania menu marki w archiwum typu produktu oraz typu produktu w archiwum marki, ale pokazują tylko warunki, które dotyczą postów w tej grupie.

Na przykład, gdybym należał do grupy produktów „damskie”, pokazywałby marki po lewej stronie, ale tylko marki określone dla produktów z grupy „damskiej”. Np. Pojawiłaby się marka „Fantazyjne ubrania damskie Inc”, ale nie „Manly mens Manly ltd”.

Potrzebuję ogólnej odpowiedzi, choć cieszę się, że mogę skorzystać z przykładu produktów odzieżowych i wiem, jak to zrobić za pomocą brutalnego algorytmu brutalną siłą, ale to niewiarygodnie marnotrawstwo i nie interesuje mnie rozwiązanie zwiększy każde ładowanie strony o kilka sekund i załaduje wszystkie posty w całości z bazy danych w procesie

edycja: Przykład 2:

Pikachu to żółty pokemon i znajduje się w żółtym znaczniku, ale Pikachu jest również pokemonem elektrycznym, więc znajduje się w znaczniku elektrycznym taksonomii typu. Jak wyświetlić tylko te typy pokemonów, które są żółte, gdy znajdują się w archiwum żółtych znaczników? np. wszystkie zielone pokemony z trawą oznaczają, że w żółtym archiwum nie będzie pozycji menu z trawą, ale w zielonym (tak, wiem, że są pokemony z traw, które nie są zielone)

Tom J Nowell
źródło

Odpowiedzi:

13

Uogólnieniem jest kwestia pobrania wszystkich warunków taksonomii A, które mają posty z określonym terminem taksonomii B.

Chociaż nie jest to niemożliwe w kilku krokach i mnożeniu pętli przez posty (co rzeczywiście będzie nieefektywne), myślę, że rozsądne jest przechodzenie przez SQL dla wydajności.

Moje szorstkie podejście to:

/**
 * 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' ) );
Rarst
źródło