应用过滤器--关于动态创建新钩子的说明。我们如何使用它?

时间:2018-12-14 作者:kruddock

我已经阅读了无数次关于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存储库中。正如你在这里看到的,只有一次。那么我们如何使用它呢?

1 个回复
最合适的回答,由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;
}

相关推荐

Multiple category filters

我正在为客户端开发一个事件插件,我需要几个“类别过滤器”。现在我有了一个post类型的参数,我注册了该post类型和分类法,并创建了另一个分类法。在我的category metabox中,我只有第一个分类显示为我可以选择的类别。如果我在我的菜单上创建另一个帖子类型,它会像一个不同的插件菜单一样显示,其中子菜单是我的帖子类型所在的位置,我只想有一个不同的“类别过滤器”,我可以将类别添加到其中,然后在同一个插件中显示为类别元框。所以现在我有一个“Place”的帖子类型和分类法,它显示在我的插件中,通常是一个类