如何添加自定义woocommerce管理字段类型
问题描述:
我已经添加一个自定义字段类型到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
?>
谢谢提醒。
答
在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;
}
哇..这个工作1000%.. 但是,我不知道为什么我的代码不工作,我因为我不使用woocommerce管理设置类来使用option_value变量。像你的代码,在这一行: $ option_value =(array)WC_Admin_Settings :: get_option($ value ['id']); 顺便说一句,谢谢我的维京人,你救了我的一天 –
太棒了!我没有测试它,所以这是一个有教养的猜测。我不确定你所指的是你的哪个代码?有没有工作? – helgatheviking
我想我的代码不工作bcause我的头这么累..在堆栈:) 无论如何,感谢海尔格 –