web-dev-qa-db-de.com

Effiziente Taxonomie-Überschneidung

Ich habe viele Verwendungszwecke dafür, aber ich möchte die performanteste Art und Weise kennen, die eine teure Operation sein wird.

Als Beispiel werde ich einen Laden benutzen.

Gegeben:

  • Eine Produktmarkentaxonomie
  • Eine Produktgruppen-Taxonomie
  • Ein Produktposttyp
  • Archivvorlagen für die oben genannten Taxonomien

Was ist die effizienteste und performanteste Methode zum Anzeigen eines Markenmenüs in einem Produkttyparchiv und eines Produkttyps in einem Markenarchiv? Zeigen Sie jedoch nur die Begriffe an, die für die Beiträge in dieser Gruppe gelten.

Wenn ich zum Beispiel in der Produktgruppe 'Frauen' bin, werden auf der linken Seite Marken angezeigt, jedoch nur die Marken, die für Produkte in der Produktgruppe 'Frauen' angegeben sind. Z.B. Die Marke 'Fancy Womens Clothes Inc' würde zeigen, aber nicht 'Manly Mens Manly Ltd'.

Ich brauche eine generische Antwort, obwohl ich froh bin, dass das Beispiel für Bekleidungsprodukte verwendet werden kann, und ich weiß, wie man dies mit brutaler Gewalt mit einem gierigen Algorithmus macht, aber das ist unglaublich verschwenderisch, und ich bin nicht an einer Lösung interessiert, die es gibt würde jede Seite um einige Sekunden laden und dabei alle Beiträge vollständig aus der DB laden

edit: Beispiel 2:

Pikachu ist ein gelbes Pokémon und befindet sich im gelben Tag, aber Pikachu ist auch ein elektrisches Pokémon, also im elektrischen Tag der Typtaxonomie. Wie würde ich nur die Arten von Pokémon anzeigen, die im gelben Tag-Archiv gelb sind? z.B. Wenn alle Gras-Pokémon grün sind, bedeutet dies, dass es im gelben Archiv keinen Gras-Menüpunkt geben würde, aber im grünen. (Ja, ich weiß, dass es Gras-Pokémon gibt, die nicht grün sind.)

9
Tom J Nowell

Um dies zu verallgemeinern, müssen alle Begriffe der Taxonomie A abgerufen werden, die Posts mit einem bestimmten Begriff der Taxonomie B haben.

Dies ist zwar nicht in mehreren Schritten unmöglich und es gibt viele Möglichkeiten, Posts zu durchlaufen (was in der Tat ineffizient sein wird), ich halte es jedoch für sinnvoll, aus Gründen der Effizienz SQL zu verwenden.

Meine grobe Einstellung wäre:

/**
 * 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' ) );
12
Rarst