Intersection de taxonomie efficace

9

J'ai de nombreuses utilisations pour cela, mais je veux connaître la façon la plus performante de faire ce qui va être une opération coûteuse.

À titre d'exemple, je vais utiliser une boutique.

Donné:

  • Une taxonomie de marque de produit
  • Une taxonomie de groupe de produits
  • Un type de poste de produit
  • Modèles d'archives pour les taxonomies ci-dessus

Quelle est la méthode la plus efficace et la plus performante pour afficher un menu de marque dans une archive de type de produit et un type de produit dans une archive de marque, mais n'affichez que les termes qui s'appliquent aux publications de ce groupe.

Ainsi, par exemple, si je fais partie du groupe de produits «femmes», cela affichera les marques sur le côté gauche, mais uniquement les marques spécifiées pour les produits du groupe de produits «femmes». Par exemple, la marque «Fancy womens clothing Inc» s'afficherait, mais pas «Manly mens Manly ltd».

J'ai besoin d'une réponse générique, bien que je sois heureux que l'exemple des produits vestimentaires soit utilisé, et je sais comment le faire avec un algorithme gourmand par force brute, mais c'est incroyablement inutile, et je ne suis pas intéressé par une solution qui augmenterait chaque page de chargement de plusieurs secondes et chargerait tous les articles en entier à partir de la base de données dans le processus

modifier: Exemple 2:

Pikachu est un pokemon jaune et se trouve dans l'étiquette jaune, mais Pikachu est également un pokemon électrique, il se trouve donc dans l'étiquette électrique du type taxonomie. Comment est-ce que je montrerais seulement les types de pokemon qui sont jaunes quand dans l'archive de balise jaune? Par exemple, tous les pokémons d'herbe étant verts signifient qu'il n'y aurait pas d'élément de menu d'herbe dans les archives jaunes mais qu'il y en aurait dans le vert (oui je sais qu'il y a des pokémons d'herbe qui ne sont pas verts)

Tom J Nowell
la source

Réponses:

12

Pour généraliser cela, il s'agit de récupérer tous les termes de la taxonomie A que possèdent les articles avec un terme spécifique de la taxonomie B.

Bien que cela ne soit pas impossible en plusieurs étapes et que de nombreuses publications en boucle (qui seront en effet inefficaces), je pense qu'il est raisonnable de passer par SQL pour plus d'efficacité.

Ma vision grossière serait:

/**
 * 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
la source