it-swarm-ja.com

カスタムテーマフック/フィルタ - 引数を渡す

これらのカスタムテーマフックを実装しようとして混乱しています。私の頭を包み込もうとしています。

私はこれを理解したと思いました。しかし今数時間コードを読んだ後。それは最悪でした。

以下で渡される引数をどのように変更しますか?

functions.php

function theme_content() {
   do_action('theme_content'); // Initialize my custom hook
}


function theme_content_alter($arg) {
   // Do processing
   if (!$arg) {
     echo '<h2>default</h2>';
   }
   if ($arg == 'foo')  {
     echo '<div class="content">bar</div>';
   }

   echo apply_filters('theme_content','theme_content_alter', $arg);
} add_action('theme_content', 'theme_content_alter');

index.php

theme_content($arg = 'foo');

私が達成しようとしていること

フックをオーバーライドし、関数内のコンテキスト処理またはrequireとは別のファイルを処理することができる。

例:フロントページではtheme_content()にサイドバーがないようにしたいが、サブページではサイドバーなどが含まれるようにします。これは次のように表現できます。

これはこれを行うための正しい方法ですか?私は自分のテーマでそれを書き込もうとしましたが、なぜそれが機能しないのか理解することができませんでした。私の引数はパラメータで渡されていません。

私がやったこと

このSEでいくつかのスレッドを確認し、それらが私のコンテキストにはあまり役に立たないことがわかりました。

4
chrisjlee

theme_contentフックをtheme_content()関数に渡す引数で実行したい場合は、次のように書く必要があります。

function theme_content($args) {

   do_action('theme_content', $args);
}
7
Rarst

Rarstによる非常に良い答えです。私はそれをやっています ハード フック初期化関数に$argsを指定せずに処理関数でglobal $postを呼び出して正しく機能させないでください。

また、Rarstの答えを拡張して、値をエコーアウトするのではなく、変数を$arg変数に割り当てる必要があることを言及しました。そうしないと、引数 "foo"もコンテンツに出力されます。フック名をapply_filtersに入れる必要もありません。

ここにあなたのコードが更新されています(これはテストされて動いています)

function theme_content( $arg ) {
   do_action('theme_content', $arg ); // Initialize my custom hook
}


function theme_content_alter( $arg ) {
    if( !$arg ) {
    $arg = '<h2>default</h2>';
    } elseif ( $arg == 'foo' ) {
    $arg = '<div class="content">bar</div>';
    }

    echo apply_filters( 'theme_content_alter', $arg );

}
add_action( 'theme_content', 'theme_content_alter' );
1
Chris_O