web-dev-qa-db-fra.com

Requête SQL personnalisée pour obtenir la liste des publications avec l'URL de l'image sélectionnée

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.

1
Tarun modi

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.

2
JItendra Rana

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
    } 
2
Vinod Dalvi

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.

https://wordpress.org/plugins/wp-infinite-scrolling/

1
Waqas Ali Shah

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.

0
Krishna Modi