WordPressの投稿情報を表示

メインループとサブループについて

第6回ゆるふわ勉強会で、メインループとサブループというお話をしてきました。うっかりスライド内容詰め過ぎて、LTじゃなくてセッション並みの時間をとってしまったのですが、自分の備忘録を兼ねてまとめした。

WordPressの投稿情報を取得する方法

WordPressの投稿で取得できる基本項目

基本的にCMSを構築する際には、「入力させたもの表示させる」という点を中心に考えます。
そして、あらかじめ用意されているフィールドがあります。

項目 表示用関数 フィールドタイプ
タイトル <?php the_title();?> テキストフィールド
本文 <?php the_content();?> テキストエリア
抜粋 <?php the_excerpt();?> テキストエリア
タグ <?php the_tags();?> テキストフィールド
カテゴリ <?php the_category();?> チェックボックス
サムネイル画像(アイキャッチ) <?php the_post_thumbnail();?> 参照フィールド
ファイル名(スラッグ/slug) <?php echo $post->post_name;?> テキストフィールド
公開日付 <?php the_date();?> テキストフィールド(混合)

最初から用意されているフィールドについては、これを表示するための関数が用意されているため、他の人がソースを見たときも、「これはタイトルフィールドなんだな」ってのがすぐ分かったりします。これらのデフォルトの基本項目をうまく使用してサイトを作ります。

※ちなみにファイル名だけ、関数が見当たらなかったのでグローバル変数の$post参照して表示しています。
※表示されるhtmlタグとかは関数によって全然違うので、詳しくはcodexとかリファレンスを見るのが一番です。
※これに+してカスタムフィールドを使いこなせば、入力のしやすい投稿画面の出来上がりです。

メインループ

WordPressでは上記をタグを出力するのに、ループ処理を行います。

<?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; ?>                                 // 記事があるかどうかの判定終了

基本的にこの条件判定とループ処理を書くことで、デフォルト値に基づく記事が表示されるわけです。
PHP・WordPressに限らず、if文、while文、変数とかは他のCMSでも使ったりするので覚えておいて損はないです。

表示条件を変える

さて、デフォルトの表示条件のみでは、困ることが多々あります。

  • トップページは特定のカテゴリ最新5件を表示したい
  • トップページに特定のカテゴリ最新5件と別のカテゴリの最新5件を表示したい
  • 昇順で表示したい

ということで、WordPressでは表示条件を変えるために、クエリーを上書きしたり、新規にクエリーを作ったりする関数やクラスが用意されています。
これによって、表示する内容を変更することができます。クエリーっていうのはざっくり言うと、「処理を行うための命令」です。

メインループの表示条件を変える

メインループの表示条件を変えるには、query_posts関数を下記のように使います。

<?php
  $args = array( ここに条件書く );                // ループの表示条件を書く
  query_posts( $args );                         // ループの条件をセットする
?>
<?php if ( have_posts() ) : ?>    

  <?php while ( have_posts() ) : the_post(); ?>

    <h2><?php the_title(); ?></h2>
    <?php the_content(); ?> 

  <?php endwhile; ?>

<?php else : ?>

  <p>記事がありませんでした</p>

<?php endif; ?>

<?php wp_reset_query(); ?>                    // ループの条件をリセットする

query_posts関数はメインループのクエリーを上書き処理して、表示条件を変更する関数です。
上書きとはいってますが、実際には一度グローバル変数の値をunsetした後、再度同じ名前でクエリーオブジェクトを作成しています。
これによって、もともとURLのパラメーターから得られていた情報(現在のページ番号やカテゴリなど)が消えてしまいます。

消えてしまった情報を参照しよう

消えてしまった情報を参照する場合は、query_posts関数の引数に、グローバル変数の$query_stringを与えてあげます。

global $query_string;
query_posts( $query_string . "&order=ASC" );

配列にするのであれば、下記のようにします。

global $query_string;
parse_str( $query_string, $args );
$args['order'] = 'ASC';
query_posts( $args);

必ずリセットすること

<?php wp_reset_query(); ?>

表示する条件のデフォルト値を弄ってしまったので、リセットしてあげるのを忘れないように。

複数のループを作成して表示条件を変える

複数の表示条件のループを作成する場合は、get_post関数を使います。
query_posts関数じゃ駄目なの?ってところですが、query_posts関数は1個のクエリーを上書き処理しているだけなので、同時に複数のループを表示する処理は不具合が起こります。

get_posts関数は、メインクエリーに使われる$wp_query変数とは、別に新規にクエリーを作成することができます。
これがいわゆるサブループとかいうやつです。

<?php
  $args = array( ここに条件書く );    // ループの条件を書く
  $my_posts = get_posts( $args );   // ループの条件をセットする
  global $post;                     // グローバル変数にアクセス
?>
<?php if ( have_posts() ) : ?>    

  <?php foreach ( $my_posts as $post ) : setup_postdata( $post ); ?>  // 配列数だけ実行、グローバル変数から投稿情報を読み込む

    <h2><?php the_title(); ?></h2>
    <?php the_content(); ?> 

  <?php endforeach; ?>

<?php else : ?>

  <p>記事がありませんでした</p>

<?php endif; ?>

<?php wp_reset_postdata(); ?>      // ループの条件をリセットする

query_posts関数との書き方の違いとしては下記があります。

  • $my_posts変数にget_post関数を代入
  • グローバル変数、$postを読み込む
  • foreach文を使って、$my_posts変数内の配列数だけ処理を実行させる
  • setup_postdata( $post );を使って、グローバル変数$postを呼び出して投稿情報をセットする
  • wp_reset_postdata();を使って、リセットする

なんかいっぱいあるんですが、とりあえず、gets_posts関数を使えば複数のループが作れるってことです。
※gets_posts関数を使った場合、投稿情報を取得する際の初期値が一部query_posts関数と異なります。

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(); ?>  // global変数の$postを上書

    <h2><?php the_title(); ?></h2>
    <?php the_content(); ?> 

  <?php endwhile; ?>

<?php else : ?>

  <p>記事がありませんでした</p>

<?php endif; ?>

<?php wp_reset_postdata(); ?> // ループの条件をリセットする

gets_posts関数も新たにクエリーを作成していますが、こちらも同じでクエリーを新規作成しています。

この3つの関数とクラスは結構奥が深いので、別でまたまとめてみようと思います。
あと、query_posts関数を使わずにデフォルト値を変える方法とかもさらっと言ったんですが、それもまた別途でちゃんと書こうかと。

第6回ゆるふわ勉強会を終えて

LTに押さえるなら、query_posts関数だけにしておけばよかったと思いました。

次回告知

12月15日(土)に第7回やります。
そこでプラグイン設定と管理画面周りのお話しになると思います。

ってことで、参加された方やスタッフの方、お疲れ様でした。

トラックバック

TRACKBACK&PING

TrackBack URL :

コメントを残す

メールアドレスが公開されることはありません。