【问题标题】:Override Woocommerce billing fields from Gravity Form从 Gravity Form 覆盖 Woocommerce 计费字段
【发布时间】:2019-06-24 10:07:59
【问题描述】:

我正在尝试使用商店的每个产品上设置的重力表单中的输入字段值来覆盖计费和运输默认 woocommerce 值。

我可以通过 gform_after_submission_1 钩子获得重力表单字段值。我的疑问是如何覆盖计费字段。

我的代码逻辑尝试像下一个一样工作:

//Hook action when selects payment and submits order
add_action("gform_after_submission_1", "after_submission", 20, 3);
function after_submission($entry, $form, $fields){
    /*Here is where I want to call woocommerce_checkout_fields filter
     passing $entry form field input values*/
}

// Override checkout fields
add_filter("woocommerce_checkout_fields" , "custom_override_checkout_fields", 10, 1);
//And here is where I override billing values
function custom_override_checkout_fields($entry) {
    $fields['billing']['billing_first_name']['default'] = $entry['14.3'];
    return $fields;
}

【问题讨论】:

    标签: wordpress woocommerce gravity-forms-plugin


    【解决方案1】:

    为此,您需要通过为重力表单创建自定义属性来将重力表单字段与 woocommerce 结帐表单字段映射。

    以下只是您可以实现上述功能的步骤和挂钩示例。

    add_action( 'gform_field_standard_settings',  'gf_add_woo_field' , 10, 2 );
    add_action( 'gform_editor_js','gf_editor_script' , 11, 2 );
    add_action( 'gform_after_submission', 'set_post_content', 10, 2 );
    
    function gf_add_woo_field( $position, $form_id ) {
    $woo_fields = WC()->checkout()->checkout_fields;
    

    for retrieving fields

    if ( $position == 1368 ) {?>
    <li class="woo_checkout_field_type_setting field_setting">
    <label for="woo_checkout_field_type" class="section_label">
    <?php esc_html_e( 'Field Type', 'gravityforms' ); ?>
    <?php gform_tooltip( 'form_field_type' ) ?>
     </label>
    <select id="woo_checkout_field_type" onchange="if(jQuery(this).val() == '') return; jQuery('#field_settings').slideUp(function(){StartChangeWooFieldType(jQuery('#woo_checkout_field_type').val());});">
    foreach ($woo_fields as key=>val){ ?>
        <option value="<?php echo $key; ?>"><?php echo $val; ?></option>
    <?php }
    }
    

    ?>

    function gf_editor_script() {
    ?>
    <script type='text/javascript'>
    
       jQuery(document).bind("gform_load_field_settings", 
          function(event, field, form){
             //follow the code for attribute Field Type in post custom field gravity form
      });
    </script>
    <?php }
    
    function set_post_content( $entry, $form ) {
      if ( ! empty( $form['fields'] ) && ! empty( $entry ) ) {
       foreach ( $form['fields'] as $field ) {
         if ( $field->type == '' ) {
           //find the attribute match and save in usermeta from entry creator email id or user id
           $field_id = $field->id;
                $value = $entry[ $field_id ];
           update($user_id,'billing_address',$value);
         }
        }
       }
     }
    

    注意:不要粘贴相同的代码。您必须根据自己的要求修改其中的某些部分。

    您可以搜索 existing 插件并使用它。

    关注:https://wisdmlabs.com/blog/add-custom-attribute-to-gravity-forms-field/

    【讨论】:

    • 对不起,但这并不完全符合我的需要。我有一个包含我需要的所有字段的 GForm 集。我唯一想做的就是将此字段捕获到“woocommerce_checkout_fields”过滤器中。我已经做了一些测试,我确信例如 $fields['billing']['billing_first_name']['default'] = $ entry['14.3'] 覆盖 Woocommerce 管理员上的 Billing First name 值
    • 好的。我怀疑您在“woocommerce_checkout_fields”过滤器中传递的 $entry (对象参数)。我给出的解决方案是动态的,适用于任何新的或修改的字段/表单。如果您更改重力表单中的字段,然后 $fields['billing']['billing_first_name']['default'] = $entry['14.3'];因为它是硬编码的所以不能工作。
    【解决方案2】:

    终于找到了解决办法。

    首先,我需要找到正确的挂钩来覆盖订单账单和运输字段。所以,我在woocommerce_checkout_create_order钩子里面做了一些魔术。

    add_action( 'woocommerce_checkout_create_order', 'override_checkout_fields', 10, 2 );
    function override_checkout_fields( $order, $data ){
        //Do your magic here
    }
    

    然后我在添加到购物车后找到了“存储”重力表单字段的位置,最后,从“捕获”字段设置帐单和运输字段。

    代码看起来像这样:

    add_action( 'woocommerce_checkout_create_order', 'override_checkout_fields', 10, 2 );
    function override_checkout_fields( $order, $data ){
    
        $cart = WC()->cart->get_cart();
        $field_name_billing = $values['_gravity_form_lead']['17.3']
        $field_name_shipping = $values['_gravity_form_lead']['17.3']
        //... rest of fields
    
        $order->set_billing_field_name($field_name_billing);
        $order->set_shipping_field_name($field_name_shipping);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 2014-02-04
      • 1970-01-01
      • 2016-07-15
      • 2019-05-30
      • 2017-02-16
      • 2019-06-21
      • 2016-08-28
      • 2016-09-08
      相关资源
      最近更新 更多