メインのループがないページに最新の投稿があるカルーセルを表示するために、カスタムの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では機能しませんか?どうすればこれを修正できますか?
ありがとうございます。
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つの部分があります。
apply_filters('name'
...およびdo_action('name'...
によって定義されたフィルターまたはアクション。change_excerpt_more()
do_action
とapply_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' );