在 Woocommerce 中使用 CRUD 对象设置客户用户数据

Setting customer user data with CRUD object in Woocommerce

我正在尝试为 woocommerce 上的用户设置 first_name 的新值,我想使用 woocommerce 3.0 的最新文档中的 'CRUD Objects in 3.0' 来完成此操作。

所以我正在定义变量:

$wc_current_user = WC()->客户;

return class WC_Customer 的一个实例有一个 $data 数组,其中包含有关客户的数据,例如 $first_name、$last_name , $email, $billing_address 数组等等...

我正在尝试重写 edit-account.php 表单并想在该对象上提交此数据,他提供了 getter 和 setters 来执行此操作,但似乎 setter ins't working, he is not saving the data.

我正在这样做:

我有一个从用户那里获取名字的表单,它工作正常,我正在使用 ->get_first_name 并且工作正常。

  <form class="woocommerce-account-information" action="" method="post">

    <label>First Name</label>
     <input type="text" name="first_name" value="<?php echo 
     $wc_current_user->get_first_name()?>"/>

     <button type="submit">SAVE</button>
  </form>

问题就在这里,当我尝试使用 setter 提交此数据时,在本例中是 'object -> set_first_name' 和 'object->save()',没有任何反应,有人可以帮助我吗?

这是我的代码:

  if( isset($_POST['first_name'] ) ){
     $wc_current_user->set_first_name($_POST['first_name']);
     $wc_current_user->save();

   }

//这个 ^ 不起作用,你知道错在哪里吗?

我很想知道新旧方法,如果有人能帮助我,那将是一个很大的帮助。谢谢!

您设置用户名字的方法正确。

set_first_name() 不会永久保存自己的值。设置完所有要更新的属性后,您需要调用 save() 方法。

if ( isset( $_POST['first_name'] ) ) {
    $wc_current_user->set_first_name( $_POST['first_name'] );
    $wc_current_user->save();
} 

我找到了这个问题的解决方案,当你像这样使用对象时,你需要使用 Nathan 所说的 $object-save() 方法加上 $object->apply_changes();提交替换数据库中的数据:

public function apply_changes() {
    $this->data    = array_replace_recursive( $this->data, $this->changes );
    $this->changes = array();
}

我的工作代码如下所示:

       $wc_current_user = WC()->customer;

       if ( isset($_POST['first_name']) ) {
            $wc_current_user->set_first_name($_POST['first_name']);
            $wc_current_user->save();
            $wc_current_user->apply_changes();
      }