WordPressには投稿の抜粋テキストを得るためのテンプレートタグ(関数)get_the_excerptがある。WordPress Codex日本語版の情報は更新されていないようだが、英語版Codexによれば、ループ内外を問わずget_the_excerptに任意のpostオブジェクト(WP_Postのインスタンス)か投稿IDパラメータを渡せば、その投稿の抜粋文が得られる(ことになっている)。

 

ただ、get_the_excerptにはバグがあって、現状、postオブジェクトを伴って呼び出すと意図しない結果になることがある。

There are a few things wrong:

1) The behaviour is inconsistent depending on usage.

If you call get_the_excerpt() within the loop and if the post has no excerpt, then the post content will be stripped and truncated.

If you call it with the $post parameter and the post has no excerpt then nothing is returned.

Well…sometimes…

2) If you are inside a loop – say you’re using get_the_excerpt($post) in a shortcode in a post – then you will actually get back the truncated content of the post from the loop that you are in.

かいつまむと、投稿にユーザーが設定した抜粋($post->post_excerpt)がない場合、何もリターンされないことがあったり、ループ内だと現在のループにある投稿(global $post)の抜粋文がリターンされたりする。完全にぶっ壊れている。

これは、投稿にユーザが設定した抜粋がなかった場合、本文から抜粋文を生成する過程で、生成元の本文としてget_the_content('')が利用されるかららしい。つまり、”現在”の投稿の”本文”が抜粋ソースとして使われる。ということは、抜粋分を取得するときに一時的にglobal $postに目的のpostオブジェクトを設定しておいて、取得し終わったら$postにオリジナルの$postを設定すればいいのかもしれない。試してないが。

get_the_excerptは結構よく使われそうなタグにもかかわらず、このようなバグが1年以上修正されてないというのは辛い。