0
votes

I've created a user role of CSR and several custom checkout fields to appear on the Checkout page of WooCommerce, and I want to hide these checkout fields from any other user but those with the CSR role.

I've created the fields and the role, but something is off with my fields as they're still showing up for all users. I followed the tutorial here to hide the fields. Apologies if the formatting of the code is off. The editor didn't accept most of my formatting when I pulled it in from Atom.

ADD CUSTOM FIELDS

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>';
}

ADD CSR ROLE

$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
)
);

HIDE CSR VALUES FOR ALL BUT 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'
);
1
Doesn't look like you have added your fields to woocommerce_checkout_fields in the first place, so they cannot be removed that way. Then you are echoing them out directly on the woocommerce_after_order_notes hook.helgatheviking

1 Answers

0
votes

I've expanded on the code I posted in my tutorial on how to customize the WooCommerce Checkout.

First you need to register the new checkout fields. This is where I've added a current_user_can() to test if the current user has the appropriate capabilities to see these extra fields. You can probably use current_user_can( 'csr' ) or even better add something like a manage_csr capability to the csr role. I'm using the manage_options capability because it was easier for me to test.

// 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' );

You will note that I've done something different with your "Fan Stopped", etc checkboxes. You don't have to do this, but I was curious and procrastinating. WooCommerce doesn't support a multi-check set of checkboxes, but it does support defining your own custom field types. So with the following we create a new type of form field:

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 );

Next we display the new fields on the checkout page.... but only if they exist, because harkening back to the first code block, they won't be in the checkout fields array if the user doesn't have the right permissions.

// 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' );

Now you'll probably need to add some CSS to make this look better, and you need a way to save the multicheck data. You can review my tutorial on how to save the rest, and perhaps figure out the multicheck on your own.