WordPressで投稿記事情報の取得方法

20,403
-1

Published on

第6回ゆるふわ勉強会。メインループとサブループ。

WordPressで投稿記事情報の取得方法

  1. 1. WordPressで投稿情報の取得方法 第6回ゆるふわ勉強会
  2. 2. プロフィール • Yuu / Yuji Tsukaguchi • Web Designer Community • WordBench 東京 at GMO(STAFF) • Movable Type Developer Meet upTwitter : regret_raym Tokyo 2012(LT)blog : creator-life.net • WordCamp Tokyo 2012 (Session&Handson)
  3. 3. WordPressで投稿情報の取得
  4. 4. 投稿の基本項目とタグ 項目 表示用関数タグ フィールドタイプタイトル <?php the_title();?> テキストフィールド本文 <?php the_content();?> テキストエリア抜粋 <?php the_excerpt(); ?> テキストエリアタグ <?php the_tags(); ?> テキストフィールドカテゴリ <?php the_category?> チェックボックスサムネイル画像(アイキャッチ) <?php the_post_thumbnail(); ?> 参照フィールドファイル名(ス <?php echo $post- テキストフィールドラッグ/slug) >post_name; ?>公開日付 <?php the_date(); ?> テキストフィールド※抜粋、サムネイルなどは予め、テーマのfunctions.phpで機能を有効化する必要があります。※実際はif文や、変数に入れたり使いまわしたりするので、上記以外にもタグはいっぱいあります。
  5. 5. 表示させるために• タグだけを張っても、「え、それどこの記事の タイトルなの?」ってなります。• 記事が1000件あったとしたら、どれを表示する とか、どれだけ表示するとか条件を指定してあ げなければなりません。• WordPressでは表示するために、ループ処理を 書く必要があります。
  6. 6. 最新記事10件のタイトルと内容を表示する
  7. 7. 投稿情報を読み込む<?php the_post(); // 投稿情報を読み込む?>
  8. 8. 読み込んだ情報を表示させる<?php the_post(); // 投稿情報を読み込む the_title(); // タイトルを表示する the_content(); // 本文を表示する?>
  9. 9. 記事が投稿されているか調べる<?php have_posts(); // 投稿があるか調べる the_post(); // 投稿情報を読み込む the_title(); // タイトルを表示する the_content(); // 本文を表示する?>
  10. 10. if文を使おう<?php if ( have_posts() ) { // 記事があったらここの記述が表示 } else { // なかったらここの記述が表示される }?>
  11. 11. 調べた結果で表示を変える<?php if ( have_posts() ) { // 記事があったら the_post(); the_title(); the_content(); } else { // 記事がなかったら echo ’<p>記事がありませんでした</p>’; }?>
  12. 12. 調べた記事分を繰り返す<?php if ( have_posts() ) { while ( have_posts() ) { // 記事あるだけ繰り返す the_post(); the_title(); the_content(); } } else { echo ’<p>記事がありませんでした</p>’; }?>
  13. 13. ループ完成<?php if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title(); the_content(); } } else { echo ’<p>記事がありませんでした</p>’; }?>
  14. 14. PHPの記述を分ける<?php 分かりやすいように、 if ( have_posts() ) { ?> カッコの後ろなどに <?php while ( have_posts() ) { 「?>」を入れる the_post(); ?> <h2><?php the_title(); ?></h2> <?php the_content(); ?> <?php } ?><?php } else { ?> <p>記事がありませんでした</p><?php }?>
  15. 15. ちょっと整理する<?php if ( have_posts() ) { ?> <?php while ( have_posts() ) { the_post(); ?> <h2><?php the_title(); ?> <?php the_content(); ?> <?php } ?> 改行とか空白を消して整理<?php } else { ?> <p>記事がありませんでした</p><?php } ?>
  16. 16. WordPressの書き方に倣う<?php if ( have_posts() ) : ?> <?php while ( have_posts() ) : the_post(); ?> <h2><?php the_title(); ?> <?php the_content(); ?> <?php endwhile; ?> { → : に変更 } → end~~に変更<?php else : ?> <p>記事がありませんでした</p><?php endif; ?>
  17. 17. ループ完成<?php if ( have_posts() ) : ?> <?php while ( have_posts() ) : the_post(); ?> <h2><?php the_title(); ?> <?php the_content(); ?> <?php endwhile; ?><?php else : ?> <p>記事がありませんでした</p><?php endif; ?>
  18. 18. ここまでのまとめ• ここまでがWordPressのメインループと 呼ばれる記述部分• 次のページからは、メインループの表示 条件を変えたり、表示する条件を変えて ループを複数作りたい場合の変更方法
  19. 19. 表示条件を変更しようWordPressでは、$wp_query の値を変更することで、表示する条件を変えることができます。
  20. 20. 表示条件の変更方法• query_posts関数を使う• get_posts関数を使う• WP_Queryクラスを使う• クエリーの改変 – pre_get_postsとis_main_query(WP3.3以上)
  21. 21. query_posts関数
  22. 22. query_postsとは? query_posts は WordPressループ(メインループ)で表示される投稿 を変更するために使います。• 使用例 – 指定した期間の投稿すべてを表示する。 – 投稿の表示順序を変更する。• 指定できる条件 – 投稿者、カテゴリ、タグ、タクソノミー、投稿・固 定ページ、ページ送り、オフセット、並び順・並び 替え、先頭固定投稿、日時、カスタムフィールド – 条件の組み合わせと除外テンプレートタグ/query posts よりhttp://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts
  23. 23. query_posts<?php $args = array( ここに条件書く ); // ループ条件を書く query_posts( $args ); ?> // ループ条件セット<?php if ( have_posts() ) : ?> <?php while ( have_posts() ) : the_post(); ?> ~省略~ <?php endwhile; ?><?php else : ?> <p>記事がありませんでした</p><?php endif; ?><?php wp_reset_query(); ?> // ループ条件をリセット
  24. 24. query_postsの注意点• query_postsは、表示条件を上書き処理している。• ページ送りのナビゲーションやカテゴリ選択を無効化し てしまう。query_postsの引数に、$query_stringを与 えれば無効化された情報が参照できる。• wp_reset_query() を呼び出して変更した条件をきちん とリセットすること。• データベースへのアクセスが増える。
  25. 25. get_posts関数
  26. 26. get_postsとは?get_postsは、複数のループ(マルチループ・サブループ)を作成するために使います。• 使用例 – query_postsループ以外のループを作成する – 現在の記事の添付ファイルを表示する• 指定できる条件 – WP_Queryクラスを利用しているため、gets_posts のほうが指定できる条件が細かい• wp-includes/post.phpにソースコードがあるテンプレートタグ/get posts よりhttp://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_posts
  27. 27. get_posts<?php $args = array( ここに条件書く ); // ループ条件を書く // ループ条件セット $my_posts = get_posts( $args ); // グローバル変数を読み込む global $post; ?><?php if ( have_posts() ) : ?> <?php foreach ( $my_posts as $post ) : setup_postdata( $post ); ?> ~省略~ // foreach文を使って <?php endforeach; ?> 配列の数だけループ<?php else : ?> <p>記事がありませんでした</p><?php endif; ?><?php wp_reset_postdata(); ?> // ループ条件をリセットする
  28. 28. get_postsの注意点• get_postsはグローバル変数$wp_queryを上書 きをせずに、新たなクエリーを作成する• query_postsと初期値の値が異なる – suppress_filtersの初期値がtrue – ignore_sticky_postsの初期値がtrue – no_found_rowsの初期値がtrue
  29. 29. WP_Queryクラス
  30. 30. WP_Queryクラスとは?• WP_Query は wp-includes/query.php に定義されているクラスで、WordPress ブログへの複雑なリクエストを取り扱います。 wp-blog-header.php (バージョン 2.0 では WP クラス) が $wp_query オブジェクトに現在のリクエストを定義する 情報を与えることで、$wp_query はどのタイプのクエリを扱っているのか (カテゴ リーアーカイブ、年月別アーカイブ、フィード、検索など) を確定し、要求された投 稿を取り出します。$wp_query はリクエスト上の情報を多く保持していて、後から でも利用することができます。 関数リファレンス/WP Query より http://wpdocs.sourceforge.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83% 95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query#WP_Query.E 3.81.AB.E5.83.8D.E3.81.8D.E3.81.8B.E3.81.91.E3.82.8BWP_Queryクラスは、WP_Query オブジェクトを新たに生成するため、get_post関数同様に複数のループを作ることができます。
  31. 31. WP_Queryクラス<?php $args = array( ここに条件書く ); $my_query = new WP_Query( $args ); ?><?php if ( $my_query->have_posts() ) : ?> <?php while ( $my_query->have_posts() ) : $my_query- >the_post(); ?> <?php endwhile; ?><?php else : ?> <p>記事がありませんでした</p><?php endif; ?><?php wp_reset_postdata(); ?>
  32. 32. クエリーの改変pre_get_postsとis_main_query
  33. 33. デフォルトの表示条件の変更• メインループしか使わない場合かつ、その表示を変えた い場合は、query_postsを使わずに、pre_get_posts アクションを使う。• is_main_queryで条件判定することにより、アクション の影響をメインクエリーのみに指定することができる
  34. 34. functions.phpに追記例)カテゴリーアーカイブだったら表示する件数を5件にするfunction category_display_five_articles( $wp_query ) { if ( $wp_query->is_main_query() && $wp_query->is_category() ) { $wp_query->set( posts_per_page, 5 ); }}add_action( pre_get_posts, category_display_five_articles );3.3の新しい関数 is_main_query を使おう よりhttp://www.warna.info/archives/1964/
  35. 35. ここまでのまとめ• メインループの条件を変更するなら、query_postsを使う• メインループ以外にループがあるなら、get_postsを使う• メインループしかそもそも使わないのであれば、query_postsは使 わずに、pre_get_postsアクションでデフォルト値を変えてしまお う。• WP_Queryクラスを使えば、get_postsと同じように独自ループが 作れる。
  36. 36. query_postsとget_postsの違い メインループとサブループ
  37. 37. メインループという箱がありました。この箱の色は白色です。この箱の色を赤色に塗り替えたい。そう願ったある日のこと。
  38. 38. query_postsメインループを塗るための専用筆「query_posts」を貰いました。
  39. 39. 箱はめでたく赤色に染まりました。
  40. 40. 箱を違う色で量産したいと思いましたが、query_postsは使い切りなので、新しい箱と筆が必要になりました。
  41. 41. get_posts新しい箱「サブループ」を塗るための専用筆「get_posts」を貰いました。
  42. 42. get_postsという筆を使って色を塗りました。しかもこの筆は、何度でも使うことができます。
  43. 43. いろいろな箱が量産できました
  44. 44. おしまい

×