web-dev-qa-db-ja.com

Get_the_excerpt()を使用して取得した抜粋から省略記号を削除します。

メインのループがないページに最新の投稿があるカルーセルを表示するために、カスタムのWP_queryを使用しています。 WP_queryループの中で、私はget_the_excerpt()を使ってそれらの投稿の自動生成された抜粋を取得します。投稿にはカスタムの抜粋セットがなく、<!--more-->タグもありません。ただし、生成された抜粋の末尾には、末尾の省略記号(...)(実際の省略記号ではなく3つのドット)が含まれています。

すべての関連記事とコーデックスによれば、私はexcerpt_moreフックにフィルタを追加することによって末尾のドットを修正または削除することができるはずです。このコードをfunctions.phpに追加しました。

add_filter('excerpt_more', 'change_excerpt_more', 1);
function change_excerpt_more($more){
  return '';
}

しかし、それは何もしません。私はこれのさまざまな変種(テスト文字列を返す、引数を受け付けない関数を持つ、add_filter呼び出しの優先順位を変更する)を試しましたが、生成された抜粋はまったく変わりません。

私は何か悪いことをしていますか?フィルタはカスタムWP_queryでは機​​能しませんか?どうすればこれを修正できますか?

ありがとうございます。

2
MoritzLost

add_filter()の3番目のフィールドは優先順位です。デフォルトのWPフックの優先順位は10です。1を完全に省略することも、4番目のフィールドとして渡すことで関数で受け入れる引数の数を宣言することもできます。 add_filter('excerpt_more', 'change_excerpt_more', 10, 1);

デフォルトはOR:add_filter('excerpt_more', 'change_excerpt_more');


re:コメント内の質問

それでも優先順位を渡さないとうまくいかないのはなぜだろうと思っています

あなたは優先権を渡していました

あなたが抱えていた問題は、あなたが - 優先順位(1)を渡すこと、そしてそれがそのフックを使っている他のものよりおそらく低いということでした。したがって、正常に実行されている可能性がありますが、実行後に上書きされるだけです。

add_filter および add_action メソッドには4つの部分があります。

  1. それぞれapply_filters('name'...およびdo_action('name'...によって定義されたフィルターまたはアクション。
  2. 適用されるコールバック関数、あなたのchange_excerpt_more()
  3. 優先順位。デフォルトは10です。
  4. コールバックが期待する引数の数(do_actionapply_filterによって利用可能になります)

それであなたの質問の例では、あなたは1を3番目のフィールドにあるので優先順位として渡しました。単一の引数($more)を定義するつもりであれば、優先順位または空のフィールドを明示的に渡す必要があります(wordpressはデフォルトの優先順位を使用します)。

あなたのコード:

この:

add_filter('excerpt_more', 'change_excerpt_more', 1);

と同じです:

add_filter('excerpt_more', 'change_excerpt_more', 1, 1);


単一の引数を定義する

そのようです:

add_filter('excerpt_more', 'change_excerpt_more', , 1);

それは以下と同じです。

add_filter('excerpt_more', 'change_excerpt_more', 10, 1);

excerpt moreには渡す引数が1つしかないため、これも次のようになります。add_filter('excerpt_more', 'change_excerpt_more');


優先順位について

優先度は、フックに適用されるフィルタ/アクションの配列内の数値キーになります。これらの数値インデックスによってソートされて、それらはその順序で実行されます。これはインデックスとして使われる単なる(int)なので、唯一の制限はPHP_INT_MAXです。 Wordpressはデフォルトで10になっているので、フックはそれらの前後に簡単に実行できます。フックを使用しているものが他にない場合、デフォルトの優先度は、コア使用後にフックに追加されてから実行されます。デフォルトで追加されたものの後にフックを実行していることを確認するために、より高い優先順位を渡すことができます。

しかし、やはり、あなたの問題はあなたの優先順位が高すぎる(1)ということでした。その値はadd_filterの3番目のスロットにあるからです。それで、それは実行されていました、そしてそれからデフォルトで夢中にされた何でも(テーマ、他のプラグイン、コアさえありえます)それの後に実行されていました。

フックされているものすべてを優先順位で知るために、print_r()$wp_filterに配列のキーとしてフックの名前を渡すことができます。

function filter_print() {
    global $wp_filter;
    print_r( $wp_filter['excerpt_more'] );
    die();
}
add_action( 'shutdown', 'filter_print' );

[ Howdy_McGeeからのコード on このWPSE回答]

2
hwl