关于提高此查询/代码的性能的建议

时间:2019-01-23 作者:wzy

我正在开发一个快捷码,它将创建特定类型的所有自定义帖子的网格。如果我只得到帖子标题,这一切都很好。然而,如果我添加帖子缩略图,我将从大约28个查询移动到大约1000个查询。

通过查询监视器查看查询时,我可以看到get_the_post_thumbnail( $post->ID, \'medium\' ) 重复328次。再加上它呼叫wp_attachment_is(), wp_get_attachment_url()wp_get_attachment_metadata()

这是代码的重要部分

$args   = array(
    \'post_type\'      => \'zxy_movie\',
    \'post_status\'    => \'publish\',
    \'orderby\'        => \'post_title\',
    \'order\'          => \'ASC\',
    \'posts_per_page\' => - 1,
);
$posts = get_posts( $args ); // 332

$output = \'\';

if ( $posts && count( $posts ) > 0 ) {
    foreach ( $posts as $post ) {
        $output .= \'<div class="zxy-item">\';
        $output .= \'<a href="\' . get_permalink( $post->ID ) . \'">\';
        $output .= \'<div class="zxy-image">\';
        $output .= get_the_post_thumbnail( $post->ID, \'medium\' );
        $output .= \'</div>\';
        $output .= \'<div class="zxy-title">\';
        $output .= $post->post_title;
        $output .= \'</div>\';
        $output .= \'</a>\';
        $output .= \'</div>\';

    }
}

return $output;
因此,这里的任何人都可以为我提供任何提示、技巧、想法和/或解决方案,以减少获取帖子缩略图所需的查询数量。

1 个回复
最合适的回答,由SO网友:wzy 整理而成

在回答我自己的问题时,我决定采用纯SQL查询路线,因为WP在获取帖子及其附加的帖子缩略图时运行了太多的查询,此外还为该缩略图获取和构建元数据。

以下是我最终得到的代码:

$query2 = "SELECT post.ID, post.post_title, thumbnail_url.meta_value as thumbnail_url 
           FROM $wpdb->posts as post 
           LEFT OUTER JOIN $wpdb->postmeta as thumbnail 
           ON post.ID = thumbnail.post_id AND thumbnail.meta_key = \'_thumbnail_id\' 
           LEFT OUTER JOIN $wpdb->postmeta as thumbnail_url 
           ON thumbnail.meta_value = thumbnail_url.post_id 
           AND thumbnail_url.meta_key = \'_wp_attached_file\' 
           WHERE 1 = 1 
           AND post.post_type = \'zxy_movie\' 
           AND post.post_status = \'publish\' 
           ORDER BY post.post_title ASC";

 $posts = $wpdb->get_results( $query2, OBJECT );
请注意:这仍然是一个昂贵的查询,我不建议在大型网站上使用。