如何在Shipping方法(Backend)中添加Custom Description字段

时间:2017-05-18 08:49:21

标签: php wordpress woocommerce shipping hook-woocommerce

我想在送货方式下的Shipping Zone页面中添加一个自定义字段,它将是一个文本输入,用户将能够添加自定义消息,我将在前端显示该消息。

我注意到它将数据保存在 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 表中,该表中没有任何额外的列来保存数据;所以我想我必须使用我的自定义逻辑,但我不知道hook的名称。

所以我的问题是,是否有任何钩子会帮助/允许我

  1. 添加自定义字段。
  2. 添加自定义列。
  3. TL; DR: enter image description here

    enter image description here

4 个答案:

答案 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所用的相同)...并将其输出以用于当前选择的运输方式。