web-dev-qa-db-fra.com

Obtenez le post permalien dans la boucle mais sans requête de base de données supplémentaire

Je cherche à créer une page "répertoire" personnalisée qui renverra à plusieurs milliers de messages. En raison du nombre élevé, j'essaie de limiter le nombre de requêtes à la base de données. Je remarque que pour établir un lien vers chaque publication, j'appelle get_permalink (), ce qui crée une requête de base de données supplémentaire pour chaque publication.

Est-il possible de récupérer le post permalien sans une requête supplémentaire? J'ai essayé de passer l'objet $ post qui ne semble pas aider. J'ai également examiné la fonction principale et remarqué que le fait de passer l'objet entier avec une valeur $ post-> filter = 'sample' éviterait un appel supplémentaire de get_post () selon:

Pourquoi `get_permalink ()` produit un add. Demande de base de données sans $ post-> filter?

Mais cela semble toujours causer une requête supplémentaire. Des idées?

1
NJ.

Je remarque que pour établir un lien vers chaque publication, j'appelle get_permalink() et cela crée une requête de base de données supplémentaire pour chaque publication.

Pas vrai. Si vous vérifiez le lien vers le très vieux ticket trac # 18822 dans le message que vous avez lié, ce problème a été soulevé par @kaiser en 2011. La question a été répondue par @scribu

Par exemple:

$posts = get_posts();
foreach ( $posts as $post )
    var_dump( get_permalink( $post->ID ) );

ne causera pas de requêtes supplémentaires car toutes ces publications sont mises en cache. Vous pouvez également transmettre l'intégralité de l'objet $ post à get_permalink sans autre requête car get_post() accepte un objet. En fait, get_post() effectuera une requête uniquement si vous transmettez un objet lorsque la propriété filter est définie sur cet objet et que cet ID de publication n'est pas déjà mis en cache.

Comme toujours, je ne vais pas sur la théorie, mais sur les faits, et la façon dont je tire mes faits est en testant

Configurez-vous avec la requête suivante et exécutez-la, puis notez l'heure et les appels de base de données

timer_start();  
$posts = get_posts();
foreach ( $posts as $post ) {

    // REST TO COME LATER

}
echo '<p>' . get_num_queries() . ' queries in ' . timer_stop(1, 5) . ' seconds. </p>';

Sur mon installation locale, j'obtiens les résultats suivants:

20 requêtes en 0.02539 secondes

( REMARQUE: le nombre de requêtes ne concerne pas uniquement la requête, mais le nombre total de requêtes exécutées sur la page, y compris les menus, widgets, requêtes personnalisées, requêtes principales, etc. Les temps peuvent varier à chaque chargement de page )

Maintenant, changez la requête comme indiqué ci-dessous

timer_start();  
$posts = get_posts();
foreach ( $posts as $post ) {

    get_permalink( $post->ID );

}
echo '<p>' . get_num_queries() . ' queries in ' . timer_stop(1, 5) . ' seconds. </p>';

Et c'est mon résultat

20 requêtes en 0.02539 secondes.

Comme vous pouvez le constater et comme je l’ai prouvé, la mémoire cache est d’abord vérifiée avant de lancer une requête, comme décrit dans le ticket trac.

CONCLUSION

Vous pouvez utiliser get_permalink() et vous n'avez pas à vous soucier des appels de base de données supplémentaires en raison du système de cache dans Wordpress. Vous devriez aussi prendre votre temps et travailler avec le ticket trac

2
Pieter Goosen