我正在努力根据他所属的类别显示SAME产品的默认变体值。 例如,我出售一张带有蓝色&选项卡的卡片。红色。 当用户来到类别ONE时,我希望默认值为蓝色。 如果他来自类别TWO,则该值将为红色。
我找到了一个钩子woocommerce_product_default_attributes
,但我不知道如何使用它。
注意:即使您的产品属于两个类别,woocommerce似乎也只能识别每个产品的一个类别。
示例 (编辑):
我有一个产品 P
产品 P
分为两类:Cat 1
& Cat 2
。
此外,产品 P
有两个变量: Blue
&的 Red
当用户来到 Cat 1
时,我希望默认值为 Blue
。
如果他来自 Cat 2
,则该值将为 Red
。
@LoicTheAztech的答案代码 (下方)有效,但是:
当我转到
Cat 1
或Cat 2
时,我可以看到,对于Woocommerce,该产品仅在Cat 1
,即使我们可以访问这两个类别。
所以在一切之前,我需要解决woocommerce问题。
答案 0 :(得分:2)
带有替换过滤器挂钩的新的不同updated answer HERE
在WooCommerce 3+中,过滤器钩子
woocommerce_product_default_attributes
位于get_variation_default_attributes()
已弃用的方法中,因此&# 39;并不是真正实现你想要的东西。
get_variation_default_attributes()
方法被get_default_attributes()
替换。
例如,您可以在 woocommerce_before_add_to_cart_form
操作挂钩中实现条件函数。
备注:强>
- 产品属性分类始终以' pa _' +属性slug
- 您需要在变体标签设置中为变量产品设置此属性的默认值。
代码:
add_action( 'woocommerce_before_add_to_cart_form', function(){
global $product;
// We EXIT if it's not a variable product
if( ! $product->is_type('variable') ) return;
## DEFINE HERE the desired product attribute taxonomy
$pa_attribute = 'pa_color';
$default_attribute_for_variation = $product->get_variation_default_attribute( $pa_attribute );
// We EXIT if Product Attribute Color is not set as variation usage
if( empty( $default_attribute_for_variation ) ) return;
// Get the array of default attributes
$default_attributes = $product->get_default_attributes();
// For product category 'ONE => Attribute "blue" slug value
if( has_term( 'clothing', 'product_cat', $product->get_id() ) )
$default_attributes[$pa_attribute] = 'blue';
// For product category 'TWO' => Attribute "blue" slug value
elseif( has_term( 'TWO', 'product_cat', $product->get_id() ) )
$default_attributes[$pa_attribute] = 'red';
else return; // If no product categories match we exit
// If a product category match we set the default attribute
$product->set_default_attributes( $default_attributes );
}, 80, 0 );
代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。
此代码经过测试并有效。
答案 1 :(得分:2)
自Woocommerce 3以来,您可以使用 woocommerce_product_get_default_attributes
过滤器钩子...所以您的2个产品类别的代码将是这样的:
add_filter( 'woocommerce_product_get_default_attributes', 'filtering_product_get_default_attributes', 10, 2 );
function filtering_product_get_default_attributes( $default_attributes, $product ){
// We EXIT if it's not a variable product
if( ! $product->is_type('variable') ) return $default_attributes;
## --- YOUR SETTINGS (below) --- ##
// The desired product attribute taxonomy (always start with "pa_")
$taxonomy = 'pa_color';
$category1 = 'one' // The 1st product category (can be an ID, a slug or a name)
$value1 = 'blue' // The corresponding desired attribute slug value for $category1
$category2 = 'two' // The 2nd product category (can be an ID, a slug or a name)
$value2 = 'red' // The corresponding desired attribute slug value for $category2
## --- The code --- ##
// Get the default attribute used for variations for the defined taxonomy
$default_attribute = $product->get_variation_default_attribute( $taxonomy );
// We EXIT if define Product Attribute is not set for variation usage
if( empty( $default_attribute ) ) return $default_attributes;
// For product category slug 'one' => attribute slug value "blue"
if( has_term( 'one', 'product_cat', $product->get_id() ) )
$default_attributes[$taxonomy] = 'blue';
// For product category slug 'two' => attribute slug value "red"
elseif( has_term( 'two', 'product_cat', $product->get_id() ) )
$default_attributes[$taxonomy] = 'red';
else return $default_attributes; // If no product categories match we exit
return $default_attributes; // Always return the values in a filter hook
}
代码放在活动子主题(或活动主题)的function.php文件中。尚未测试,但应该可以使用。
<强>说明:强>
自Woocommerce 3和新引入的CRUDS setter方法以来,当方法使用
get_prop()
WC_Data
方法时,可以使用基于对象类型和方法名称的动态钩子 for frontend:“view”context) ...
请参阅
中的this line$value = apply_filters( $this->get_hook_prefix() . $prop, $value, $this );
中的 和this line 所以过滤器钩子是动态制作的 (其中 有两个参数:return 'woocommerce_' . $this->object_type . '_get_';
$this->object_type
等于'product'
):'woocommerce_' . $this->object_type . '_get_' . 'default_attributes'
上查看
$attributes
(替换$value
的属性值) $product
(替换$this
的类实例对象) ......