2016-11-12 153 views
0

我已經添加一個自定義字段類型到woocommerce管理字段,並且已經工作100%。如何添加自定義woocommerce管理字段類型

但此代碼位於woocommerce插件中(woocommerce/includes/admin/class-wc-admin-settings.php)。

我現在的問題是如何從woocoommerce插件中將我的自定義woocommerce管理字段類型排除或掛鉤或過濾到我的插件。因此,在更新woocommerce時,我的自定義字段類型仍然存在並可以正常工作。

這是階級-WC-管理-settings.php中已經定製

<?php 
... 
class WC_Admin_Settings { 
... 

public static function output_fields($options) { 
... 
switch ($value['type']) { 
    case 'productcategory' : 

    $option_value = (array) self::get_option($value['id']); 

    ?><tr valign="top"> 
     <th scope="row" class="titledesc"> 
      <label for="<?php echo esc_attr($value['id']); ?>"><?php echo esc_html($value['title']); ?></label> 
      <?php echo $tooltip_html; ?> 
     </th> 
     <td class="forminp forminp-<?php echo sanitize_title($value['type']) ?>"> 
      <fieldset> 

       <ul class="" style="margin:0; padding:0;"> 
       <?php 
        $args = array(
         'orderby' => 'name', 
         'hide_empty'=> 0, 
         'taxonomy' => 'product_cat' 
        ); 

        $all_categories = get_categories($args); 
        $index = 0; 
        $count = count($all_categories); 
        $numItemsPerRow = ceil($count/2); 
        $numItemsOffsetFix = $count % 2 == 1; 

        echo '<div class="columns" style="width:auto; display:inline-block; height:auto; float:left; padding:0; margin:0 25px 0 0;">'; 

        foreach ($all_categories as $key => $val) { 
         if ($index > 0 and $index % $numItemsPerRow == 0) { 
          echo '</div><div class="columns">'; 
          if ($numItemsOffsetFix) { 
           $numItemsPerRow--; 
           $numItemsOffsetFix = false; 
          } 
         } 
        //foreach ($value['options'] as $key => $val) { 
         ?> 
         <li style=""> 
          <label><input type="checkbox" 
           name="<?php echo esc_attr($value['id']); ?>[]" 
           id="<?php echo esc_attr($val->term_id)?>" 
           value="<?php echo esc_attr($val->term_id)?>" 
           <?php 
            if (in_array($val->term_id,$option_value)) { 
             echo ' checked="checked"'; 
            } 
           ?> 
           /> <?php echo $val->name; ?> 
          </label> 
         </li> 
         <?php 
         $index++; 
        } 
       ?> 
       </ul> 
      </fieldset> 
      <fieldset> 
       <?php echo $description; ?> 
      </fieldset> 
     </td> 
    </tr><?php 
break; 
... 
} //end switch 

... 
} //end output_fields function 

public static function save_fields($options) { 
... 
    switch ($option['type']) { 
    ... 
     case 'productcategory': 
     $value = array_filter(array_map('wc_clean', (array) $raw_value)); 
     break; 
    ... 
    } 
... 
} //end save_fields function 

... 
} //end class 
?> 

謝謝提醒。

回答

0

switch聲明中有do_action作爲default的情況。意思是,如果核心代碼中沒有任何內容匹配,它會看到是否有任何內容附加到動作鉤子上。同樣,您可以通過woocommerce_admin_settings_sanitize_option_$option_name filter

因此消毒,這是我最好的猜測:

// handle output of new settings type 
add_action('woocommerce_admin_field_productcategory', 'output_productcategory_fields'); 
function output_productcategory_fields($value) { 

    $option_value = (array) WC_Admin_Settings::get_option($value['id']); 

    ?><tr valign="top"> 
     <th scope="row" class="titledesc"> 
      <label for="<?php echo esc_attr($value['id']); ?>"><?php echo esc_html($value['title']); ?></label> 
      <?php echo $tooltip_html; ?> 
     </th> 
     <td class="forminp forminp-<?php echo sanitize_title($value['type']) ?>"> 
      <fieldset> 

       <ul class="" style="margin:0; padding:0;"> 
       <?php 
        $args = array(
         'orderby' => 'name', 
         'hide_empty'=> 0, 
         'taxonomy' => 'product_cat' 
        ); 

        $all_categories = get_categories($args); 
        $index = 0; 
        $count = count($all_categories); 
        $numItemsPerRow = ceil($count/2); 
        $numItemsOffsetFix = $count % 2 == 1; 

        echo '<div class="columns" style="width:auto; display:inline-block; height:auto; float:left; padding:0; margin:0 25px 0 0;">'; 

        foreach ($all_categories as $key => $val) { 
         if ($index > 0 and $index % $numItemsPerRow == 0) { 
          echo '</div><div class="columns">'; 
          if ($numItemsOffsetFix) { 
           $numItemsPerRow--; 
           $numItemsOffsetFix = false; 
          } 
         } 
        //foreach ($value['options'] as $key => $val) { 
         ?> 
         <li style=""> 
          <label><input type="checkbox" 
           name="<?php echo esc_attr($value['id']); ?>[]" 
           id="<?php echo esc_attr($val->term_id)?>" 
           value="<?php echo esc_attr($val->term_id)?>" 
           <?php 
            if (in_array($val->term_id,$option_value)) { 
             echo ' checked="checked"'; 
            } 
           ?> 
           /> <?php echo $val->name; ?> 
          </label> 
         </li> 
         <?php 
         $index++; 
        } 
       ?> 
       </ul> 
      </fieldset> 
      <fieldset> 
       <?php echo $description; ?> 
      </fieldset> 
     </td> 
    </tr><?php 

} 

// sanitize data for new settings type 
add_filter('woocommerce_admin_settings_sanitize_option_productcategory', 'sanitize_productcategory_option', 10, 3); 
function sanitize_productcategory_option($value, $option, $raw_value){ 
    $value = array_filter(array_map('wc_clean', (array) $raw_value)); 
    return $value; 
} 
+0

哇..這個工作1000%.. 但是,我不知道爲什麼我的代碼不工作,我因爲我不使用woocommerce管理設置類來使用option_value變量。像你的代碼,在這一行: $ option_value =(array)WC_Admin_Settings :: get_option($ value ['id']); 順便說一句,謝謝我的維京人,你救了我的一天 –

+0

太棒了!我沒有測試它,所以這是一個有教養的猜測。我不確定你所指的是你的哪個代碼?有沒有工作? – helgatheviking

+0

我想我的代碼不工作bcause我的頭這麼累..在堆棧:) 無論如何,感謝海爾格 –

相關問題