web-dev-qa-db-fra.com

Intersection efficace de la taxonomie

J'ai de nombreux usages pour cela, mais je veux connaître la manière la plus performante de faire ce qui va coûter cher.

Par exemple, je vais utiliser un magasin.

Donné:

  • Une taxonomie de marque de produit
  • Une taxonomie par 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, qui consiste à afficher un menu de marque dans une archive de type de produit et un type de produit dans une archive de marque, en affichant uniquement les termes qui s'appliquent aux publications de ce groupe.

Ainsi, par exemple, si je fais partie du groupe de produits "femmes", les marques apparaîtront 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 clothes Inc" le montrerait, 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 vêtements soit utilisé, et je sais comment le faire avec un algorithme glouton en force brutale, mais c'est incroyablement inutile, et je ne m'intéresse pas à une solution augmenterait chaque chargement de page de plusieurs secondes et chargerait tous les articles dans la base de données dans le processus

edit: Exemple 2:

Pikachu est un pokémon jaune et figure dans la balise jaune, mais Pikachu est également un pokémon électrique, il est donc dans la balise électrique du type taxonomie. Comment afficherais-je uniquement les types de pokémon qui sont jaunes dans l'archive de balises jaunes? par exemple. tout pokemon d'herbe étant vert signifie qu'il n'y aurait pas d'élément de menu d'herbe quand on se trouvait dans les archives jaunes, mais il y en aurait dans le vert (oui je sais qu'il y a des pokemon d'herbe qui ne sont pas verts)

9
Tom J Nowell

Pour généraliser cela, il est nécessaire de récupérer tous les termes de la taxonomie A qui ont des publications avec un terme spécifique de la taxonomie B.

Bien que ce ne soit pas impossible en plusieurs étapes et qu'il y ait beaucoup de bouclage dans les posts (ce qui sera effectivement inefficace), je pense qu'il est raisonnable de passer par SQL pour plus d'efficacité.

Ma vision approximative 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' ) );
12
Rarst