Woocommerce 订阅 - 以编程方式设置所有者

Woocommerce Subscriptions - Set owner programmatically

我在网站上使用 WooCommerce 订阅来提供基于团队的会员资格。我想确保订阅的所有者与团队的所有者相匹配(一个用户来统治他们......!)

可以通过管理员使用客户下拉字段来完成此操作。

所以,我一直在尝试以编程方式进行设置。据我了解,所有订阅数据都有 getter 和 setter 方法(并且订阅是从 WC_Order 扩展而来的,这些方法也应该有效)。但是,我想不出用什么方法来做这个改变。

我试过从订阅 ID 创建订阅和订单实例,但我在下面尝试的方法都不起作用:

set_user_id(456)
set_customer_id(456)

当我print_r()订阅实例时,原来的customer_id还在数据数组下面:

WC_Subscription Object
(
    [data:protected] => Array
    (
   ...
   [customer_id] => 123
   )
...
)

鉴于数组是受保护的,我猜还有一个 setter 方法我还没有尝试过。有人可以帮我解决我需要什么类型的实例和 setter 方法吗?

干杯!

我很高兴地说我自己解决了这个问题 - 在这里发帖希望能帮助其他人避免用头撞墙!

事实证明我做的一切都是正确的,我只是在进行更改后没有调用 save() 方法......!哦!

我非常习惯 WordPress 中的功能立即生效 - 例如,对 update_post_meta 的有效调用将立即生效。

相反,WooCommerce 通过 getters/setters 在通过 WC_Order(或其他抽象)创建的本地实例中存储更改。这些仅在您调用 save() 方法时保存到数据库*。我相信这是为了帮助防止不必要的数据库调用。

*或者数据存储,如果你正在做一些非常奇特的事情。

订单 ID“123”和新用户 ID“456”的代码示例:

// Create order instance
$order_instance = wc_get_order(123);

// Set new customer id
$order_instance->set_customer_id(456);

// Save changes
$order_instance->save();

// To echo data back, use the get_data() method to create an array of data, which you can assign however needed. For example:

$order_data = $order_instance->get_data();

$customer_id = $order_data['customer_id']; 

echo 'customer number = ' .  $customer_id;

我从 Advanced Woo 的非常有用的文档中找到了关于为什么 数据需要手动保存(它仅存储在本地实例中)的信息:

"Setter 方法更新工作内存中保存的 WC_Data 对象中的信息。但是,必须调用数据库操作方法之一才能在数据库中进行更改。"

https://advancedwoo.com/topic/wc_data-and-data-storage-manipulate/#/setters