如何确定传递给挂钩的参数的数量和类型

时间:2012-01-10 作者:I-M-JM

我无法理解add\\u操作/add\\u过滤器背后的逻辑

考虑以下示例:

function SearchFilter($query) {
  if ($query->is_search) {
     $query->set(\'post_type\', \'page\');
  }
  return $query;
}
add_filter(\'pre_get_posts\',\'SearchFilter\');
我的问题是

我如何知道函数“SearchFilter”是否接受任何参数?

这个论点是什么/它的类型是什么?

如何确定哪个操作/筛选器有参数?

是否每个操作/筛选器都应返回通过的参数?

2 个回复
SO网友:Bainternet

使用调用动作挂钩时

add_action(\'some_action_tag\',\'callback_function\',$priority,$number_of_arguments);
do_action() 使用相应的标记触发调用,例如:

do_action(\'some_action_tag\',$argument1,$argument2,$argument3....);
调用过滤器挂钩时使用:

add_filter(\'some_filter_tag\',\'callback_function\',$priority,$number_of_arguments);
apply_filters() 使用相应的标记触发调用,例如:

$value = apply_filters(\'some_filter_tag\',$argument1,$argument2,$argument3...);
现在,正如您所看到的,主要区别在于动作挂钩基本上允许您在给定点运行自己的函数,而过滤器挂钩允许您进行过滤(更改/更改/清除…)特定变量的值。

因此,action“hooked”callback\\u函数仅在指定参数时才接受参数,而filter“hooked”callback\\u函数至少接受一个参数,该参数是要改变自身的值,并且仅在指定参数时才接受更多参数。

至于你的问题

如何知道函数“SearchFilter”是否接受任何参数?

钩子函数(在本例中为SearchFilter)接受钩子触发的任何参数(或者apply_filters() 过滤器挂钩或do_action() 对于操作挂钩),要知道它们是什么,最好的方法是在代码中搜索挂钩标记(例如searchFilter)并查看它们是什么。然而,如上所述,因为我们将它挂接到过滤器挂钩,所以它将至少有一个参数。

那个论点是什么/它的类型是什么?如何确定哪个操作/筛选器有任何参数?

与上面一样,您可以在钩子触发器函数中看到,或者通过创建一个测试转储,这会是这样的?

function test_dump($a1=null,$a2=null,$a3=null,$a4=null,$a5=null){
    if ($a1 !== null){
        echo \'<pre>first argument: <br/>\';
        var_dump($a);
        echo \'</pre>\';
    }
    if ($a2 !== null){
        echo \'<pre>2nd argument: <br/>\';
        var_dump($a);
        echo \'</pre>\';
    }
    if ($a3 !== null){
        echo \'<pre>3rd argument: <br/>\';
        var_dump($a);
        echo \'</pre>\';
    }
    if ($a4 !== null){
        echo \'<pre>4th argument: <br/>\';
        var_dump($a);
        echo \'</pre>\';
    }
    if ($a5 !== null){
        echo \'<pre>5th argument: <br/>\';
        var_dump($a);
        echo \'</pre>\';
    }
}
每个操作/筛选器是否都应返回传递的参数?

动作挂钩不需要返回值,所以不需要,但过滤器挂钩几乎每次都应该返回一个值。

SO网友:mor7ifer

我所知道的获取args的最佳方法是查找代码中使用的钩子的do\\u操作调用。adambrown.info 在这方面有一个很好的章节。Here\'s 你需要的那个。

结束

相关推荐

调用Function_Exist()比调用Apply_Filters()快还是慢

调用函数\\u exists()时,应用\\u filters()的速度是快还是慢。。。还是差异太小,不应该考虑?我在Kaiser的基础上做了一些测试,结果表明,在同时存在函数和过滤器的情况下,function\\u exists()的速度大约是3倍。如果过滤器不存在,速度将提高约11倍。没想到会这样。function taco_party() { return true; } add_filter( \'taco-party\', \'taco_party\'