在apply_filters()

apply_filters( $tag, $value, $var ... );


中,我无法将头缠绕在$value$var周围。我阅读了编解码器,听起来好像可以修改$value,但不能修改,但是我还没有找到任何示例。它似乎用作传递变量的方法。在这种情况下,和$var有什么区别?

#1 楼

尝试查看具有更好名称的函数:

apply_filters(
    $filter_name,     // used for add_filter( $filter_name, 'callback' );
    $value_to_change, // the only variable whose value you can change
    $context_1,       // context
    $context_2        // more context
);


因此,当该函数被称为:

// wp-login.php line 94
apply_filters( 'login_body_class', $classes, $action );


您可以使用…

add_filter( 'login_body_class', 'function_to_change_login_body_class', 10, 2 );


...并将两个变量传递给该函数。返回第一个,第二个提供更多上下文:

function function_to_change_login_body_class( $classes, $action )
{
    if ( 'login' === $action )
        $classes[] = 'foo';

    if ( 'postpass' === $action )
        $classes[] = 'bar';

    return $classes;
}


其他变量可以使您的决策变得更加容易,而不必更改这些决策。

评论


如果我理解正确。我没有添加变量以从apply_filters收集返回的值,因为它已自动应用于$ value_to_change?

–r00tAcc3ss
13年4月26日在15:21

@ r00tAcc3ss没有任何自动发生。您必须在回调中更改值。如果需要,您还可以根据情况将其返回原样。

– fuxia♦
13年4月26日在15:33

哦耶。我的意思是,我不必将返回的值接受到另一个变量中并将其分配给$ value。如果我在挂钩函数中更改$ value并“自动”返回,就可以完成。

–r00tAcc3ss
13年4月26日在16:17

#2 楼

什么是过滤器?


过滤器是WordPress在执行某些操作之前(在将数据添加到数据库中或将其发送之前)通过数据传递的功能。到浏览器屏幕)。过滤器位于数据库和浏览器之间(当WordPress生成页面时),以及位于浏览器和数据库之间(当WordPress向数据库添加新帖子和评论时); WordPress中的大多数输入和输出都会通过至少一个过滤器。 WordPress默认进行一些过滤,您的插件可以添加自己的过滤。


连接到过滤器

,以便用户更改某些特定数据( apply_filters函数提供了一个值,一个函数的输出等)。
这些过滤器钩包括过滤器的名称(或标签)以及至少用于过滤(例如,以某种方式更改数据。

要更改帖子的标题,可以使用the_title过滤器挂钩,其定义如下:

apply_filters( 'the_title', $title, $id );


这意味着过滤器具有标签/名称the_title,第一个参数$title是要更改的数据(即帖子标题),第二个参数$id是额外信息(在这种情况下)帖子ID)。例如,要以大写字母显示每个帖子的标题,可以使用以下行:

add_filter('the_title', 'strtoupper');


如果我们看一下add_filter函数,我们会发现e它的定义如下:

add_filter( $tag, $function_to_add, $priority, $accepted_args );


我们仅指定了第一个和第二个(必需的)参数,而第三个和第四个参数设置为其各自的默认值(即101)。

更复杂的过滤器

如果您只想过滤某个帖子,则可以使用其他信息(如果使用此过滤器,则为ID)。为此,必须指定参数数量(在这种情况下为2),并且再次执行此操作,必须指定优先级参数(在参数数量之前)。

假设我们只想影响ID为42的帖子的标题,则如下所示:

add_filter('the_title', 'my_strtoupper', 10, 2);
function my_strtoupper($title, $id) {
    if (42 === $id) return strtoupper($title);
    return $title;
} // function my_strtoupper


,我们必须指定所有四个可用参数。

我需要哪些参数?

要标识某个过滤器的(数量)可用参数,您必须查看


参考文献:


插件API:过滤器

apply_filters函数

add_filter函数


评论


+1可获得全面回应和完美无缺的课程(格式精美的brochacho)!

– Bosco
2013年4月26日15:41



谢谢,这很彻底,但是并不能真正解释我的要求。例如。过滤器中$ value变量和$ var变量之间的差异。

–r00tAcc3ss
13年4月26日在16:20

嗯,我会说,确实如此,但这当然是我的主观感受。我将在过滤器及其参数上添加一些信息。

–tfrommen
13年4月26日在16:24