2017-03-02 90 views
0

我已經創建了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' 
); 
+0

看起來您並未將自己的字段添加到「woocommerce_checkout_fields」中,因此無法將其刪除。然後你直接在'woocommerce_after_order_notes'鉤子上回顯它們。 – helgatheviking

回答

0

我擴展了我在我的教程中發佈的關於如何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數據。您可以查看我的教程,瞭解如何保存其餘部分,也可以自行找出多重檢查。

+0

非常感謝您的幫助!不幸的是,我正在處理的主題是阻止它正常執行。它絕對適用於2016年的主題! –

+0

感謝您檢查二十十六。這真的應該是一個插件,而不是*你的主題的一部分。哪部分被阻止正確執行?您的主題結帳頁面是否有'woocommerce_checkout_after_customer_details'掛鉤? – helgatheviking

相關問題