雨過天晴

get_posts時、the_content()だけ別の記事が出る

2016.05.31

WordPress備忘録

img from: フリー素材ぱくたそ

この記事は2016年5月31日に書かれたものです。古い内容や非推奨要素を含む可能性がありますのでご注意ください。

get_postsで最新の記事○件の日付・タイトルを表示させるコードをコピペして~、あ、本文の一部とか抜粋とかそういうのも表示させたいな!よし、the_content()を追加だ!…あれ?本文だけ別の記事が出てくる…?

ってことないですか。
私はあります。何度もあります。

タイトルや日付、カスタムフィールドの値は正しいものが出てくるのに、the_content()the_excerpt()で出力される本文の内容が別の記事になる。

これが今回の症状です。

いや、作成時の「コードをコピペして~」がダメなのは分かってるんですがね。

結論を言ってしまうと「最新○件のタイトル一覧表示」でよく書かれているget_postsを使った短めのコードでは本文を読みだすところまで行ってなくて、タイトルやカスタムフィールドなどの付属情報までしか読まれてないのです。

setup_postdata() してやんないと駄目なんです。


このブログの過去記事「同人小説サイト作成時のタグとコードのメモ 2014」ではタイトル・日付・あらすじ(カスタムフィールド)を下記のように定義リストで表示させています。

<dl>
<?php $posts = get_posts('numberposts=5&order=desc&cat=表示カテゴリID指定'); ?>
<?php foreach($posts as $post): ?>
<dt><?php the_time('Y.m.d.') ?>
<?php $cat = get_the_category(); $cat = $cat[0]; { echo $cat->cat_name; } ?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></dt>
<dd><?php echo post_custom('カスタムフィールド名'); ?></dd>
<?php endforeach; ?>
</dl>

ここに本文内容を表示させたい……とカスタムフィールドの代わりにthe_content()とかthe_excerpt()を入れても駄目なわけですね。
タイトル・日付・本文抜粋を出したければ、

<dl>
<?php $posts = get_posts('numberposts=5&order=desc&cat=表示カテゴリID指定'); ?>
<?php foreach($posts as $post): setup_postdata($post); //ここでsetup ?>
<dt><?php the_time('Y.m.d.') ?>
<?php $cat = get_the_category(); $cat = $cat[0]; { echo $cat->cat_name; } ?>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></dt>
<dd><?php the_excerpt(抜粋を表示させる文字数); ?></dd>
<?php endforeach; wp_reset_postdata(); //setupしたのをreset ?>
</dl>

とするべし。と。

以上、コピペに頼らず勉強しなきゃいけない……と毎回思うメモでした。