web-dev-qa-db-fra.com

L'ajout de widgets avec Image sélectionnée via le Customizer exécute des centaines de requêtes.

J'ajoute un widget via Customizer. C'est un simple widget, avec une boucle de base, qui affiche les 5 derniers messages dans lesquels chaque article a une image en vedette. En raison de l'image sélectionnée, ce widget exécute des centaines de requêtes. Sans cette image, le nombre de requêtes redevient normal.

Cela ne se produit que lors de l'ajout de widgets et de l'affichage du site via le personnalisateur, ce problème n'existe pas en amont.

Également testé avec le widget par défaut WP "Messages récents" avec une seule ligne ajoutée pour chaque message après l'instruction "$ show_date" if.

<?php the_post_thumbnail( 'thumbnail' ); ?>

Est-ce un problème connu?

2
Vasili

Le problème se résume à ce bit de code dans WP_Widget::display_callback():

$was_cache_addition_suspended = wp_suspend_cache_addition();
if ( $this->is_preview() && ! $was_cache_addition_suspended ) {
    wp_suspend_cache_addition( true );
}

Ceci est appelé juste avant WP_Widget_Recent_Posts::widget() et son objectif est d'essayer au mieux l'arrière-compat afin d'empêcher les widgets prévisualisés dans le Customizer de polluer le cache d'objets avant la publication des modifications. Dans le cas du widget Articles récents affichant l'image sélectionnée avec chaque article, suspendre le cache signifie que le postmeta de chaque article devra éventuellement être interrogé et interrogé chaque fois que l'utilisateur accédera à celui-ci.

La solution de contournement pour désactiver explicitement la suspension du cache lors du rendu de votre widget consiste à ajouter ce qui suit au début de la méthode widget de votre sous-classe de widget:

if ( $this->is_preview() && wp_suspend_cache_addition() ) {
    wp_suspend_cache_addition( false );
}

Ceci annulera immédiatement la suspension d'ajout de cache qui était juste dans la méthode invoquant WP_Widget::display_callback(), et le nombre de requêtes devrait revenir à ce que vous voyez sur le front-end.

1
Weston Ruter