コンテンツフィルタを追加しようとしたところ、フィルタが合計3回呼び出されていることがわかりました。私はゆっくりとすべてのプラグインを削除しようとしましたが、最終的にはYoastが原因であることがわかりました。これは絶対に狂気です。これは、単一のコンテンツフィルタが毎回3回呼び出されることを意味します。単独でパフォーマンスの問題は深刻です。これが起こっている原因は何でも。確かにこのプラグインは、コンテンツを2回呼び出していたらリリースされないでしょう。
例えば。 Yoast SEOがインストールされると、このフックはコンテンツ内に1つ(プラグインがインストールされていなくてもこれを行います)およびページの上部にさらに2回表示します。
add_action( 'the_content', 'outputsomething');
function outputsomething()
{
echo "test";
}
あなたの問題の核心は、the_content
はアクションではなくフィルターであり、そしてそれらをエコーするのではなく値を返すことになっているということです。
質問の「呼び出し回数」の部分に関しては、はい、どんなフックでも無制限の回数呼び出すことができます。最初の呼び出しで1つの結果を返し、他の呼び出しでは異なる結果を返す必要があるとわかった場合、それはあなたが何か間違ったことをしているか、非常にハッキーであることを示しています。
あなたの質問が正確に何であるかわからないが、そう - すべてのapply_filters( 'the_content', '...' );
に対して、すべてのフックされたフィルタが実行されるだろう。私はこれが何度起こるかはそれほど気にしないでしょうが、その代わりに毎回どのようなコンテンツがフィルタリングされているのでしょう - より多くのコンテンツはパフォーマンスのペナルティを大きくします。
私はこの問題を再現できないのですが。 WP 4.6.1とYoast 3.7.1を実行しています。テストインストールの関数ファイルに次のものを追加しました。
add_action( 'the_content', 'wpse224783_action');
function wpse224783_action()
{ echo "test123"; }
add_filter( 'the_content', 'wpse224783_filter');
function wpse224783_filter($content)
{ echo "test456" ; return $content . "test789" }
これは私のすべてのコンテンツがtest123test456test789
を出力することにつながります。だから私の結論は、この動作は新しいWP installとYoastの組み合わせによってのみ引き起こされるのではないということです。プロファイリングプラグインを使用しました。これは、the_content
の呼び出しごとに1回だけ実行される関数を示しています。おそらくあなたのテーマのどこかで、何かがthe_content
を複数回トリガーしています。