サポート » 使い方全般 » フィルターフックで投稿本文を置換する方法を教えてください。

  • 解決済 echizenya

    (@echizenya)


    フィルターフックで投稿本文を加工する方法を教えてください。

    いつもお世話になっております。下記の質問についてご存知の方が
    いらっしゃいましたら、ご教示お願いします。

    【質問の主旨】

    フィルターフックで投稿本文を置換する方法を教えてください。

    【質問の補足】

    1.
    現在、エンジニアのためのWordPress開発入門のP.126を学習しています。

    2.
    フィルターフックで投稿本文を置換する方法の例が掲載されていますので、下記のコードをfunctions.phpに記述しています(str_replaceの第一引数と第二引数は任意の文字列に変えています)。

    add_filter( 'the_content', function() {
    	return str_replace ('Welcome', 'ようこそ', $content);
    } );

    3.
    上記の方法でページをリロードすると、

    Notice: Undefined variable: content in /var/www/wordpress/wp-content/themes/twentyseventeen/functions.php

    という文字列が表示されます。現在、デフォルトのHello Worldの記事しか投稿されていないため、「Welcome」が「ようこそ」と置換されることが期待されますが、意図通りになりません。

    4.
    エラーの意味は、「$contentが定義されていない」だと思います。ですが試しに

    $contents = get_post(1);
    $content = $contents->post_content;
    add_filter( 'the_content', function() {
    	return str_replace ('Welcome', 'ようこそ', $content);
    } );

    として、自分で$contentを定義してみても、やはり同じく

    Notice: Undefined variable: content...

    が表示されます。変数は定義しているのに、「$contentが定義されていない」と言われるのは、何とも理解できません。
    またこの書き方で通ったとしても、p=1の記事の「Welcome」は「ようこそ」に置換されても、他のページでは置換されません。

    5.
    「フィルターフック 本文 置換」「フィルターフック 投稿 加工」という文字列でフォーラムを検索してみましたが、自分の意図する動作をさせるための手がかりは得られませんでした。

    以上、よろしくお願い申し上げます。

    • このトピックはechizenyaが5年、 10ヶ月前に変更しました。
4件の返信を表示中 - 1 - 4件目 (全4件中)
  • Colorful-life.

    (@colorfullifeinfo)

    こんにちは

    the_content フィルターにフックした関数に $content 引数が無いのが原因だと思います
    (関数内のスコープで $content が定義されていない)

    add_filter( 'the_content', function($content) {
    	return str_replace ('Welcome', 'ようこそ', $content);
    } );

    で如何でしょう。

    また、4. ですが、結局、関数内のスコープでは $content が定義されていませんので、
    グローバルスコープの変数を参照する為に、関数内で global $content とグローバル宣言を行う必要があると思います。

    add_filter( 'the_content', function() {
    	global $content;	// グローバル変数を参照
    	return str_replace ('Welcome', 'ようこそ', $content);
    } );
    • この返信は5年、 10ヶ月前にColorful-life.が編集しました。理由: 補足追加
    トピック投稿者 echizenya

    (@echizenya)

    @colorfullifeinfo さん。
    さっそくのアドバイスありがとうございます!

    1.

    関数内のスコープで $content が定義されていない

    おっしゃる通りに、

    add_filter( 'the_content', function($content) {
    	return str_replace ('Welcome', 'ようこそ', $content);
    } );

    として、関数内に$contentの引数を与えると、全ての投稿ページにおいて「Welcome」が「ようこそ」に変わりました。また英語版のcodexで、the_content フィルターを確認すると、関数内に引数を与える例文があることにも気がつきました。

    2.

    グローバルスコープの変数を参照する為に、関数内で global $content とグローバル宣言を行う必要があると思います。

    こちらもアドバイスありがとうございます。ですが教えていただいたコードを記述すると、なぜか投稿本文が表示されなくなってしまいます。その理由は分かりません。

    add_filter( 'the_content', function() {
    	global $content;	// グローバル変数を参照
    	return str_replace ('Welcome', 'ようこそ', $content);
    } );

    ただ、質問は「フィルターフックで投稿本文を置換する方法を教えてください。」なので、当初の疑問は解決できました。従って本質問は「解決済み」としておきます。

    ありがとうございました。今後ともどうぞよろしくお願い申し上げます。

    • この返信は5年、 10ヶ月前にechizenyaが編集しました。
    Colorful-life.

    (@colorfullifeinfo)

    解決済みなので、蛇足になってしまいますが…

    ですが教えていただいたコードを記述すると、なぜか投稿本文が表示されなくなってしまいます。その理由は分かりません。

    4. への回答として提示したコードですが、
    @echizenya 様のご提示されたコードへの補足なので、冒頭の2行を省略してしまっています、分かりにくくて申し訳ございません

    投稿本文が表示されなくなる理由としては、グローバルに$contentが無いので、カラの文字列が返るからですね(グローバルの$contentを参照するので、変数が未定義であるエラーは出ませんが)
    正しくは、下記の通りです

    $contents = get_post(1);
    $content = $contents->post_content;
    add_filter( 'the_content', function() {
    	global $content;	// グローバル変数を参照
    	return str_replace ('Welcome', 'ようこそ', $content);
    } );

    また、こちらのコードは、ご認識の通り、

    またこの書き方で通ったとしても、p=1の記事の「Welcome」は「ようこそ」に置換されても、他のページでは置換されません。

    となり、全ての投稿で、p=1の記事の本文が表示されてしまいますので、あくまでも参考として、です

    トピック投稿者 echizenya

    (@echizenya)

    @colorfullifeinfo さん。
    フォローコメントありがとうございます。

    冒頭の2行を省略してしまっています、分かりにくくて申し訳ございません

    いえ、とんでもないです。私も @colorfullifeinfo さんの意図が汲めず、恐れ入ります。

    投稿本文が表示されなくなる理由としては、グローバルに$contentが無いので、カラの文字列が返るからですね

    アドバイスありがとうございます。下記のページを見ることで、関数内でグローバル変数の宣言をすることが分かりました。

    http://wpperson.net/biginner/95/
    http://php.net/manual/ja/language.variables.scope.php

    今後ともどうぞよろしくお願いします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「フィルターフックで投稿本文を置換する方法を教えてください。」には新たに返信することはできません。