我已经阅读了无数次关于add\\u filter和apply\\u filter的WordPress Codex,但直到今天阅读woocommerce的源代码,一些东西才以某种方式点击,可能我不了解apply\\u filter的工作方式,或者可能我不太了解它是如何创建新挂钩的,以及何时/何地为新挂钩定义了函数?
再次查看wordpress codex
CODEX:apply\\u filters(string$tag,mixed$value)调用添加到过滤器挂钩的函数。
附加到filter hook$标记的回调函数通过调用此函数来调用。这个函数可以用来创建一个新的过滤器挂钩,只需使用$tag参数指定的新挂钩的名称调用这个函数。
该函数允许添加其他参数并将其传递给挂钩。
//我们的过滤器回调函数
function example_callback( $string,
> $arg1, $arg2 ) {
> // (maybe) modify $string
> return $string; } add_filter( \'example_filter\', \'example_callback\', 10, 3 );
/*通过调用“example\\u callback”函数,使用上面的add\\u filter()函数将“example\\u callback”函数“hooked”到“example\\u filter”,应用过滤器。->\'示例\\u filter\'是filter hook$标记。->\'“filter me”是正在筛选的值。->$arg1和$arg2是传递给回调的附加参数。
$value = apply_filters( \'example_filter\', \'filter me\', $arg1, $arg2 );
您可以看到,它们显示了使用apply\\u过滤器的一种方法:与add\\u过滤器结合使用,其中定义了函数并将其链接到$标记。使用起来很直观。你定义它,你使用它。
那么另一个场景呢,动态创建一个新的过滤器挂钩。。。如果你们中的一些人还在说什么?让我们再重读一遍法典的这一部分。
这个函数可以用来创建一个新的过滤器挂钩,只需使用$tag参数指定的新挂钩的名称调用这个函数。
因此,在这种情况下不使用add\\u过滤器。这就引出了我的问题:“我们在这里想要实现什么?”?为什么我们要在这里创建一个过滤器挂钩?如何将函数与动态创建的过滤器挂钩相关联?
apply\\u filter codex没有给出我们希望如何或为什么这样做的示例,这是一个疏忽,但我在github的woocommerce源代码中不断找到这些过滤器挂钩的实例。
例如,在woocommerce中,我看到如下使用apply\\u过滤器:
function woocommerce_get_product_thumbnail( $size = \'woocommerce_thumbnail\', $deprecated1 = 0, $deprecated2 = 0 ) {
global $product;
$image_size = apply_filters( \'single_product_archive_thumbnail_size\', $size );
return $product ? $product->get_image( $image_size ) : \'\';
}
我已经搜索了标签\'
single\\u product\\u archive\\u thumbnail\\u大小
\'在github上的woocommerce存储库中。正如你在这里看到的,只有一次。那么我们如何使用它呢?
最合适的回答,由SO网友:Dave Romsey 整理而成
如何使用过滤器single\\u product\\u archive\\u thumbnail\\u size我已经搜索了标签single_product_archive_thumbnail_size
在github上的woocommerce存储库中。正如你在这里看到的,只有一次。那么我们如何使用它呢?
WooCommerce的作者添加了此过滤器,以便其他开发人员能够修改产品的存档缩略图大小。WooCommerce可能不使用此过滤器本身,但他们可以。
下面是您如何使用single_product_archive_thumbnail_size
滤器在这个假设场景中,我们希望覆盖single_product_archive_thumbnail_size
由WooCommerce使用图像大小定义kruddock_archive_thumbnail
在中定义kruddock
主题,如果该主题碰巧处于活动状态。
/**
* If the kruddock theme is active, use the kruddock_archive_thumbnail
* image size for WooCommerce\'s single_product_archive_thumbnail_size
*
* @param string $size name of thumbnail size
*/
add_filter( \'single_product_archive_thumbnail_size\', \'single_product_archive_thumbnail_size\' );
function wpse_single_product_archive_thumbnail_size( $size ) {
$theme = wp_get_theme();
if ( \'kruddock\' == $theme->name || \'kruddock\' == $theme->parent_theme ) {
$size = \'kruddock_archive_thumbnail\';
}
return $size;
}
动态挂钩的一个很好的例子是
options, e、 g.:
apply_filters( "option_{$option}", mixed $value, string $option )
假设您有一个名为Kruddock API的插件。在这个插件中,您有一个使用
WP settings API 保存名为
kruddock_api_url
.
使用插件的开发人员可以使用option_kruddock_api_url
用于修改返回值的筛选器get_option( \'kruddock_api_url\' )
无需实际修改kruddock_api_url
(与过滤器的性质一样;我们正在动态修改值)并且没有您作为Kruddock API插件的开发人员提供用于修改kruddock_api_url
.
WP设置API允许我们使用动态过滤器动态修改任何选项option_{$option}
. 下面是另一个开发人员如何使用本示例中的动态挂钩:
add_filter( \'option_kruddock_api_url\', \'wpse_option_kruddock_api_url\' );
function wpse_option_kruddock_api_url( $value ) {
// Use a different API URL than the default.
$value = \'https://subdomain.example.com\';
return $value;
}