根据类别woocommerce更改同一产品的默认变化值

时间:2017-09-06 10:52:40

标签: php wordpress woocommerce attributes product

我正在努力根据他所属的类别显示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 1Cat 2时,我可以看到,对于Woocommerce,该产品仅在Cat 1,即使我们可以访问这两个类别。

所以在一切之前,我需要解决woocommerce问题。

2 个答案:

答案 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的类实例对象) ......

Woocommerce Github closed and solved issue

上查看