为什么Add_Filter没有为每次运行包含回调的选项?

时间:2019-09-05 作者:coolpasta

问题在于add_filter, 在处理不断增长的集合时,例如:

add_filter( \'my_collection\', function( $collection ) {
    return $collection[] = \'mellow\';
});
比方说,我们又进行了一次同样的操作,但现在我们添加了1 到集合。那么,让我们来做你在WordPress中99%的时间都在做的事情,玩数组:

$collection = apply_filters( \'my_collection\', [] );
$string = \'\';
foreach( $collection as $collection_item ) {
    $string += $collection_item;
}
如果物品不是string 类型在我看来,当我们通过过滤器谈论集合时,应该有一种方法来检查添加到过滤器中的内容。

因此,对于没有此功能的客户,我是否遗漏了一些考虑因素?

过滤器是用来玩的one value and keep changing it in the execution chain 所以我理解如果链条出现问题(所有add_filter), 它坏了。

1 个回复
SO网友:Jacob Peattie

没有理由拥有此功能。如果这是您遇到的问题,那么您使用的过滤器不正确。

首先,$collection 随时可以检查。如果需要查看筛选后的集合包含的内容,只需检查$collection 传递给回调的变量。您不需要任何其他功能。

但你甚至不需要这样做。如果使用过滤器add_filter(), 然后,您有责任知道哪些类型的值将传递给过滤器回调,以及在另一端预期的值,这是使用apply_filters() 记录这些期望是什么。

例如,如果开发人员(或您自己)提供过滤器my_collection 如果要将自己的字符串添加到字符串列表中,则在任何情况下都不应添加字符串以外的任何内容,并且必须返回一个数组,因为此筛选器和返回值的所有其他用户都需要一个字符串数组。

过滤器是一个API,它们应该定义并记录输入和输出的期望。任何偏离此值的内容都应抛出错误。

在您的示例中:

$collection = apply_filters( \'my_collection\', [] );
$string = \'\';
foreach( $collection as $collection_item ) {
    $string += $collection_item;
}
如果$collection 不是字符串数组,则筛选器使用不正确,错误是预期行为。如果您在主题或插件中提供此过滤器供其他开发人员使用,那么记录所需内容很重要,这样开发人员就不会出现此错误。

让我们举一个真实的例子。这个post_class filter是一个核心WordPress过滤器,用于向帖子添加类。过滤值在文档中定义如下:

$classes
(字符串[])一个post类名数组。

这意味着您的回调函数应该期望$classes 是字符串数组,回调也必须返回字符串数组。其他任何东西都会破裂。没有理由检查添加了哪些值$classes 因为它甚至应该是一个字符串数组。

相关推荐

从unctions.php获取变量的值并进行调试

我试图检查函数中获得的变量。php用于调试目的。我通过执行shortcode来获取当前登录的用户,定义了一个变量$current\\u user。然后我使用if语句来验证是否有当前登录的用户,在这种情况下,应该应用函数前面定义的CSS样式。它当前不起作用,因此我正在尝试研究$current\\u用户变量,但我尝试过的所有变体都不起作用,包括error\\u log。功能。php(片段):add_shortcode(\'show_css_code_conditionally\', \'show_css_co