基于用户角色的Woocommerce产品变体

时间:2015-04-02 07:03:33

标签: wordpress wordpress-plugin woocommerce product

我用可变产品设置了Woocommerce。

这些产品的属性都有变化,可能的值为1千克,2千克和5千克。

我还创建了一个“Aziende”用户组。我想要一些产品变化仅显示“Aziende”客户。我不希望其他客户看到这些变化。

例如:Aziende客户看到选项“1kg,2kg,5kg”,而其他客户角色只看到1kg选项。

在Woocommerce中这可能吗?

1 个答案:

答案 0 :(得分:1)

是。如果您覆盖文件woocommerce/templates/single-product/add-to-cart/variable.php,则会找到变体选择框的代码。

你可以做点什么:

首先,在处理角色时,我总是包含此代码段:

function user_has_role( $role, $user_id = null ) {

    if ( is_numeric( $user_id ) )
        $user = get_userdata( $user_id );
    else
        $user = wp_get_current_user();

    if ( empty( $user ) )
        return false;

    return in_array( $role, (array) $user->roles );
}

所以它可以用作:

if(user_has_role("Aziende")){
    //do stuff
}

现在有了这个功能,并知道要更改哪个模板,你应该可以在该文件中执行某些操作。它可能是这样的:

// Get terms if this is a taxonomy - ordered
if ( taxonomy_exists( $name ) ) {
    $terms = wc_get_product_terms( $post->ID, $name, array( 'fields' => 'all' ) );
    foreach ( $terms as $term ) {
        if ( ! in_array( $term->slug, $options ) ) {
            continue;
        }
        if($name == 'pa_weight' && $term->slug != '1kg' ) { // or whatever your attribute is called, and whatever the attribute term is called. 
            if(!user_has_role('aziende'){
                continue;
            }
        }
        echo '<option value="' . esc_attr( $term->slug ) . '" ' . selected( sanitize_title( $selected_value ), sanitize_title( $term->slug ), false ) . '>' . apply_filters( 'woocommerce_variation_option_name', $term->name ) . '</option>';
    }
} else {
    foreach ( $options as $option ) {
        if($name == 'pa_weight' && $option != '1kg' ) { // or whatever your attribute is called, and whatever the attribute term is called. 
            if(!user_has_role('aziende'){
                continue;
            }
        }

        echo '<option value="' . esc_attr( sanitize_title( $option ) ) . '" ' . selected( sanitize_title( $selected_value ), sanitize_title( $option ), false ) . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $option ) ) . '</option>';
    }
}

此代码测试,因此我不知道它是否有效。但它应该指向正确的指针。