add_filter で return を忘れると|空表示・NULL の原因と対処

結論

フィルターのコールバックは、必ず値を return します。return を忘れると、PHP の関数は NULL を返すため、その値が次の処理へ渡り、タイトルや本文が空になったり、後続のコアの関数が警告を出したりします。条件分岐の中だけに return を書いた場合も、条件に合わなかったときは NULL です。

対処は次の3点です。

  • どの経路でも最後に return $value; する
  • 条件に合わないときは、受け取った値をそのまま返す
  • エラーログと var_dump( apply_filters(...) ) で、戻り値を確認する

原因・仕組み

apply_filters() は、登録されたコールバックの戻り値を次のコールバックの入力に使います。公式の add_filter() リファレンスにも、コールバックは受け取った値を変更して返すもの、と明記されています。add_filter() 自体は、コールバックが何を返すかを検査しません(戻り値は常に true)。

そのため、return のないコールバックを登録しても、エラーにならず、「値が消える」という症状だけが出ます。アクションは戻り値を使わないので、アクションの感覚でフィルターを書くと起きやすいミスです。

手順(サンプルコード)

1. 悪い例(そのまま使わない)

// 悪い例1:return がない
add_filter( 'demo_title', function ( $title ) {
    $title = $title . ' [x]';
} );

// 悪い例2:条件に合わないときの return がない
add_filter( 'demo_title', function ( $title ) {
    if ( $title === 'Hello' ) {
        return $title . ' [x]';
    }
} );

2. 良い例

add_filter( 'demo_title', function ( $title ) {
    return $title === 'Hello' ? $title . ' [x]' : $title;
} );

3. 複数の経路がある場合

add_filter( 'the_content', function ( $content ) {
    if ( ! is_singular( 'post' ) ) {
        return $content;      // 早期リターンでも値を返す
    }
    return $content . '<p>footer</p>';
} );

早期リターンを使うと、最後の return を忘れにくくなります。

動作確認(検証環境と結果)

WordPress 7.1.2(ja)、PHP 8.2.12 の CLI 環境で実行しました。

  • 悪い例1:apply_filters( 'demo_title', 'Hello' ) は NULL。
  • 悪い例2:'Other' を渡すと NULL('Hello' のときだけ値が返る)。
  • 良い例:'Other' は string(5) "Other"、'Hello' は string(9) "Hello [x]"。
  • 配列を受け取って $v[] = 1; だけして return しないと、結果は NULL(配列が消える)。
  • the_content に return のないフィルターを足すと、後続のコアのフィルターが str_replace(): Passing null to parameter #3 ($subject) ... is deprecated を出力し、結果は空文字 "" になった(優先度 1 で登録した再検証では、do_blocks 側のブロックパーサーが preg_match() などで同様の deprecated を出した。警告を出す関数は登録した優先度で変わる)。

ログは testsadd-filter-return-forgotten-null.md に保存しています。

add_filter で return を忘れたときの注意点

  • WP_DEBUG を有効にした開発環境でないと、deprecated などの警告に気付かないことがあります。
  • 型宣言(: string)を戻り値に付けると、return 忘れが TypeError として早く見つかります。ただし、他のプラグインが別の型を渡す場合に備え、型の扱いは慎重に決めます。
  • 引数を2つ以上受け取る場合は、add_filter の第4引数も必要です(add_filter() の使い方|説明・引数・注意点参照)。

add_filter で return を忘れたときによくあるミス

  • 画面に echo して確認するだけで、return を書かない。
  • if の中にだけ return を書く。
  • foreach の中で return して、1件目で終了してしまう。
  • アクションとフィルターの書き方を混ぜる(add_action で書くと戻り値が使われない)。

add_filter で return を忘れたときのチェックリスト

  • すべての分岐の最後に return があるか
  • 条件外のとき、受け取った値を返しているか
  • 返す値の型が、フィルターの想定と合っているか
  • WP_DEBUG で警告を確認したか
  • apply_filters の結果を var_dump で確認したか

add_filter で return を忘れたときのFAQ(よくある質問)

Q. 画面が真っ白になる原因ですか?
A. 本文などが空になる原因にはなります。真っ白(致命的エラー)は、型宣言違反など別の原因を疑ってください。

Q. 戻り値が不要なら、アクションで書いてよいですか?
A. 値を変更しないのであれば、アクションの方が適切です。

Q. どのコールバックが NULL を返したか調べるには?
A. 優先度ごとに apply_filters の途中結果を記録するか、登録されているコールバックを $wp_filter['hook'] で確認します。

筆者の見解(add_filter で return を忘れると)

フィルターは「受け取って、返す」だけの関数と考えるのが、いちばん事故が少ないと思います。書き始めにまず return $value; を先に書いてから、中身を足していくと、書き忘れが減ります。型宣言も、自分のコードの中では積極的に使いたいと考えます。

PR エックスサーバー

WordPressを、速く・止まらずに運営したい方へ

サーバー選びを間違えると、表示が遅い・サイトが止まるリスクがあります

こんなお悩みはありませんか?

  • どのレンタルサーバーを選べばよいか分からない
  • 表示が遅い・サイトが落ちるのが心配
  • WordPressの設定やセキュリティに自信がない

サーバーは、あとから乗り換えると、データの移行やドメインの設定に手間がかかります。表示が遅い、突然止まるといったトラブルは、訪問者が離れる原因にもなります。最初に、稼働率の保証や実績を確認して選ぶのが安全です。

エックスサーバーなら、WordPressの運営に強いレンタルサーバーを、迷わず選べます。国内でWordPressを利用して運用されているサイトの集計(Dataprovider.com調べ、2025年6月)で、国内シェアNo.1と公式サイトに記載されています。

No.1WordPressサイトの国内シェア(Dataprovider.com調べ・2025年6月)
99.99%以上サーバー月間稼働率を保証
99%以上WordPressへの攻撃を未然に防ぐ(2024年9月15日〜11月15日の当社調べ)

選ばれるポイント

  • WordPressサイトの国内シェアNo.1。実績で選びたいときの安心材料(Dataprovider.com調べ、2025年6月)
  • サイトが止まりにくい。月間稼働率99.99%以上を保証し、下回ると月額費用の一部を返金
  • 攻撃に強い。WordPressを狙った攻撃の99%以上を未然に防ぐ機能(2024年9月15日〜11月15日の当社調べ)
  • ドメイン代を節約できる。独自ドメインが永久無料(対象ドメイン・契約期間などの条件あり)
  • テーマ選びも安心。人気テーマ「Cocoon」の開発・提供元が運営
  • 10日間の無料お試しで、契約前に操作や表示の速さを確かめられる

10日間の無料お試しで、契約前に試せます

公式サイトを見る

10日間無料でお試し

広告(アフィリエイト)を含みます。特長は2026年11月8日時点の公式サイトの記載で、数値・順位は各調査・調べの時点のものです。料金・条件は公式サイトでご確認ください。

add_filter で return を忘れたときの関連項目

出典(一次情報)

PR当サイトはアフィリエイト広告を利用しています。掲載内容は広告主から依頼・指示を受けたものではなく、筆者の調査・体験にもとづきます。
タイトルとURLをコピーしました