【问题标题】:Update user meta after woocommerce checkout form process在 woocommerce 结帐表单流程后更新用户元数据
【发布时间】:2013-07-22 16:48:22
【问题描述】:

我在 Wordpress 中使用 woocommerce 并在结帐时添加了一些自定义字段:

add_action('woocommerce_after_order_notes', 'my_custom_checkout_field');

function my_custom_checkout_field( $checkout ) {

      $extra_fields = array('job_title', 'company', 'telephone', 'occupation');

      foreach($extra_fields as $key => $value) {

      woocommerce_form_field($value, array(
            'type'          => 'text',
            'class'         => array('my-field-class form-row-wide'),
            'label'         => __($label),
            'value'         => '',
            ), $checkout->get_value( $value ));

      }
}

目前,这些显示在结帐中很好,不确定在这种情况下使用woocommerce_after_order_notes 是否正确。我还在用户元数据中添加了一些自定义字段,这些字段与添加到结帐的字段相对应 - 它们都显示在用户个人资料页面中:

function add_contact_methods( $contactmethods ) {
     $contactmethods['job_title'] = 'Job Title';
     $contactmethods['company'] = 'Company Name';
     $contactmethods['telephone'] = 'Telephone';
     $contactmethods['occupation'] = 'Occupation';
     $contactmethods['refer'] = 'How you heard about us?';
     return $contactmethods;
}
add_filter('user_contactmethods','add_contact_methods',10,1);

您可以想象,如果我在任何个人资料页面中更新这些字段中的任何一个,它都可以正常工作,但我似乎无法在新用户进行购买时更新用户元数据,它不会更新用户元数据数据库中的这些字段。

我非常了解它的工作原理,并且了解我必须连接到 Woocommerce 流程才能将字段添加到流程中。所以我也将此代码添加到我的函数中:

add_action('woocommerce_checkout_update_user_meta', 'my_custom_checkout_field_update_user_meta');

    function my_custom_checkout_field_update_user_meta( $user_id ) {
        global $extra_fields;
        foreach($extra_fields as $key => $value) {
        if ($_POST[$value]) update_user_meta( $user_id, $value, esc_attr($_POST[$value]));
        }
    }

现在的转折是,如果已经以会员身份登录的用户进行回购并结帐,则此方法有效 - 之所以有效,是因为 $user_id 已经存在,但是当新用户正在检查时出来,他们还没有作为用户存在,因此该函数无法更新 NIL 的用户元,而 $user_id 不存在。

我的问题是,我如何挂钩到结帐过程,大概是在创建用户之后,所以我可以得到 $user_id 返回,并执行这个函数来更新用户元数据。

【问题讨论】:

  • 可以在here找到一个规范的答案。

标签: wordpress woocommerce meta


【解决方案1】:

class-wc-checkout.php 第 639 行使用$this->customer_id = wp_insert_user( apply_filters( 'woocommerce_new_customer_data', $new_customer_data ) ); 创建新用户新客户数据是列在该行上方的数组。

之后,您可以通过第 649 行的操作 do_action( 'woocommerce_created_customer', $this->customer_id ); 访问用户 ID

这不太可能,在您的情况下,您需要使用过滤器,但只需添加操作“woocommerce_created_customer”,拉入 id,然后添加元。

【讨论】:

    【解决方案2】:

    当客户未登录时,结帐页面应该是可接受的字段,客户希望创建一个新帐户。以下示例代码在客户订购新商品并更新用户元数据时更改结帐页面。

    function user_extra_meta_fields(){
    
     return array(
       'job_title' => __( 'Job Title', 'yourtext_domain'),
       'company' => __( 'Company Name', 'yourtext_domain'),
       'telephone' => __( 'Telephone', 'yourtext_domain'),
       'occupation' => __( 'Occupation', 'yourtext_domain'),
       'refer' => __( 'How you heard about us?', 'yourtext_domain'),
     ); 
    
    } 
    
    function add_contact_methods( $contactmethods ) {
         $contactmethods = array_merge( $contactmethods, user_extra_meta_fields());
         return $contactmethods;
    }
    
    add_filter('user_contactmethods','add_contact_methods',10,1);
    
    
    add_action('woocommerce_after_order_notes', 'my_custom_checkout_field');
    
    function my_custom_checkout_field( $checkout ) {
    
      foreach( user_extra_meta_fields() as $name => $label) {
         $value = '';     
         if( is_user_logged_in() )
         $value = get_user_meta( get_current_user_id(), $name, true );
    
          woocommerce_form_field( $name, array(
                'type'          => 'text',
                'class'         => array('my-field-class form-row-wide'),
                'label'         => $label,
                ), $value );
    
          }
    }
    
    add_action( 'woocommerce_checkout_process', 'user_fields_woocommerce_checkout_process' );
    
    function user_fields_woocommerce_checkout_process(){
    
      if( is_user_logged_in() )
      add_action('woocommerce_checkout_update_user_meta', 'my_custom_checkout_field_update_user_meta' );
    
      else 
      add_action( 'woocommerce_created_customer',  'my_custom_checkout_field_update_user_meta' );
    }
    
    
    function my_custom_checkout_field_update_user_meta( $user_id ) {
    
        foreach( array_keys( user_extra_meta_fields() ) as $meta_name  ){
          if( isset( $_POST[$meta_name] ) ){
             $meta_value = $_POST[$meta_name] ? esc_attr($_POST[$meta_name]) : '';                                                    
             update_user_meta( $user_id,  $meta_name, $meta_value );  
          }
    
        }
    }
    
    // if want to validate field
    
    add_action( 'woocommerce_after_checkout_validation', 'user_fields_woocommerce_after_checkout_validation' );
    
    function user_fields_woocommerce_after_checkout_validation( $posted ){
    
      $validate = true;
      if( ! is_user_logged_in() && empty( $posted['createaccount'] )  )
      $validate = false;
    
      if( $validate == false )
      return; 
    
      $meta_data = user_extra_meta_fields();
    
      foreach( array_keys( $meta_data ) as $meta_name  ){
        if(  empty($_POST[$meta_name]) )
        wc_add_notice( sprintf( __(' <strong>%s</strong> is required.', 'yourtext_domain'),  $meta_data[$meta_name] ), 'error' );  
      }
    
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2019-09-12
      相关资源
      最近更新 更多