web-dev-qa-db-fra.com

Amélioration de WP_Query pour améliorer les performances lorsque des publications aléatoires sont commandées

J'ai fait une nouvelle requête après avoir posé une question sur mon code query_posts ... vous n'avez pas trouvé ça génial, alors j'ai décidé de changer ça.

J'ai fabriqué ça:

$page = (get_query_var('paged')) ? get_query_var('paged') : 1; 
$Rand = new WP_Query("showposts=10&orderby=Rand&paged=$page"); 
while($Rand->have_posts()) : $Rand->the_post();

Ma question est: comment puis-je améliorer cela?

Ne vaut-il pas mieux utiliser un tableau? Donc, le même code, avec un tableau ou pas?

Alors comme ça:

$Rand = new WP_Query( array(
    'showposts' => '10',
    'orderby' => Rand
) );

Est-ce que cela améliorerait ma performance?

Et j'ai lu quelque chose sur l'ajout:

'update_post_meta_cache' => false

Améliorer les performances si les termes ne vont pas être utilisés. Ma question: quels sont les termes quand même? Est-ce qu'ils essaient de dire des tags et/ou des catégories avec cela?

Modifier:

function random_posts( $query ) {
    if ( $query->is_home() && !$query->is_paged() && $query->is_main_query() ) {
        $query->set( 'orderby', 'Rand' );
    }
}

Et si j'utilisais ça? Dois-je changer mon WP_Query ou dois-je le supprimer? Je ne comprends pas ce que pre_get_posts fait réellement.

1
Johan

Le problème avec orderby Rand est que, dans la plupart des configurations, la base de données chargera toutes les publications en mémoire, les ordonnera ensuite de manière aléatoire et renverra ce que vous avez demandé. C'est ce chargement en mémoire qui rend la requête super lente/coûteuse

De même, les termes sont des catégories et des balises individuelles, où catégorie est une taxonomie et la catégorie "développement" est un terme de cette taxonomie.

Enfin, votre extrait de code initial implique que vous utilisez un modèle de page ou tentez de remplacer ce qui est affiché sur la page. Cela est mauvais car la requête principale est ignorée et une deuxième requête est lancée. Le coût de la première requête existe toujours, mais comme il est jeté, c'est une perte de temps. C'est pourquoi query_posts est considéré comme dangereux, le remplacer par une boucle personnalisée WP_Query ne résout pas le problème. Pensez à utiliser pre_get_posts à la place pour intercepter la requête principale et la modifier.

2
Tom J Nowell