web-dev-qa-db-ja.com

Get_the_excerpt()をどのようにフィルタリングしても、そのすべての機能を損なわないようにするにはどうすればよいですか?

抜粋として表示したいカスタムメタフィールドがあります。私はこれを行うフィルタを使用します。

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 $postget_post(1234)に設定する必要がありますか?

2
Florian

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;
});

あなたがすでに使っているどんなメタキーでも代用する必要があることは言うまでもないことです。

1

ループに入っていなくても、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);
0
Jonny Perl