下の画像は、get_posts()を使用した投稿記事タイトルを一覧表示のものです。
ここでは、$postについてget_postsなどを使いながら説明します。
下のコードは、投稿記事のタイトルを5つ表示するコードになります。
<?php global $post; ?> <?php $mypost = get_posts( array( 'numberposts' => 5 ));?> <?php foreach( $mypost as $post ) : ?> <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p> <?php endforeach; ?> <?php wp_reset_postdata(); ?>
上のコードの流れとしては、下の文章のようになります。
1.最初のコードで、get_posts()で5つの記事の情報を取得して$mypostに代入。
2.foreachでループしながら$mypostから順次値を取り出して$postに格納。
3.最後にpタグの所で投稿データを表示しています。
$postは、$mypostの値を入れるだけの仮の変数ではなく、記事オブジェクトの値を格納するためのグローバル変数なので、$mypostから取り出した値を$postに格納して、現在の記事オブジェクトのデータを上書きします。
ループ内では、グローバル変数$postにある現在の値をもとに、the_permalink()やthe_title()で値を表示しています。ということで、the_title()などを使用するときは、そのときの$postに格納されている値が使われます。
global $postは、この例で無くても表示されますけれど宣言しておくのが無難です。
$post以外を使う方法
ここで、foreachにある$mypostから取り出した値を$postに渡しているのですが、取り出した値を入れる変数は、$postで以外でもいいのでないかと思う方といると思います。
試しに$postを$postAに変更した場合、同じ記事が5回表示されます。
$postにある値は、通常新しい記事のデータになっていますので、$postにある新しい記事データを5回表示するだけのコードになり$postAは使用されません。
取り出した値の格納先の変数に$postAを使用した場合は、$post = $postAのコードを追加するなりして$postにデータを渡してあげると、その後にthe_title()があると記事タイトルを表示します。
<?php foreach( $mypost as $postA ) : ?> <?php $post = $postA; ?>
foreachで直接$postに値を渡している、この記事の最初のコードは効率的ということになります。
また、$postAの値を表示したときは、下のコードのようになります。
記事オブジェクトが格納されている$postAの配列のキーを指定することで表示できます。
<?php global $post; ?> <?php $mypost = get_posts( array( 'numberposts' => 5 ));?> <?php foreach( $mypost as $postA ) : ?> <p><a href="<?php echo $postA->guid; ?>"><?php echo $postA->post_title; ?></a></p> <?php endforeach; ?> <?php wp_reset_postdata(); ?>
記事オブジェクトに格納されている値は、var_dumpを使うと表示できます。
<?php var_dump($post); ?>
setup_postdata()について
この記事の最初のコードには、setup_postdata($post)がありませんけれど記事タイトルを表示します。さらに記事の本文を表示するため、setup_postdataが無い状態でthe_content()をコードに追加しても記事本文は全く表示されません。
そこで、setup_postdate($post)を下のコードにあるように追加してみると記事本文が表示されます。
<?php global $post; ?> <?php $mypost = get_posts( array( 'numberposts' => 5 ));?> <?php foreach( $mypost as $post ) : setup_postdata($post); ?> <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p> <?php the_content(); ?> <?php endforeach; ?> <?php wp_reset_postdata(); ?>
setup_postdata($post)は、the_post()と同じようにグローバル変数($post)に格納されている記事オブジェクトを整形するので、ループ内でタグを使用するとき同じように使用でき、また表示する内容を変更するときにタグをそのまま使用できるので便利です。
因みに、setup_postdate($post)をthe_post()にしても表示はされます。
<?php global $post; ?> <?php $mypost = get_posts( array( 'numberposts' => 5 ));?> <?php foreach( $mypost as $post ) : the_post(); ?> <p><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></p> <?php the_content(); ?> <?php endforeach; ?> <?php wp_reset_postdata(); ?>
参考:WordPressCodex日本語版 テンプレートタグ/get_posts
コメント