根据自定义字段隐藏用户角色中的特定 WooCommerce 产品变体

问题描述 投票:0回答:1

在 WordPress 中,我创建了“经销商”和“批发”用户角色。

如果用户角色具有基于自定义设置字段的特定产品变体的“经销商”角色,我想隐藏特定的 WooCommerce 产品变体。我已在产品变体中添加了一个复选框,以有选择地隐藏或显示变体。

部分基于这个答案线程我有以下代码:

// Here is where I add my custom user roles- Wholesaler and Dealer

function add_custom_roles() {
    add_role(
        'wholesaler',
        __( 'Wholesaler' ),
        get_role( 'customer' )->capabilities
    );

    add_role(
        'dealer',
        __( 'Dealer' ),
        get_role( 'customer' )->capabilities
    );
}
add_action( 'init', 'add_custom_roles' );

// Here i add custom fields to product variations
add_action( 'woocommerce_variation_options', 'add_custom_fields_to_variations', 10, 3 );
function add_custom_fields_to_variations( $loop, $variation_data, $variation ) {
    woocommerce_wp_checkbox(
        array(
            'id'            => '_hide_variation_dealer',
            'wrapper_class' => 'show_if_variation',
            'label'         => __('Hide for dealers', 'woocommerce' ),
            'description'   => '',
            'value'         => get_post_meta( $variation->ID, '_hide_variation_dealer', true ) ? 'yes' : 'no',
        )
    );
}

// Saving custom fields for product variations

add_action( 'woocommerce_save_product_variation', 'save_custom_fields_for_variations', 10, 2 );
function save_custom_fields_for_variations( $variation_id, $i ) {
    $hide_variation_dealer = isset( $_POST['_hide_variation_dealer'][$i] ) ? 'yes' : 'no';
    update_post_meta( $variation_id, '_hide_variation_dealer', $hide_variation_dealer );
}

// Here I filtering function to read custom field values - logged in and dealer.

add_filter( 'woocommerce_variation_is_visible', 'hide_specific_product_variation', 10, 4 );
function hide_specific_product_variation( $is_visible, $variation_id, $variable_product, $variation ) {
    // Check if user is logged in and has dealer role
    if( is_user_logged_in() ) {
        $user = wp_get_current_user();
        if ( in_array( 'dealer', (array) $user->roles ) ) {
            // For dealer user role, hide variations with the custom field set to 'yes'
            $hide_variation_dealer = get_post_meta( $variation->ID, '_hide_variation_dealer', true );
            if ( $hide_variation_dealer === 'yes' ) {
                return false;
            }
        }
    }
    return $is_visible;
}

但变化并没有被隐藏。我无法找到为什么它不起作用。如有任何帮助,我们将不胜感激。

php woocommerce custom-fields user-roles product-variations
1个回答
0
投票

使用以下代码替换,将根据自定义字段隐藏特定用户角色的特定变体(变体设置中的复选框)

// Conditional function: Check if the user is from specific user role
function is_user_role( $role ) {
    global $current_user;
    return in_array( $role, $current_user->roles );
}

// Add a custom setting field to product variation
add_action( 'woocommerce_variation_options', 'add_variation_setting_field', 10, 3 );
function add_variation_setting_field( $loop, $variation_data, $variation ) {
    $field_key = '_hide_variation_dealer';

    woocommerce_wp_checkbox( array(
        'id'            => $field_key,
        'label'         => __('Hide for dealers', 'woocommerce' ),
        'value'         => get_post_meta( $variation->ID, $field_key, true ) ? 'yes' : 'no',
    ) );
}

// Save product variation custom setting field value
add_action('woocommerce_admin_process_variation_object', 'save_variation_setting_field', 10, 2 );
function save_variation_setting_field($variation, $i) {
    $field_key = '_hide_variation_dealer';

    if ( isset($_POST[$field_key][$i]) ) {
        $variation->update_meta_data($field_key, esc_attr($_POST[$field_key][$i]));
    }
}

// Hide variation based on user role and custom field
add_filter( 'woocommerce_variation_is_visible', 'hide_conditionally_product_variation', 10, 4 );
function hide_conditionally_product_variation( $is_visible, $variation_id, $product_id, $variation ) {
    $field_key = '_hide_variation_dealer';

    if ( is_user_role('dealer') && $variation->get_meta($field_key) ) {
        return false;
    }
    return $is_visible;
}

代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。

© www.soinside.com 2019 - 2024. All rights reserved.