web-dev-qa-db-ja.com

add_action( 'the_content)が自分のページを上書きするのはなぜですか

私はワードプレスに慣れていないと私は私のウェブサイトの特定のページにいくつかのテキストを表示しようとしています。私の問題は、私のプラグインがそのページ上の私の現在のコンテンツを私のプラグイン上のものと置き換えることです。ページ上のコンテンツをプラグインで置き換えないようにするにはどうすればよいですか。

add_action( 'the_content', "displayNewsSlider");
function displayNewsSlider(){
  if (is_page('sample-page')){
  echo "plugin content 1";
  echo "plugin content 2";
  }
}
1
iani garthalski

アクションフックとフィルタの間には微妙な 違いがあります 。最も注目に値するのは、フィルタ関数は値を受け取り、その処理が終わったときにそれを返すことです。関数内では、値を変更したり他のものに使用したりすることができます。

あなたの場合the_contentはフィルタであり、起動時には投稿コンテンツを受け取り、最初の引数として最初のフックされた関数に送信します。フックされた機能は今この内容を変更するか、または例えば何かを追加することができます。しかし、この関数はコンテンツ文字列を最終的に返すことも期待されているので、フックthe_contentにフックされている次の関数に渡すことができます。これは、フックされた機能がすべて実行されるまで繰り返されます。その後、最終製品はフィルタを呼び出したコードに返されます(このフィルタは the_content() で呼び出されますが、他の場所で呼び出すこともできます)。そしてそのときだけ、結果の文字列がエコーされます。そのため、常に文字列を返すことが重要です。そうしないと、呼び出し元の関数は何を出力するのかわからないのです。

あなたの場合このフィルタの使い方はこのようになります。

add_filter( 'the_content', 'wpse247535_display_news_slider' );
function wpse247535_display_news_slider( $content ) {
    if ( is_page( 'sample-page' ) ) {
        $content .= "plugin content";
        $content .= "more plugin content";
    }
    return $content;
}

それであなたの質問のタイトルに答えるために:あなたのページのコンテンツは上書きされません、しかしあなたの関数はそれが引数として取得するコンテンツ文字列を扱わず、そのためそれを出力することができません途中で道に迷ってしまったのでもう内容。

3
JHoffmann