WordPress如何在apply_filters回调中获取$vars变量值?
解决方法:在过滤器回调中访问额外参数
你遇到的问题核心是没有正确接收过滤器传递的额外参数。WordPress的add_filter默认只传递1个参数(也就是过滤器的初始值$text),但你的apply_filters调用里传了3个参数:$text、$product_item->ID和$vars->ID。要拿到后面这两个参数,需要做两步修改:
1. 修改add_filter,指定接收的参数数量
在注册过滤器时,需要添加第四个参数(接受的参数总数),这里设为3,因为apply_filters传了3个参数:
add_filter( 'prefix_xml_feeds_productname_variant', 'custom_product_name', 10, 3 );
10是过滤器的优先级(默认值,可根据需要调整)3表示回调函数要接收3个参数
2. 调整回调函数,接收并使用额外参数
把你的回调函数改成接受这3个参数,其中第三个参数就是你要的$vars->ID值。另外,建议通过产品ID获取产品对象,比用global $product更可靠(避免上下文变量不存在的问题):
function custom_product_name( $text, $product_id, $var_id ) { // 通过产品ID获取WooCommerce产品对象 $product = wc_get_product( $product_id ); // 如果产品不存在,返回原文本避免报错 if ( ! $product ) { return $text; } $product_name = $product->get_name(); $sku = $product->get_sku(); // 这里的$var_id就是你需要的$vars->ID $text = 'Example.com ' . $sku . ' ' . $product_name . ' ' . $var_id; return $text; }
额外说明:如果需要$vars对象而非ID
如果你的场景中必须使用完整的$vars对象(而不只是它的ID),那需要修改原始的apply_filters调用,把第三个参数从$vars->ID改成$vars:
$text = apply_filters( 'prefix_xml_feeds_productname_variant', $text, $product_item->ID, $vars );
然后回调函数的第三个参数就变成了$vars对象,你可以直接用$vars->ID:
function custom_product_name( $text, $product_id, $vars ) { $product = wc_get_product( $product_id ); if ( ! $product ) { return $text; } $product_name = $product->get_name(); $sku = $product->get_sku(); $text = 'Example.com ' . $sku . ' ' . $product_name . ' ' . $vars->ID; return $text; }
当然,这种情况需要你有权限修改那个apply_filters的代码。
内容的提问来源于stack exchange,提问作者Juraj
相关产品推荐
相关产品推荐

