抜粋として表示したいカスタムメタフィールドがあります。私はこれを行うフィルタを使用します。
add_filter( 'get_the_excerpt', function($output){
$output=get_post_meta(get_the_ID(), 'my_meta_field', true);
return $output;
});
ループ内でget_the_excerpt()
またはthe_excerpt()
を使用するときはいつでもmy_meta_field
の内容を取得します。
しかしWP 4.5.0 get_the_excerpt()
はPost IDまたはWP_Postオブジェクトをパラメータとして受け入れます。私のフィルタを使用している間、私はこの機能を損なわないようにしたいです。
ループの外側でget_the_excerpt()
を使いたいと想像してください。 get_the_excerpt(1234)
(1234は投稿のID)を呼び出すと、フィルターのget_the_ID()
がその時点でglobal $post
で提供されているものすべてを取得するため、誤った抜粋が返されます。
これを解決するための最もエレガントで効率的な方法は何ですか?フィルタ内でget_the_excerptに渡したIDをどうにかして使用できますか?または、ミニループを作成してglobal $post
をget_post(1234)
に設定する必要がありますか?
Codexが言っているにもかかわらず、関数get_the_excerptへのpost引数の追加が追加されたWP 4.5以降、このフィルタは2つの引数を取ります。 2番目の引数は、その抜粋を操作しているpostオブジェクトです。
そのため、関数は明示的な通知なしにループ内で動作します。2番目の引数はオプションにします。
add_filter( 'get_the_excerpt', 'wpse_242462_excerpt_filter' );
function wpse_242462_excerpt_filter( $excerpt, $post = null ){
if ( $post ) {
$ID = $post->ID;
} else {
$ID = get_the_ID();
}
$excerpt = get_post_meta( $ID, 'wpse_242462_meta_field', true);
return $excerpt;
});
あなたがすでに使っているどんなメタキーでも代用する必要があることは言うまでもないことです。
ループに入っていなくても、WordPressから生成された投稿またはページ(または他の投稿タイプ)内にいる場合は、$ postが設定されます。ですから、上記の関数のget_the_ID()
を$post->ID
に置き換えただけでうまくいきます。このページで他のクエリを実行している場合は、実際の投稿IDを取得するためにwp_reset_query();
を実行する必要があります。
特定の投稿を渡したい場合は、次の行に沿ってadd_filter呼び出しから関数を分離する必要があります。
// function to pass the ID to
function my_meta_excerpt($postID){
$output=get_post_meta($postID, 'my_meta_field', true);
return $output;
}
// add filter call
add_filter( 'get_the_excerpt', my_meta_excerpt);