问题描述

In apply_filters()

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

我的头围绕着 $value$var 有困难。我读了 codex,听起来像 $value 可以修改,$var 没有,但我还没有发现这个在野外的例子。它似乎被用作传递变量的一种方式。在这种情况下,与 $var 有什么区别?

最佳解决方案

尝试看更好的名称的功能:

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;
}

额外的变数是让您的决策更容易,也不要改变。

次佳解决方案

什么是过滤器?

Filters are functions that WordPress passes data through, at certain points in execution, just before taking some action with the data (such as adding it to the database or sending it to the browser screen). Filters sit between the database and the browser (when WordPress is generating pages), and between the browser and the database (when WordPress is adding new posts and comments to the database); most input and output in WordPress passes through at least one filter. WordPress does some filtering by default, and your plugin can add its own filtering.

挂入过滤器

为了让用户更改一些特定的数据 (一个值,一个功能的输出等),通过 apply_filters 功能提供滤波器钩。这些过滤器钩子包括过滤器的名称 (或标签) 和至少用于过滤 (即以某种方式改变) 数据的功能名称。

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

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

这意味着,该过滤器具有标签/名称 the_title,第一个参数 $title 是要更改的数据 (即后标题),第二个参数 $id 是额外的信息 (在这种情况下为帖子 ID) 。

例如,要显示 UPPERCASE 中每个帖子的标题,可以使用以下行:

add_filter('the_title', 'strtoupper');

如果我们来看看 add_filter 函数,我们看到它定义如下:

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

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

更复杂的过滤器

如果您只想过滤某个帖子,您可以使用额外的信息 (在此过滤器的情况下:ID) 。为此,您必须指定参数数量 (在这种情况下为 2),为了再次执行此操作,必须指定优先级参数 (该参数位于参数数量之前) 。

假设我们只想影响标题为 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

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

我有什么参数?

要识别某个过滤器的可用参数的数量,您必须查找它在哪里定义 (在这种情况下是:here) 。


参考文献:

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。