wake-up-neo.net

Benutzerdefinierte SQL-Abfrage zum Abrufen der Liste der Beiträge mit der angegebenen Bild-URL

Ich arbeite an einer Aufgabe, bei der ich 100s Posts unter Single-Page/Single-Request mit den entsprechenden Bildern abrufen muss.

Durch die Verwendung der WordPress-Methode zum Abrufen von Beiträgen und anschließendem individuellen Abrufen von ausgewählten Bildern mithilfe der get_the_post_thumbnail -Funktion wird so viel Zeit zum Laden der Seite benötigt.

Kann jemand eine schnellere Lösung für dieses Problem anbieten, wie das Abrufen von Beiträgen und des angezeigten Bilds unter einer einzigen Abfrage? Das sollte den Prozess beschleunigen.

1
Tarun modi

Hat kürzlich an einem ähnlichen Problem gearbeitet. Hier ist die SQL-Abfrage, um den Beitrag mit Featured Image zu erhalten.

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 : Sie erhalten bei Bedarf auch Kategoriedetails mit Post-Details.

P.S : Sie müssen die Abfrage ein wenig ändern, um sie Ihren Anforderungen anzupassen und die gewünschten Felder zu erhalten.

2
JItendra Rana

Die URL für Beiträge und empfohlene Bilder wird in der Tabelle "wp_posts" und ihre Beziehung in der Tabelle "wp_postmeta" gespeichert. In jedem Fall müssen Sie beide Tabellen entweder direkt in einer einzelnen Abfrage oder mit der WordPress-Funktion abfragen und separat abfragen.

Ich denke nicht, dass das Abfragen beider Tabellen in einer einzelnen Abfrage die Hauptleistung verbessern wird, aber wenn Sie dies tun möchten, können Sie den folgenden benutzerdefinierten Code verwenden.

    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

Sie können die Seitenladegeschwindigkeit mithilfe der Infinite-Scroll-Methode verwalten. Rufen Sie nur die Beiträge ab, die über dem Falz angezeigt werden, und beim Blättern können Sie andere Beiträge abfragen. Dies kann Ihnen dabei helfen, Ihre Seite viel schneller zu laden. Hier ist ein Tutorial dafür.

https://code.tutsplus.com/tutorials/how-to-create-infinite-scroll-pagination--wp-24873

Es gibt einige Plugins für Infinite Scroll für Posts.

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

1
Waqas Ali Shah

Dies ist eine viel einfachere Lösung ohne die Verwendung komplexer Verknüpfungen.

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;

Diese Abfrage gibt die Beitrags-ID, die Beitragskategorie und das vorgestellte Bild an. Sie können die Kategorie filtern, indem Sie wp_terms.name = 'mycat' durch Ihren Kategorienamen ersetzen.

0
Krishna Modi