Je suis en train de travailler sur une tâche pour laquelle je dois rentrer 100 messages sous une seule page/une seule demande avec leurs images en vedette.
En utilisant la méthode wordpress de retriver les publications, puis de récupérer individuellement l’image sélectionnée à l’aide de la fonction get_the_post_thumbnail
, le chargement de la page prend beaucoup de temps.
Quelqu'un peut-il fournir une solution plus rapide pour cela, comme les messages de retrive et l'image sélectionnée sous une seule requête? Cela devrait accélérer le processus.
Travaillé sur un problème similaire récemment. Voici la requête SQL pour obtenir le message avec Featured Image.
global $wpdb;
$perpage = 10;
$page = 1; // Get the current page FROM $wp_query
$counter = $perpage * $page;
$uploadDir = wp_upload_dir();
$uploadDir = $uploadDir['baseurl'];
$sql = "
SELECT
post.ID,
post.post_title,
post.post_date,
post.category_name,
post.category_slug,
post.category_id,
CONCAT( '".$uploadDir."','/', thumb.meta_value) as thumbnail,
post.post_type
FROM (
SELECT p.ID,
p.post_title,
p.post_date,
p.post_type,
MAX(CASE WHEN pm.meta_key = '_thumbnail_id' then pm.meta_value ELSE NULL END) as thumbnail_id,
term.name as category_name,
term.slug as category_slug,
term.term_id as category_id
FROM ".$wpdb->prefix."posts as p
LEFT JOIN ".$wpdb->prefix."postmeta as pm ON ( pm.post_id = p.ID)
LEFT JOIN ".$wpdb->prefix."term_relationships as tr ON tr.object_id = p.ID
LEFT JOIN ".$wpdb->prefix."terms as term ON tr.term_taxonomy_id = term.term_id
WHERE 1 ".$where." AND p.post_status = 'publish'
GROUP BY p.ID ORDER BY p.post_date DESC
) as post
LEFT JOIN ".$wpdb->prefix."postmeta AS thumb
ON thumb.meta_key = '_wp_attached_file'
AND thumb.post_id = post.thumbnail_id
LIMIT ".$counter.",".$perpage;
$posts = $wpdb->get_results( $sql, ARRAY_A);
Bonus : Vous obtiendrez également les détails de la catégorie avec les détails de l’affichage si vous en avez besoin.
P.S : Vous aurez besoin de changer la requête un peu pour répondre à vos exigences et obtenir les champs souhaités.
Les URL de publication et d’image sélectionnée sont enregistrées dans la table wp_posts et leur relation est enregistrée dans la table wp_postmeta. Dans tous les cas, vous devez interroger ces deux tables directement dans une seule requête ou à l’aide de la fonction WordPress et les interroger séparément.
Je ne pense pas que l'interrogation des deux tables en une seule requête améliorera les performances majeures, mais si vous souhaitez le faire, vous pouvez utiliser le code personnalisé ci-dessous.
global $wpdb;
$results = $wpdb->get_results( "SELECT * FROM $wpdb->posts, $wpdb->postmeta where $wpdb->posts.ID = $wpdb->postmeta.post_id and $wpdb->postmeta.meta_key = '_thumbnail_id' and $wpdb->posts.post_type='post' limit 100");
if ( $results )
{
foreach ( $results as $post )
{
setup_postdata( $post );
?>
<h2>
<a href="<?php the_permalink(); ?>" rel="bookmark" title="Permalink: <?php the_title(); ?>">
<?php the_title(); ?>
</a>
</h2>
<?php
if ( $post->meta_value ) {
$image = image_downsize( $post->meta_value );
?>
<img src="<?php echo $image[0]; ?>" />
<?php
}
}
}
else
{
?>
<h2>Not Found</h2>
<?php
}
Vous pouvez gérer la vitesse de chargement de la page en utilisant la méthode de défilement infini. Ne récupérez que les publications qui apparaissent au-dessus du pli. Vous pouvez également interroger d'autres publications sur le défilement, ce qui peut vous aider à charger votre page beaucoup plus rapidement. Voici un tutoriel pour cela.
https://code.tutsplus.com/tutorials/how-to-create-infinite-scroll-pagination--wp-24873
Il existe des plugins pour le défilement infini des publications.
C'est une solution beaucoup plus simple sans aucune utilisation de jointures complexes,
SELECT wp_posts.id,
wp_posts.post_title,
wp_terms.name,
(SELECT guid
FROM wp_posts
WHERE id = wp_postmeta.meta_value) AS image
FROM wp_posts,
wp_postmeta,
wp_term_relationships,
wp_terms
WHERE wp_posts.id = wp_term_relationships.object_id
AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id
AND wp_terms.name = 'mycat'
AND wp_posts.post_status = "publish"
AND wp_posts.post_type = "post"
AND wp_postmeta.post_id = wp_posts.id
AND wp_postmeta.meta_key = '_thumbnail_id'
ORDER BY wp_posts.post_date DESC
LIMIT 5;
Cette requête donnera l'identifiant du post, la catégorie du post et l'image sélectionnée. Vous pouvez filtrer la catégorie en changeant wp_terms.name = 'mycat' avec votre nom de catégorie.