wp_reset_postdata()が必要じゃないですか

footer.phpの中でthe_title()を使ったら全然違う記事のタイトルが表示されました。

何でだろう?と原因を探っていったらsidebar.phpの「最近のコメント」が原因でした。

sidebar.phpの「最近のコメント」はウィジェットを使わず直接書いてます。

一般によくあるコード

<dl>
<?php
$comments = get_comments('type=comment&status=approve&number=5');
foreach($comments as $comment): $post = get_post($comment->comment_post_ID);
?>
<dt><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>:<?php comment_author_link(); ?>さん</dt>
<dd><?php echo mb_substr(get_comment_excerpt(), 0, 17); ?>...</dd>
<?php endforeach; ?>
<dl>

を使ったのですが、このコードの中の「$post = get_post($comment->comment_post_ID)」が問題でした。

このコードを取ると問題なくフッターに記事タイトルが表示されます。

この「$post = get_post($comment->comment_post_ID)」は、コメントが付いた記事のタイトルを表示するために必要なんです。
なので取り除くことができない。

何かいい方法はないか。。。

ありました。

解決策はここに。
http://wpdocs.osdn.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_reset_postdata

「wp_reset_postdata()」を使うと、$postが復元されます。
つまり $post がコメントで使われたのを、もとの状態に戻し、現在の投稿になるんです。

なので上の「最近のコメント」は

<dl>
<?php
$comments = get_comments('type=comment&status=approve&number=5');
foreach($comments as $comment): $post = get_post($comment->comment_post_ID);
?>
<dt><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>:<?php comment_author_link(); ?>さん</dt>
<dd><?php echo mb_substr(get_comment_excerpt(), 0, 17); ?>...</dd>
<?php endforeach;
wp_reset_postdata(); ?>
<dl>

とするとOK!
最後から2行目のところに「wp_reset_postdata()」を入れます。

これでフッターに記事タイトルが表示されました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です