web-dev-qa-db-ja.com

このカスタムホームページに対するデータベースクエリの呼び出し回数を減らすにはどうすればよいですか。

私は以下の(単なるサンプル)カテゴリ階層を持つブログのデザインに取り組んでいます。

                                          PARENT
                                             |
                     |------------------------------------------------|
                   Food                                           Fashion
                     |                                                |
          |---------------------|                       |---------------------|
      European                Asian                  European               Asian
          |                     |                       |                     |
    |---------|           |-----------|             |--------|           |--------|
Italian    French      Chinese    Japanese       Italian  French     Chinese   Japanese

ホームページで、私のクライアントはレベル4の子供全員の最後の3つの投稿を表示したいと思います。

  • Parent> Food>ヨーロッパ>イタリアの最後の3投稿
  • Parent> Food>ヨーロッパ>フランス語の最後の3つの投稿
  • Parent> Food> Asian> Chineseなどの最後の3つの投稿.
  • 等.

私の最初の試みはこのようなものでした:

$allPosts = new WP_Query('cat=20, 21, 24, 22, 23, 25, 75, 84, 79, 85, 83, 96, 95, 97, 65, 68, 107, 48, 49&showposts=100&order=ASC');

デバッグプラグインによると、ページ上で18のクエリが呼び出されましたが、カテゴリに2000の投稿がある場合、この行で取得される100の投稿はすべて同じカテゴリから取得されるため.

したがって、私はこのように呼び出しを分割しました。

$italianFood = new WP_Query('cat=20&showposts=3&order=DESC');
$italianFashion = new WP_Query('cat=21&showposts=3&order=DESC');
$frenchFood = new WP_Query('cat=24&showposts=3&order=DESC');
$frenchFashion = new WP_Query('cat=22&showposts=3&order=DESC');

これは機能しますが、すべてのカテゴリを呼び出した後、データベースへのクエリ呼び出しの数は260まで増えました。

私はプラグインでページをキャッシュするつもりですが、私が欲しいものを達成するために本当に260回以上のDB呼び出しを起動する必要がありますか?

4
WPRookie82

あなた自身のクエリを書くこともできます。そのように、それはカテゴリごとに一つのクエリです:

global $wpdb;

$query = '
SELECT wpp1.*
FROM ' . $wpdb->posts . ' AS wpp1
LEFT JOIN ' . $wpdb->term_relationships . ' AS wptr1 ON wptr1.object_id = wpp1.ID
WHERE post_type = %s
AND post_status = %s
AND wptr1.term_taxonomy_id = %d
ORDER BY wpp1.post_date DESC
LIMIT %d
';

$query = $wpdb->prepare(
    $query,
    // Args: post type, post status, term taxonomy ID, number of posts
    'post', 'publish', 80, 3
);

$posts = $wpdb->get_results(
    $query,
    ARRAY_A
);
2
NightHawk