質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

解決済

WordPress:query_postsが重いのでget postsにしたほうが良いのでしょうか

igaiga
igaiga

総合スコア143

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

2回答

0グッド

0クリップ

3660閲覧

投稿2017/02/01 07:43

記事ページでquery_postsを複数使用してデータを取り込んでいるのですが、
ページを開くのに2秒くらいかかってしまいます。

phpの処理が終わらないとJavaScriptが動作しないのか、
スライドショーもその間動作しないようで2秒間画像が縦並びになります。

query_postsは重くなるから使わない方がいいと良くネット上で書かれていますが、
実際にget postsを使用すると値が直接取れないので、
さらにget_postで値を拾わないといけないのかと思います。

ご相談したいのは、get_postsとget_postで2回データベースにアクセスするのであれば、
対して変わらないのではないかと思うのですがどうなんでしょうか。
(query_postsも2回データベースを読んでいるそうなので)

###現状のソース

<div class="aside"> <?php // レコメンドもどき機能 if($placenum){ $taxquerysp[] = array( 'taxonomy'=>'タクソノミー名', 'terms'=> 'ターム名', 'include_children'=>false, 'field'=>'slug', 'operator'=>'AND' ); } query_posts( array( 'post_type' => "カスタム投稿タイプ名", 'tax_query' => $taxquerysp, 'posts_per_page' => 5, )); if(!empty($wp_query->found_posts)){ // 記事表示のループ if ( have_posts() ) : ?> <div class="aside_mansion aside_mansion_ms mb20"> <p class="check_mansion">近隣物件</p> <?php while ( have_posts() ) : the_post(); ?> <a href="<?php echo get_permalink(); ?>"> <dl> <dt><img src="<?php echo esc_html( $post->gaikan); ?>" alt="" width="153"></dt> <dd class="name"><?php the_title();?></dd><?php if(!empty($post->sale_price_min)|!empty($post->sale_price_max)){; ?> <dd class="price">価格:<span class="strong_orange"><?php echo number_format_i18n((int)$post->sale_price_min/10000)."</span>万円"; ?> - <span class="strong_orange"><?php echo number_format_i18n((int)$post->sale_price_max/10000)."</span>万円"; ?></dd> <?php }; ?><?php if(!empty($post->rent_price_min)|!empty($post->rent_price_max)){; ?> <dd class="price">賃料:<span class="strong_orange"><?php echo number_format_i18n((int)$post->rent_price_min/10000)."</span>万円"; ?> - <span class="strong_orange"><?php echo number_format_i18n((int)$post->rent_price_max/10000)."</span>万円"; ?></dd> <?php }; ?> <dd class="area"><?php echo $post->position ; ?></dd> </dl> </a><br> <?php endwhile; else: endif; wp_reset_query(); } ?> </div> </div><!--aside-->

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

2

query_posts の代わりに使うのであれば pre_get_posts のほうがDBアクセスを減らせる可能性が上がります。ページが呼ばれるたびにメインクエリのためのDBアクセスが発生するため、テンプレートで使わなくても必ず1回アクセスします。

【WordPressの新・旧ループからカスタムクエリ・アーカイブまで徹底解説 | OXY NOTES】
http://oxynotes.com/?p=8615

【[Wordpress]pre_get_postsを使いこなす!pre_get_posts使い方まとめ | EMiAC-Works】
https://emiac-works.com/coding/pre-get-posts-code-snipet/

投稿2017/02/02 06:55

kei344

総合スコア69020

Neko_doshi👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

igaiga

2017/02/02 07:01

ありがとうございます。メインループで使いたい場合は、pre_get_posts。サブループで使いたい場合は、get_postsと考えて良いのでしょうか?
kei344

2017/02/02 07:07

それでいいと思います。 get_posts のかわりに WP_Query を直接使うことも出来ます。 $my_wp_query = new WP_Query( $args ); while ( $my_wp_query->have_posts() ) : $my_wp_query->the_post(); //ループ endwhile; wp_reset_postdata();

1

ベストアンサー

↓にもありますがget_postsをお勧めします。
DBサーバへのリクエスト回数は極力控えるほうがいいと思います。
http://www.m-hand.co.jp/program/4119/

ただ、直接値が取れないという状況がどういう状況なのかは把握しかねますが。。。

phpの処理が終わらないとJavaScriptが動作しないのか、
スライドショーもその間動作しないようで2秒間画像が縦並びになります。

お察しのとおり、ajaxやwebSocketなどの非同期通信を除いてサーバーサイドのスクリプトが(またはWEBアプリケーション)の処理が最初に実行されます、ViewにPHPからのassetsを出力してからクライアントサイドの処理が走ります。
https://www.htmlhifive.com/conts/web/view/study-room/introduction-to-web-applications

投稿2017/02/01 08:00

Neko_doshi

総合スコア214

kei344👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

igaiga

2017/02/01 08:50

早速のご回答有り難うございます! >ただ、直接値が取れないという状況がどういう状況なのかは把握しかねますが。。。 カスタムフィールドの値が取れなかったので、get_postとか必要なのかと思ってました。 setup_postdata()とかかな?

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。