难以理解apply_filters()


19

在apply_filters()中

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

我在将头缠绕在$value和上时遇到麻烦$var。我阅读了抄本,听起来好像$value可以修改了$var,但是我还没有在野外找到任何示例。它似乎用作传递变量的方法。在那种情况下,那和$var?有什么区别?

Answers:


35

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

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 2013年

@ r00tAcc3ss什么也不会自动发生。您必须在回调中更改值。如果需要,您还可以根据情况将其返回原样。
fuxia

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

11

什么是过滤器?

过滤器是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函数,我们看到它的定义如下:

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

在这种情况下,我们必须指定所有四个可用参数。

我有什么参数?

要确定某个过滤器的可用参数(数量),您必须查找其定义位置(在这种情况下:此处)。


参考文献


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

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

嗯,我会说,确实如此,但这当然是我的主观感觉。我将在过滤器及其参数上添加一些信息。
tfrommen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.