web-dev-qa-db-ja.com

注目の画像のURLを含む投稿のリストを取得するためのカスタムSQLクエリ

私は彼らが特色にした画像でシングルページ/シングルリクエストの下で私が何百もの投稿を回収する必要がある仕事に取り組んでいます。

ワードプレス方式で投稿を回収し、次にget_the_post_thumbnail関数を使用して注目の画像を個別に回収することで、ページを読み込むのに非常に時間がかかります。

誰かが1つの単一のクエリの下で遡及的な投稿や注目の画像のようなこれのためのより速い解決策を提供することができますか。それはプロセスをスピードアップするはずです。

1
Tarun modi

最近同様の問題に取り組みました。おすすめの画像を含む投稿を取得するためのSQLクエリです。

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); 

ボーナス :必要に応じて投稿の詳細とともにカテゴリの詳細も表示されます。

P.S :あなたはあなたの要求に合うようにそしてあなたが望むフィールドを得るためにクエリを少し変える必要があるでしょう。

2
JItendra Rana

投稿画像と注目画像のURLはwp_postsテーブルに保存され、その関係はwp_postmetaテーブルに保存されるため、いずれの場合も単一のクエリで直接クエリするか、WordPress関数を使用して個別にクエリする必要があります。

両方のテーブルを1つのクエリでクエリしてもパフォーマンスが向上するとは思われませんが、必要に応じて以下のカスタムコードを使用できます。

    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

無限スクロール方式を使用してページの読み込み速度を管理できます。折り目の上に表示されているスクロールと他の投稿を検索できるスクロールのみを取得すると、ページをすばやく読み込むことができます。これがチュートリアルです。

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

投稿用の無限スクロール用のプラグインがいくつかあります。

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

1
Waqas Ali Shah

これは、複雑な結合を一切使用せずにはるかに簡単な解決策です。

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;

このクエリは、投稿ID、投稿カテゴリ、および特集画像を提供します。あなたのカテゴリー名でwp_terms.name = 'mycat'を変更することによってカテゴリーをフィルターすることができます。

0
Krishna Modi