在 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;
}
但变化并没有被隐藏。我无法找到为什么它不起作用。如有任何帮助,我们将不胜感激。
使用以下代码替换,将根据自定义字段隐藏特定用户角色的特定变体(变体设置中的复选框):
// 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 文件中(或插件中)。已测试并有效。