根据用户角色隐藏 WooCommerce 上的自定义结帐字段

Hide Custom Checkout Fields on WooCommerce Based on User Role

我已经创建了一个 CSR 用户角色和几个自定义结账字段以显示在 WooCommerce 的结账页面上,我想对除具有 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'
);

我已经扩展了我在教程中发布的关于如何 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' );

您会注意到我对您的 "Fan Stopped" 等复选框做了一些不同的事情。你不必这样做,但我很好奇和拖延。 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 以使其看起来更好,并且您需要一种方法来保存多重检查数据。您可以查看我关于如何保存其余部分的教程,也许可以自己弄清楚多重检查。