2つの引数を持つフィルターを追加する方法?


9

次のフィルターで$ pathを変更したいと思います。1つの入力と2つの引数があります。

function documents_template( $template = '' ) {

       $path = DOCUMENTS_INCLUDES_DIR . '/document/' . $template;

  return apply_filters( 'document_template', $path, $template );
}

これはフィルターを追加するための私の関数です。エラーメッセージが表示されますが、それを正しく行うにはどうすればよいですか。

function my_template( $template = '' ){

      $path = MY_INCLUDES_DIR . '/document/'. $template;

     return $path;
}
add_filter( 'document_template','my_template', 10, 2 );

私は次のように戻り値を変更しようとしましたが、それも機能しません:

return apply_filters( 'my_template', $path, $template);

以下の回答では、私の新しいフィルターはまだ機能していません。おそらく、私のフィルターがクラスにあるためでしょうか?これが完全に新しいコードです:

Class My_Class{
  function __construct() {
     add_filter( 'document_template', array( $this, 'my_template',10, 2 ) );
  }
 function my_template( $path, $template ){

      $path = MY_INCLUDES_DIR . '/document/'. $template;

     return $path;
 }
}

回答:


10
function my_locate_template( $path, $template ){

      $path = MY_INCLUDES_DIR . '/document/'. $template;

     return $path;
}
add_filter( 'documents_template','my_locate_template', 10, 2 );

add_filterは4つの変数を取ります。最初と2番目は必須です。1.フィルターの名前、2。関数の名前。3番目は優先度です(関数がいつ実行されるか)。そして4番目はパラメータの量です。引数の量を定義する場合は、関数にそれらを配置する必要もあります。例えば、

add_filter( 'the_filter','your_function', 10, 1 );
function your_function($var1) {
   // Do something
}

フィルターがより多くの引数をサポートする場合(この場合は3)

   add_filter( 'the_filter','your_function', 10, 3 );
    function your_function($var1, $var2, $var3) {
       // Do somthing
    }

add_filter()に関する情報については、すべてのコーデックスをお読みください


function documents_template( $template = '' ) {

       $path = DOCUMENTS_INCLUDES_DIR . '/document/' . $template;

  return apply_filters( 'document_template', $path, $template );
}

function my_template( $path, $template ){

      $path = MY_INCLUDES_DIR . '/document/'. $template;

     return $path;
}
add_filter( 'document_template','my_template', 10, 2 );

このコードは私にとってはうまくいきます。やってみましたか?


クラスの変更:

add_filter( 'document_template', array( $this, 'my_template',10, 2 ) );

に:

add_filter( 'document_template', array( $this, 'my_template'), 10, 2  );

my_template関数にさらに入力を追加しても機能しません。
Jenny

エラーが発生しますか?
Rob Vermeer

はい、すべてのエラーは同じです:call_user_func_arrayはパラメーター1が有効なコールバックであることを期待しています。配列には2つのメンバーが必要です
Jenny

回答を編集しました。コードを削除すると、エラーはなくなります。
Rob Vermeer、

はい、コードをこれに置き換えますが、まだ機能しません。
ジェニー

2

これらは一致する必要がありますが、一致しない必要があります。

apply_filters( 'document_template', $path, $template );

そして

add_filter( 'documents_template','my_template', 10, 2 );

document_template != documents_template

そうでなければ、すべてが正しく見えます。

編集する

待って、すべてが正しく見えるわけではありません。コールバック関数の定義にパラメーターを追加したくないと思います。代わりに、$templateコールバック内で定義するか、変更せずに単に渡す必要があります。したがって、これを置き換えます:

function my_template( $template = '' ){

...これとともに:

function my_template(){

例えば:

function my_template(){

      $path = MY_INCLUDES_DIR . '/document/'. $template;

     return $path;
}
add_filter( 'documents_template','my_template', 10, 2 );

編集2

さて、私の側の小さな間違い。これをコールバックとして試してください:

function my_template( $path, $template ){

      $path = MY_INCLUDES_DIR . '/document/'. $template;

     return $path;
}
add_filter( 'documents_template','my_template', 10, 2 );

'document' = 'documents'の間違いをお詫びします。新しい関数を使用しても、まだ機能しません。エラーは、call_user_func_arrayがパラメーター1が有効なコールバックであることを期待していると言います。配列には正確に2つのメンバーが必要です
Jenny

私の間違い; あなたはないコールバック関数の定義にパラメータを追加する必要があります。更新された回答を参照してください。
チップベネット

新しいコードも機能していません。print_rを試しましたが、パスが正しいことがわかります。
Jenny
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.