web-dev-qa-db-fra.com

Archive de taxonomie: affichez une seule publication par terme dans une taxonomie personnalisée distincte

Je ne parviens pas à trouver une solution pour le catalogue de produits que je construis en utilisant des types de publication personnalisés et 4 taxonomies personnalisées. Le catalogue de produits est séparé par "modèle", mais chaque "modèle" peut comporter jusqu'à 15 variantes de "produit". Chaque "produit" a des attributs différents et je dois pouvoir filtrer une liste de produits en fonction de ces attributs.

Structurellement, j'ai des choses organisées comme suit:

  • Produit (type de message personnalisé)
  • Modèle (taxonomie)
  • Taille (taxonomie)
  • Couleur (taxonomie)
  • Caractéristiques (taxonomie)

À l'exception de "Modèle", chaque taxonomie est utilisée pour filtrer les produits affichés. J'utilise le plug-in Query Multiple Taxonomies pour m'aider à filtrer les attributs de chaque produit. Cela fonctionne très bien. Cela me permet d'utiliser la hiérarchie de modèles Wordpress par défaut et d'apporter toutes mes modifications à un fichier taxonomy.php.

Maintenant, voici où je me perds. J'aimerais limiter les résultats affichés de sorte qu'un seul modèle par modèle soit affiché, même si le filtrage peut renvoyer plusieurs produits par modèle.

J'utilise actuellement The Loop et get_the_terms () pour créer un tableau, puis j'utilise la fonction array_unique () pour enregistrer une seule instance de chaque nom de modèle dans un tableau. Voici le code que j'ai pour cette partie:

$modelSlugs = array();

while (have_posts()) : the_post();

// Gather the model names assigned to each product
$terms = get_the_terms( $post->ID, 'models' );
if ( $terms && ! is_wp_error( $terms ) ) : 
    $term = array_pop($terms);
    $modelSlugs[] = $term->slug;
endif;                               

endwhile;    

$modelList = array_unique($modelSlugs);

Cela ne me donnera qu'un slug (ou un nom) de chaque modèle, ce qui est bien, mais je dois également afficher une vignette de produit et utiliser le lien permanent pour me lier à la page du produit unique. Je sais que je peux générer des requêtes supplémentaires en fonction de chaque slug, mais cela ressemble à un cauchemar de performances.

Plus j'y pense, plus je ne peux m'empêcher de penser que c'est la mauvaise façon de procéder. Je sais que l'objet $ wp_query renvoyé contient tout ce dont je pourrais avoir besoin. Je ne suis pas sûr des astuces à utiliser pour m'assurer de ne montrer qu'un message pour chaque modèle. Existe-t-il un moyen de préparer ou de manipuler l'objet WP_Query renvoyé avant d'exécuter la boucle ou puis-je faire quelque chose à l'intérieur de la boucle pour limiter le nombre de produits affichés?

1
Michael Hendry

Après avoir beaucoup martelé le clavier, je l'ai compris. Ce n'est peut-être pas le meilleur moyen d'y parvenir, mais cela fonctionne et ne nécessite aucune requête de base de données supplémentaire.

J'ai utilisé le code ci-dessus pour générer une liste des modèles que je devais afficher.

J'ai ensuite utilisé ce code pour que tout se passe.

foreach ($modelList as $model) :

$count = 0;
echo '<h2>' . $model . '</h2>';

// Run the loop again to show the products
while (have_posts()) : the_post();

    // Check that the model name for the post is the same as the model 
    if ( has_term( $model, 'models') ) :

        // Show only first item in loop
        if ($count == 0) :

            get_template_part( 'content', 'model' );                                                            

        endif;

        $count++;

    endif; //has_term                   

endwhile;

endforeach;

Laissez-moi vous expliquer un peu ici:

J'ai créé une boucle foreach pour la liste de modèles, puis à l'intérieur, j'ai exécuté la boucle standard pour afficher tous les articles. Pour m'assurer que les publications étaient regroupées par nom de modèle, j'ai utilisé has_term () pour m'assurer que le nom de modèle des publications correspondait à l'élément du tableau. Ensuite, j'ai ajouté un compteur à la boucle while pour m'assurer que seul le premier message était affiché.

2
Michael Hendry