Intersezione tassonomia efficiente


9

Ho molti usi per questo, ma voglio conoscere il modo più performante di fare quella che sarà un'operazione costosa.

Ad esempio userò un negozio.

Dato:

  • Una tassonomia del marchio di prodotto
  • Una tassonomia del gruppo di prodotti
  • Un tipo di post di prodotto
  • Modelli di archivio per le tassonomie di cui sopra

Qual è il metodo più efficiente e performante di mostrare un menu di marca in un archivio di tipi di prodotto e un tipo di prodotto in un archivio di marche, ma, mostra solo i termini che si applicano ai post di quel gruppo.

Ad esempio, se faccio parte del gruppo di prodotti "donne", mostrerebbero i marchi sul lato sinistro, ma solo i marchi specificati per i prodotti nel gruppo di prodotti "donne". Ad esempio, il marchio "Fancy womens clothes Inc" verrebbe mostrato, ma non "Manly mens Manly ltd".

Ho bisogno di una risposta generica, anche se sono felice che venga utilizzato l'esempio dei prodotti di abbigliamento e so come farlo con un algoritmo avido di forza bruta, ma è incredibilmente dispendioso e non mi interessa una soluzione che aumenterebbe il caricamento di ogni pagina di alcuni secondi e caricherà tutti i post per intero dal DB nel processo

modifica: Esempio 2:

Pikachu è un pokemon giallo ed è nel tag giallo, ma Pikachu è anche un pokemon elettrico, quindi è nel tag elettrico del tipo tassonomia. Come mostrerei solo i tipi di pokemon che sono gialli nell'archivio tag giallo? ad esempio, se tutti i pokemon di erba sono verdi significa che non ci sarebbe una voce di menu di erba quando si trova nell'archivio giallo ma ci sarebbe nel verde (sì, lo so che ci sono pokemon di erba che non sono verdi)

Risposte:


12

Per generalizzare questo è questione di recuperare tutti i termini di tassonomia A che i post con un termine specifico di tassonomia B hanno.

Anche se questo non è impossibile in diversi passaggi e molti cicli di post (che saranno effettivamente inefficienti), penso che sia ragionevole passare attraverso SQL per efficienza.

La mia opinione approssimativa sarebbe:

/**
 * 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' ) );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.