如何向WordPress过滤器传递附加参数?

6
add_filter('wp_list_pages_excludes', 'gr_wp_list_pages_excludes');

function gr_wp_list_pages_excludes($exclude_array) {    
    $id_array=$array('22');
    $exclude_array=array_merge($id_array, $exclude_array);
    return $exclude_array;
}

我是一个WordPress的新手。上面的代码可以正常工作。但是我需要传递额外的参数,例如$mu_cust_arg到函数gr_wp_list_pages_excludes中。我该如何通过apply_filters或其他方法使用它呢? 非常感谢您的帮助。

这个问题在这里有一个很好的答案:http://wordpress.stackexchange.com/a/45920/4994 - ptim
3个回答

8
您可以通过向过滤器/动作添加多个参数来实现,您只需要告诉WordPress期望有多少个参数即可。例如,以下示例不起作用:
add_filter('some_filter', function($argument_one, $argument_two) {
    // won't work
}); 

apply_filters('some_filter', 'foo', 'bar'); // won't work

它会因为提供了过多的参数而失败并抛出错误。

相反,您需要添加这个:

add_filter('some_filter', function($argument_one, $argument_two) {
    // works!
    $arugment_one; // foo
    $arugment_two; // bar
}, 10, 2);  // 2 == amount of arguments expected

apply_filters('some_filter', 'foo', 'bar'); 

5
因为WP不接受闭包作为回调函数(至少,对于add_filter()来说肯定不行),简单来说就是“你不能”。至少,没有一种整洁的方式能够实现。
这里有几个选项,具体取决于您要做什么。第一个选项是最好的,但您可能无法使用它:
编写一个包装函数来调用您的函数:
function gr_wp_list_pages_excludes_1 ($exclude_array) {
  $custom_arg = 'whatever';
  gr_wp_list_pages_excludes_1($exclude_array, $custom_arg)
}

如果您在特定情况下始终传递相同的自定义参数,这将仅起作用-您将为每个不同的情况编写一个这样的包装函数,并将包装函数的名称传递给add_filter()。 或者,如果您希望它真正动态,您需要...

使用全局变量: (参考:变量作用域, $GLOBALS)

function gr_wp_list_pages_excludes($exclude_array) {
    global $gr_wp_list_pages_excludes_custom_arg;
    $id_array=$array('22');
    $exclude_array=array_merge($id_array, $exclude_array);
    return $exclude_array;
}

使用这种方法意味着您可以通过将数据分配给全局范围中的$gr_wp_list_pages_excludes_custom_arg,将任何喜欢的数据传递到函数中。这通常被认为是不好的做法并且受到强烈反对,因为它会导致代码混乱和难以阅读,并且会在内存空间中留下额外的变量。请注意,我将变量名称设置得非常长并特定于该函数,以避免冲突 - 这是使用全局变量时的另一个问题。虽然这样做能够实现目标,但只有在绝对必要时才使用该方法。

谢谢,我只是想排除重复使用get_option来分配$custom_arg的情况。如果它可以分配动态值,第一种方法将是合适的。我接受这个答案作为一个很好的指导。 - joHN
2
这不应该被接受为答案。你确实可以传递多个参数。请看下面的我的回答。 - FooBar

3

非常简单!

add_filter('filter_name','my_func',10,3);     //three parameters lets say..
my_func($first,$second,$third){
  //............
}

那么。
echo apply_filters('filter_name',$a,$b,$c);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接