我已经创建了CSR的用户角色和几个自定义结帐字段,以显示在WooCommerce的Checkout页面上,我希望隐藏其他任何用户的结帐字段,但具有CSR角色的用户。
我已经创建了字段和角色,但是我的字段已经关闭,因为它们仍然会显示给所有用户。我按照教程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'
);
答案 0 :(得分:0)
我已经扩展了我在教程中发布的有关如何customize the WooCommerce Checkout的代码。
首先,您需要注册新的结帐字段。这是我添加current_user_can()
来测试当前用户是否具有查看这些额外字段的适当功能的地方。您可以使用current_user_can( 'csr' )
甚至更好地向manage_csr
角色添加类似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' );
您会注意到我已经为您的&#34; Fan Stopped&#34;等复选框做了一些不同的事情。你不必这样做,但我很好奇并且拖延。 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以使其看起来更好,并且您需要一种方法来保存多检查数据。您可以查看我的教程,了解如何保存其余内容,也许您可以自己找出多项检查。