我想在送货方式下的Shipping Zone页面中添加一个自定义字段,它将是一个文本输入,用户将能够添加自定义消息,我将在前端显示该消息。
我注意到它将数据保存在 System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
表中,该表中没有任何额外的列来保存数据;所以我想我必须使用我的自定义逻辑,但我不知道hook的名称。
所以我的问题是,是否有任何钩子会帮助/允许我
答案 0 :(得分:1)
这就是我在统一收费和免费送货的情况下在custom descriptio
中实现shipping methods
n字段的方式
我的function.php
文件:
add_filter( 'woocommerce_shipping_instance_form_fields_flat_rate', array( $this, 'add_extra_fields_in_flat_rate' ), 10, 1);
public function add_extra_fields_in_flat_rate($settings)
{
$counter = 0;
$arr = array();
foreach ($settings as $key => $value) <br>
{
if($key=='cost' && $counter==0)
{
$arr[$key] = $value;
$arr['shipping_extra_field'] = array(
'title' => __( 'Shipping Extra Field', 'woocommerce' ),
'type' => 'text',
'placeholder' => 'shipping',
'description' => ''
);
$counter++;
}
else
{
$arr[$key] = $value;
}
}
return $arr;
}
答案 1 :(得分:1)
add_action('woocommerce_init', 'shipping_instance_form_fields_filters');
function shipping_instance_form_fields_filters()
{
$shipping_methods = WC()->shipping->get_shipping_methods();
foreach($shipping_methods as $shipping_method) {
add_filter('woocommerce_shipping_instance_form_fields_' . $shipping_method->id, 'shipping_instance_form_add_extra_fields');
}
}
function shipping_instance_form_add_extra_fields($settings)
{
$settings['shipping_extra_field'] = [
'title' => 'Shipping extra field',
'type' => 'text',
'placeholder' => 'shipping',
'description' => ''
];
return $settings;
}
感谢@Wprog_dy的想法,但是您的代码仅将字段添加到“ flat_rate”传送方法中,因此您的功能确实很复杂。
我的示例将为所有送货方式添加自定义字段
答案 2 :(得分:0)
迟到但您可以使用:
add_action('woocommerce_product_options_general_product_data', 'my_custom_fields');
function my_custom_fields() {
$field = array(
//This ID will be use on the _postmeta table as key_name
'id' => 'my_custom_message',
//Text that goes inside the label tag
'label' => 'Message:',
//This text will appear on the description column
'description' => 'This is a custom message not part of WooCommerce',
//Boolean that determines the display of the description
'desc_tip' => true,
//Standard html input placeholder
'placeholder' => 'Type a message',
);
woocommerce_wp_text_input($field);
}
add_action('woocommerce_process_product_meta', 'save_my_custom_fields');
function save_my_custom_fields($post_id) {
update_post_meta(
$post_id,
'my_custom_message',
esc_attr($POST['my_custom_message'])
);
}
我认为$ field数组必须至少包含:
$field = array(
'id' => 'my_custom_message',//This ID will be use on the _postmeta table as key_name
'label' => 'Message:',//Text that goes inside the label tag
'description' => 'This is a custom message not part of WooCommerce',//This text will appear on the description column
'desc_tip' => true,//Boolean that determines the display of the description
'placeholder' => 'Type a message',//Standard html input placeholder
);
您还可以指定以下内容:
'class' => 'css-class',//Class attributte for the input tag
'style' => 'background:red',//Style attribute for the input tag
'wrapper_class' => 'css-class',//Class for the wrapper of the input tag, it is a paragraph
答案 3 :(得分:0)
Matic Jan做得很好,并回答了这个问题,但是如果您可以将自定义字段添加到任何运输方式中……那么您如何在结帐页面上“使用”其内容?这是我使用的代码,与woocommerce_after_shipping_rate
挂钩。
function shipping_instance_custom_desc( $shipping_rate, $index ) {
if( is_cart() ) return; // Exit on cart page
$current_instance_ids = WC()->session->get( 'chosen_shipping_methods' );
$current_instance_id = $current_instance_ids[0];
if( $shipping_rate->id == $current_instance_id ) {
$option_key = 'woocommerce_'.$shipping_rate->method_id.'_'.$shipping_rate->instance_id.'_settings';
$instance_settings = get_option( $option_key );
if( isset( $instance_settings[ 'shipping_extra_field' ] ) ) {
?>
<div class="shipping-method-desc">
<?php echo $instance_settings[ 'shipping_extra_field' ] ?>
</div>
<?php
}
}
}
add_action( 'woocommerce_after_shipping_rate', 'shipping_instance_custom_desc' , 10, 2 );
我希望会有一些wc_函数来获取运输方法实例设置,但是,天哪,我错了……我发现运输方法实例设置与其他任何WP设置一样都存储在wp_options表中。因此,我的代码获取了此选项值,并检查它是否具有自定义字段(shipping_extra_field
,与Matic Jan所用的相同)...并将其输出以用于当前选择的运输方式。