Effiziente Taxonomie-Schnittmenge


9

Ich habe viele Verwendungsmöglichkeiten dafür, aber ich möchte wissen, wie man am effizientesten vorgeht, was eine teure Operation sein wird.

Als Beispiel werde ich einen Laden benutzen.

Gegeben:

  • Eine Produktmarkentaxonomie
  • Eine Produktgruppentaxonomie
  • Ein Produktposttyp
  • Archivvorlagen für die oben genannten Taxonomien

Was ist die effizienteste und performanteste Methode, um ein Markenmenü in einem Produkttyparchiv und einen Produkttyp in einem Markenarchiv anzuzeigen, aber nur die Begriffe anzuzeigen, 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, aber nur die Marken, die für Produkte in der Produktgruppe "Frauen" angegeben sind. ZB würde die Marke "Fancy Womens Clothes Inc" zeigen, aber nicht "Manly Mens Manly Ltd.".

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

bearbeiten: Beispiel 2:

Pikachu ist ein gelbes Pokemon und befindet sich im gelben Tag, aber Pikachu ist auch ein elektrisches Pokemon, also im elektrischen Tag der Typentaxonomie. Wie würde ich nur die Arten von Pokémon anzeigen, die im gelben Tag-Archiv gelb sind? zB bedeutet, dass alle Graspokemons grün sind, dass es im gelben Archiv keinen Grasmenüpunkt gibt, aber im grünen (ja, ich weiß, dass es Graspokemons gibt, die nicht grün sind)

Antworten:


12

Um dies zu verallgemeinern, müssen alle Begriffe der Taxonomie A abgerufen werden, die Beiträge mit einem bestimmten Begriff der Taxonomie B enthalten.

Obwohl dies nicht in mehreren Schritten unmöglich ist und viele Beiträge durchlaufen werden (was in der Tat ineffizient sein wird), halte ich es aus Gründen der Effizienz für sinnvoll, SQL zu durchlaufen.

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' ) );
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.