根据用户角色隐藏WooCommerce上的自定义结账字段
我已经创建了CSR的用户角色和几个自定义结账字段,以显示在WooCommerce的Checkout页面上,并且我想隐藏这些结帐字段,与CSR的角色。根据用户角色隐藏WooCommerce上的自定义结账字段
我已经创建了字段和角色,但是我的字段已关闭,因为它们仍显示给所有用户。我按照教程here隐藏字段。道歉,如果代码的格式是关闭的。当我从Atom中抽取时,编辑没有接受我的大部分格式。
添加自定义字段
add_action('woocommerce_after_order_notes', 'my_custom_checkout_field');
function my_custom_checkout_field($checkout) {
echo '<div class="my_custom_checkout_field"><h2>' . __('CSR Information')
.'</h2>';
woocommerce_form_field('date_of_purchase', array(
'type' => 'text',
'label' => __('Date of Purchase', 'woocommerce'),
'placeholder' => _x('MM/DD/YYYY', 'placeholder', 'woocommerce'),
'required' => false,
'class' => array('form-row-wide'),
'clear' => true,
), $checkout->get_value('date_of_purchase'));
woocommerce_form_field('place_of_purchase', array(
'type' => 'select',
'label' => __('Place of Purchase', 'woocommerce'),
'placeholder' => _x('Select Option', 'placeholder', 'woocommerce'),
'required' => false,
'class' => array('form-row-wide'),
'clear' => true,
'options' => array('option-1' => 'Option 1', 'option_2' => 'Option 2',
'option_3' => 'Option 3'),
), $checkout->get_value('place_of_purchase'));
woocommerce_form_field('color_item', array(
'type' => 'select',
'label' => __('Product Color', 'woocommerce'),
'placeholder' => _x('Select Option', 'placeholder', 'woocommerce'),
'required' => false,
'class' => array('form-row-wide'),
'clear' => true,
'options' => array('option-1' => 'Option 1', 'option_2' => 'Option 2',
'option_3' => 'Option 3'),
), $checkout->get_value('color_item'));
woocommerce_form_field('product_model', array(
'type' => 'select',
'label' => __('Model', 'woocommerce'),
'placeholder' => _x('Select Option', 'placeholder', 'woocommerce'),
'required' => false,
'class' => array('form-row-wide'),
'clear' => true,
'options' => array('option-1' => 'Option 1', 'option_2' => 'Option 2',
'option_3' => 'Option 3'),
), $checkout->get_value('product_model'));
echo '<strong>' . __('Check All That Apply:') .'</strong>';
woocommerce_form_field('lightbulb_out', array(
'type' => 'checkbox',
'class' => array('checkbox_field'),
'label' => __('Lightbulb is Out'),
'required' => false,
), $checkout->get_value('lightbulb_out'));
woocommerce_form_field('not_turn_on', array(
'type' => 'checkbox',
'class' => array('checkbox_field'),
'label' => __('Will Not Turn On'),
'required' => false,
), $checkout->get_value('not_turn_on'));
woocommerce_form_field('fan_not_running', array(
'type' => 'checkbox',
'class' => array('checkbox_field'),
'label' => __('Fan Stopped Running'),
'required' => false,
), $checkout->get_value('fan_not_running'));
woocommerce_form_field('strange_noise', array(
'type' => 'checkbox',
'class' => array('checkbox_field'),
'label' => __('Strange Noise'),
'required' => false,
), $checkout->get_value('strange_noise'));
woocommerce_form_field('not_catching', array(
'type' => 'checkbox',
'class' => array('checkbox_field'),
'label' => __('Not Catching Insects'),
'required' => false,
), $checkout->get_value('not_catching'));
woocommerce_form_field('csr_other', array(
'type' => 'checkbox',
'class' => array('checkbox_field'),
'label' => __('Other'),
'required' => false,
), $checkout->get_value('csr_other'));
woocommerce_form_field('case_description', array(
'type' => 'textarea',
'label' => __('Description of Case', 'woocommerce'),
'placeholder' => _x('Please provide details', 'placeholder', 'woocommerce'),
'required' => false,
'class' => array('form-row-wide'),
'clear' => true,
), $checkout->get_value('case_description'));
echo '</div>';
}
加入CSR作用
$result = add_role('csr', __('CSR'),
array(
'read' => true, // true allows this capability
'edit_posts' => false, // Denies user to edit their own posts
'edit_pages' => false, // Denies user to edit pages
'edit_others_posts' => false, // Denies user to edit others posts not just
their own
'create_posts' => false, // Denies user to create new posts
'manage_categories' => false, // Denies user to manage post categories
'publish_posts' => false, // Denies the user to publish, otherwise posts stays
in draft mode
'edit_themes' => false, // false denies this capability. User can’t edit your
theme
'install_plugins' => false, // User cant add new plugins
'update_plugin' => false, // User can’t update any plugins
'update_core' => false // user cant perform core updates
)
);
隐藏CSR价值观为所有,但CSR
function custom_override_checkout_fields($fields) {
if (! current_user_can('csr') && isset($fields['date_of_purchase'])) {
unset($fields[['date_of_purchase']]);
}
if (! current_user_can('csr') && isset($fields['place_of_purchase'])) {
unset($fields[['place_of_purchase']]);
}
if (! current_user_can('csr') && isset($fields['color_item'])) {
unset($fields[['color_item']]);
}
if (! current_user_can('csr') && isset($fields['product_model'])) {
unset($fields[['product_model']]);
}
if (! current_user_can('csr') && isset($fields['lightbulb_out'])) {
unset($fields[['lightbulb_out']]);
}
if (! current_user_can('csr') && isset($fields['not_turn_on'])) {
unset($fields[['not_turn_on']]);
}
if (! current_user_can('csr') && isset($fields['fan_not_running'])) {
unset($fields[['fan_not_running']]);
}
if (! current_user_can('csr') && isset($fields['strange_noise'])) {
unset($fields[['strange_noise']]);
}
if (! current_user_can('csr') && isset($fields['not_catching'])) {
unset($fields[['not_catching']]);
}
if (! current_user_can('csr') && isset($fields['csr_other'])) {
unset($fields[['csr_other']]);
}
if (! current_user_can('csr') && isset($fields['case_description'])) {
unset($fields[['case_description']]);
}
return $fields;
}
add_filter('woocommerce_checkout_fields' , 'custom_override_checkout_fields'
);
我扩展了我在我的教程中发布的关于如何customize the WooCommerce Checkout的代码。
首先,您需要注册新的结帐字段。这是我添加current_user_can()
来测试当前用户是否具有查看这些额外字段的适当功能的地方。您可能可以使用current_user_can('csr')
,或者甚至可以更好地向csr
角色添加类似manage_csr
的功能。我正在使用manage_options
功能,因为我测试起来更容易。
// Add new checkout fields
function kia_filter_checkout_fields($fields){
if(current_user_can('manage_options')) {
$fields['extra_fields'] = array(
'date_of_purchase' => array(
'type' => 'text',
'label' => __('Date of Purchase', 'your-plugin'),
'placeholder' => _x ('MM/DD/YYYY', 'placeholder', 'your-plugin'),
'required' => false,
'class' => array('form-row-wide'),
'clear' => true
),
'place_of_purchase' => array(
'type' => 'select',
'label' => __('Place of Purchase', 'your-plugin'),
'placeholder' => _x('Select Option', 'placeholder', 'your-plugin'),
'required' => false,
'class' => array('form-row-wide'),
'clear' => true,
'options' => array('option-1' => __('Option 1', 'your-plugin'), 'option_2' => __('Option 2', 'your-plugin'), 'option_3' => __('Option 3', 'your-plugin'))
),
'color_item' => array(
'type' => 'select',
'label' => __('Product Color', 'your-plugin'),
'placeholder' => _x('Select Option', 'placeholder', 'your-plugin'),
'required' => false,
'class' => array('form-row-wide'),
'clear' => true,
'options' => array('option-1' => __('Option 1', 'your-plugin'), 'option_2' => __('Option 2', 'your-plugin'), 'option_3' => __('Option 3', 'your-plugin'))
),
'product_model' => array(
'type' => 'select',
'label' => __('Model', 'your-plugin'),
'placeholder' => _x('Select Option', 'placeholder', 'your-plugin'),
'required' => false,
'class' => array('form-row-wide'),
'clear' => true,
'options' => array('option-1' => __('Option 1', 'your-plugin'), 'option_2' => __('Option 2', 'your-plugin'), 'option_3' => __('Option 3', 'your-plugin'))
),
'product_condition' => array(
'type' => 'multicheck',
'label' => __('Product Condition:', 'your-plugin'),
'description' => __('Check All That Apply:', 'your-plugin'),
'required' => false,
'clear' => true,
'options' => array('lightbulb_out' => __('Lightbulb is Out', 'your-plugin'),
'not_turn_on' => __('Will Not Turn On', 'your-plugin'),
'fan_not_running' => __('Fan Stopped Running', 'your-plugin'),
'strange_noise' => __('Strange Noise', 'your-plugin'),
'not_catching' => __('Not Catching Insectsn', 'your-plugin'),
'csr_other' => __('Other', 'your-plugin'),
),
),
'case_description' => array(
'type' => 'textarea',
'label' => __('Description of Case', 'your-plugin'),
'placeholder' => _x('Please provide details', 'placeholder', 'your-plugin'),
'required' => false,
'class' => array('form-row-wide'),
'clear' => true,
),
);
}
return $fields;
}
add_filter('woocommerce_checkout_fields', 'kia_filter_checkout_fields');
你会注意到我已经做了一些不同于你的“风扇停止”等复选框。你不必这样做,但我很好奇和拖延。 WooCommerce不支持多选复选框,但支持定义您自己的自定义字段类型的。因此,与下面我们创建了一个新的类型的表单域:
function kia_multicheck_form_field($field, $key, $args, $value){
$field_html = '<fieldset>';
if(isset($args['label'])){
$field_html .= '<legend>' . $args['label'] . '</legend>';
}
if (! empty($args['options'])) {
foreach ($args['options'] as $option_key => $option_text) {
$field_html .= '<input type="checkbox" class="input-multicheck ' . esc_attr(implode(' ', $args['input_class'])) . '" value="' . esc_attr($option_key) . '" name="' . esc_attr($key) . '[]" id="' . esc_attr($args['id']) . '_' . esc_attr($option_key) . '"' . checked($value, $option_key, false) . ' />';
$field_html .= '<label for="' . esc_attr($args['id']) . '_' . esc_attr($option_key) . '" class="multicheck ' . implode(' ', $args['label_class']) . '">' . $option_text . '</label>';
}
}
if ($args['description']) {
$field_html .= '<span class="description">' . esc_html($args['description']) . '</span>';
}
$field_html .= '</fieldset>';
$container_class = esc_attr(implode(' ', $args['class']));
$container_id = esc_attr($args['id']) . '_field';
$after = ! empty($args['clear']) ? '<div class="clear"></div>' : '';
$field_container = '<p class="form-row %1$s" id="%2$s" data-sort="' . esc_attr($sort) . '">%3$s</p>';
$field = sprintf($field_container, $container_class, $container_id, $field_html) . $after;
return $field;
}
add_filter('woocommerce_form_field_multicheck', 'kia_multicheck_form_field', 10, 4);
接下来我们显示结账页面上的新领域....但只有当他们的存在,因为倾听回到第一个代码块,他们如果用户没有正确的权限,将不会位于结帐字段数组中。
// display the extra field on the checkout form
function kia_extra_checkout_fields(){
$checkout = WC()->checkout();
if(isset($checkout->checkout_fields['extra_fields'])) { ?>
<div class="extra-fields">
<h3><?php _e('CSR Information'); ?></h3>
<?php
// because of this foreach, everything added to the array in the previous function will display automagically
foreach ($checkout->checkout_fields['extra_fields'] as $key => $field) :
woocommerce_form_field($key, $field, $checkout->get_value($key));
endforeach; ?>
</div>
<?php }
}
add_action('woocommerce_checkout_after_customer_details' ,'kia_extra_checkout_fields');
现在,你可能需要添加一些CSS使这个更好看,你需要一种方法来保存multicheck数据。您可以查看我的教程,了解如何保存其余部分,也可以自行找出多重检查。
非常感谢您的帮助!不幸的是,我正在处理的主题是阻止它正常执行。它绝对适用于2016年的主题! –
感谢您检查二十十六。这真的应该是一个插件,而不是*你的主题的一部分。哪部分被阻止正确执行?您的主题结帐页面是否有'woocommerce_checkout_after_customer_details'挂钩? – helgatheviking
看起来您并未将自己的字段添加到“woocommerce_checkout_fields”中,因此无法将其删除。然后你直接在'woocommerce_after_order_notes'钩子上回显它们。 – helgatheviking