Je travaille sur une page qui répertorie les membres du personnel d'une grande entreprise et tente de minimiser le nombre de fois que je suis obligé d'interroger la base de données car elle devient assez complexe et lente.
'person'
est un type de message personnalisé (il y a environ 300 personnes)'date_accredited'
est un champ de date ajouté via le plugin Advanced Custom Fields.Seul le personnel accrédité aura un 'date_accredited'
.
Je dois répertorier tous les 'person'
MAIS, avec TOUS les membres du personnel accrédités répertoriés (donc environ 20 membres du personnel accrédités arrivent en haut).
Pour le moment, j'appelle WP_Query de la manière suivante:
$args = array(
'posts_per_page' => -1,
'post_type' => 'people',
'no_found_rows' => true,
'meta_key' => 'date_accredited'
);
$people = new WP_Query($args);
Après ça je fais:
while($people->have_posts()): $people->the_post();
$my_post_meta = get_post_meta($post->ID, 'date_accredited', true);
if (!empty($my_post_meta)) {
array_Push($accredited, $post);
} else {
array_Push($notAccredited, $post);
}
endwhile;
Nous laissant avec deux tableaux d'objets 'personne'. Ma pensée était que je serais capable de faire quelque chose comme ceci pour obtenir la liste que je veux:
foreach($accredited as $person):
personTile($person);
endforeach;
foreach($notAccredited as $person):
personTile($person);
endforeach;
J'essaie d'éviter de réinterroger la base de données.
La fonction personTile();
était supposée générer diverses informations et HTML (the_post_thumbnail()
et divers champs de champs personnalisés avancés), mais ce que je réalise maintenant, c’est qu’aucun de ces éléments n’est inclus dans les objets de publication que je reçois de WP_Query()
, je suis donc obligé de le faire. utiliser des choses comme:
get_the_post_thumbnail($person->ID)
get_permalink($person->ID)
get_field('date_accredited', $person->ID)
Toutes ces opérations coûtent une autre requête DB (chacune!), Et pire encore, puisqu'elles sont dans une boucle, chacune se produisant environ 300 fois.
Existe-t-il un moyen d’inclure les champs permalien, vignette et ACF dans la requête de base de données initiale? Aurais-je besoin de recourir à une requête MySQL personnalisée ???
Toutes les autres suggestions sont les bienvenues!
Toutes ces opérations coûtent une autre requête DB (chacune!), Et pire encore, puisqu'elles sont dans une boucle, chacune se produisant environ 300 fois.
Ne paniquez pas! Les publications de votre requête sont stockées dans le cache d'objet de WordPress (qui est simplement de la mémoire, sauf si vous avez un système de cache personnalisé en place).
Toutes les fonctions qui fonctionnent sur les publications transitent par ce cache. Ainsi, dans votre cas, la base de données ne sera pas touchée, même lorsque vous n'êtes pas dans la "boucle".
Vous voudrez cependant faire apparaître cette ligne juste après votre requête:
// http://wpseek.com/function/update_post_thumbnail_cache/
update_post_thumbnail_cache( $people );
Cela lancera deux requêtes supplémentaires (posts & posts meta), qui ajoutent toutes les vignettes (pièces jointes) pour les publications dans l'instance WP_Query
dans le même cache.
Sinon, vous vous retrouverez avec beaucoup de requêtes (deux pour chaque message contenant une vignette).
N.B: Il existe quelques arguments WP_Query
qui modifieront la façon dont les publications sont mises en cache:
update_post_meta_cache
(presque toujours oui)update_post_term_cache
(si vous n'avez pas besoin de termes, vous pouvez enregistrer une requête ici)fields
(sinon all
, rien n'est mis en cache et ce qui précède est ignoré)cache_results
(si false, rien n'est mis en cache et tout ce qui précède est ignoré)