2016-11-12 91 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我的头这么累..在堆栈:) 无论如何,感谢海尔格 –

相关问题