WordPressのループについてまとめてみました。普段テーマ作成をする度に書くのも面倒くさい時があるので、テンプレートを用意しておくと楽かと思います。
WordPressのループとは
投稿の情報などを表示する際に必要なPHPコードで、Wordpressのテンプレートタグなどを利用します。
管理画面から入力した投稿などの情報をデータベースから引っ張って来るわけですが、接続や取得する条件などをWordpressのテンプレートタグによって行うことにより、簡易化したPHPコードで取得条件の指定や表示ができるようになります。
ループは何をしているかというと、次の記事があるまで記事を取得して処理を繰り返し行います。次の記事がなければループが終わります。このようにして取得→処理の繰り返しを行うのですが、記事ページや最新記事一覧などもループで行う場合がほとんどだと思います。
ループで何を取得するかはパーマリンクと関係があります。パーマリンクによって記事が読み込まれています。そのため、記事ページではその記事をループで処理し、カテゴリーページでは該当カテゴリーの記事を管理画面で設定した表示件数分だけ繰り返し処理します。これはメインループといい、表示されているページによって異なる記事を読み込みます。パーマリンクについてはこちら
ループの種類
ループにはいくつかの種類があります。時と場合によって使い分ける必要があります。
調べていると以下のサイトが参考になりました。
参考URL:http://wpxtreme.jp/understanding-wordpress-loops-and-queries
基本ループ
1 2 3 4 5 6 7 |
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> <!--ループ内の記述--> <?php endwhile; ?> <!--ループが終わった後の記述--> <?php else : ?> <!--記事がなかった場合の記述--> <?php endif; ?> |
have_posts()はWordpressの関数で、投稿がある場合はtrueを、なければfalseを返します。
if~else~endifはPHPの条件分岐で、この場合は「もし投稿があれば」elseまでを行います。elseは「その他の場合」なので、「記事がなかった場合」endifまでの記述を実行します。
while~endwhileは条件を満たしている場合まで、繰り返しendwhileまでの処理を行います。この場合、記事があり続けるまでendwhileまでの記述を実行します。
よって、繰り返しthe_post()が行われるわけですが、the_postは次の記事があるか調べ、あれば記事を読み込みます。
メインループを変えてループする(WP_Queryを利用)
メインループは表示されているページや管理画面の設定によって取得する記事や件数が異なりますが、一時的にメインループを変更し独自の設定で記事を取得することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php $PostSet = array( 'p' => 0, //---------------------------投稿ID 'cat' =>0, //--------------------------カテゴリーID 'posts_per_page' => 0, //--------------取得件数 'offset' => 0, //----------------------開始位置 'post_type' => 'post', //--------------投稿タイプ 'tax_query' => array( //---------------タクソノミーの指定 'relation' => 'AND', //------------タクソノミーの扱い(AND:すべてに一致、OR:いずれかに一致) array( 'taxonomy' => 'category', //---タクソノミー名 'terms' => array('news'), //---ターム名 'include_children' => true, //-子を含むか 'field' => 'term_id', //-------対象とするフィールド 'operator' => 'IN' //----------タームの扱い(IN:いずれかに合致、NOT IN:いずれにも合致しない、AND:全てに合致) ), ), 'meta_query' => array( //--------------メタ情報の指定 'relation' => 'AND', //------------メタの扱い array( 'key' => '',//-----------------メタキー 'value' => '', //--------------値(文字列か配列) 'compare' => '=', //-----------'='、'!='、'>'、'>='、'<'、'<='、'LIKE'、'NOT LIKE'、'IN'、'NOT IN'、'BETWEEN'、'NOT BETWEEN' 'type' => 'CHAR' //------------valueのデータ型'NUMERIC'、'BINARY'、'CHAR'、'DATE'、'DATETIME'、'DECIMAL'、'SIGNED'、'TIME'、'UNSIGNED' ), ) ); $the_query = new WP_Query($PostSet); $PageMax = $the_query->found_posts;//------記事の最大値 if($post) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?> <!--ループ内の記述--> <?php endwhile; ?> <!--ループが終わった後の記述--> <?php else : ?> <!--記事がなかった場合の記述--> <?php endif; wp_reset_postdata(); ?> |
$PostSetに条件を指定し、WP_Queryにセットしています。これによって指定した条件での記事の取得が可能ですが、指定したくないところは削除してもかまいません。最後のwp_reset_postdata();はメインクエリーを戻すために必要になります。
ループ内の記述
ループ内には取得した記事を表示する処理を行いますが、wordpressには様々なテンプレートタグが用意されています。
表示する
ループ内に以下の記述をすることで吐き出されます。
1 2 3 4 5 |
the_title(); //--------------------タイトル表示 the_permalink(); //----------------リンク表示 the_time('Y年m月d日'); //-----------時間表示 the_content(); //------------------本文表示 the_author(); //-------------------投稿者(ブログ上の表示名) |
取得する
何か処理を加えたいときに取得する方法です。取得については「WordPress ループ内で投稿情報を取得する」でまとめてあります。
1 2 3 4 5 6 7 |
get_the_ID(); //---------------------------IDを取得 get_the_title(); //------------------------タイトルを取得 $post->post_name; //-----------------------スラッグを取得(固定ページ) get_permalink(); //------------------------パーマリンクを取得 get_the_time('Y.m.d'); //------------------時間を取得 $post->post_content; //--------------------本文を取得 get_post_meta($post->ID,'メタキー',true); //--メタキーを取得 |
コメントを残す