web-dev-qa-db-ja.com

The_contentに追加されたフックが複数回呼び出されているようです

以下のコードをプラグインで実行しています。

 add_filter('the_content','thousand_pay');

//Callback function
function thousand_pay($content)
{
    echo $content;

    if( !in_category( 'Stories') )

    {
        return;
    }
    ?>
<hr></hr>
[Some HTML]
<?php

    return
}

何らかの理由で、個々の投稿のページにはHTMLが複数回印刷されます。

Bug where HTML is printed multiple times 

誰もがこれがなぜだろうかについて考えることができますか? is_singular()とis_main_query()をチェックするために条件に追加しなければならないかもしれないことを ここ /と読みます、それでそれはif(!in_category('Stories') || !is_singular() || !is_main_query()のように見えるでしょう、しかしそれはちょうどポストページにHTMLが印刷されるのを止めるようです。何か案は?

2
Ed King

コンテンツが複数回アクセスされるのは普通のことです。例えばSEOプラグインはこれにアクセスしてメタデータを生成するためにこれを行う必要があります。

また filter hookです。フィルタは、ページに何も反映しないようにする必要があります。渡された値を変更して返すためのものです。

その時点で、ループ内でのみ何かをしたいのであれば、in_the_loop()が必要条件です。

4
Rarst

私は同じ問題を抱えていました。私のthe_contentフィルターは複数回呼び出されていましたが、私のthe_contentフィルターは外部APIを呼び出していたため、これはページの読み込みを遅くしていました。だから私の場合、APIは同じデータに対して複数回問い合わせを受けていました。

私はin_the_loop()is_singular()そしてis_main_query()を使ってみました、しかし時々、テーマによっては、それらは私のフィルターへの呼び出しを一度に制限するのに失敗しました。

だから私は私のフィルタに定数を追加し、それが問題を解決したようです。

the_contentフィルタへの呼び出しを1回に制限する方法の例を示します。

add_filter( 'the_content', 'se225721_the_content' );

function se225721_the_content( $content ) {

    if ( ! in_the_loop() ) {
        return $content;
    }

    if ( ! is_singular() ) {
        return $content;
    }

    if ( ! is_main_query() ) {
        return $content;
    }

    $content = ucwords( $content );

    remove_filter( 'the_content', 'se225721_the_content' );

    return $content;
}

それが役立つことを願っています!

エリック

6
Eric