Подписки Woocommerce — Установите владельца программно

#woocommerce #subscription #membership #woocommerce-subscriptions

Вопрос:

Я использую подписки WooCommerce на сайте для предоставления членства в команде. Я хотел бы убедиться, что владелец подписки совпадает с владельцем команды (один пользователь управляет ими всеми…!)

Это можно сделать через администратора, используя раскрывающиеся поля «Клиент».

Итак, я пытался установить это программно. Насколько я понимаю, для всех данных подписки существуют методы получения и настройки (и поскольку подписка продлевается из WC_Order, эти методы тоже должны работать). Однако я не могу понять, какой метод использовать для внесения этого изменения.

Я попытался создать как подписку, так и экземпляр заказа по идентификатору подписки, но ни один из методов, которые я опробовал ниже, не работает:

 set_user_id(456)
set_customer_id(456)
 

Когда я печатаю экземпляр подписки (), исходный идентификатор пользователя все еще находится в массиве данных:

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

Учитывая, что массив защищен, я предполагаю, что есть метод настройки, который я еще не пробовал. Может ли кто-нибудь, пожалуйста, помочь мне с тем, какой тип экземпляра и метод настройки мне нужен для этого, пожалуйста?

Ваше здоровье!

Ответ №1:

Я рад сообщить, что сам решил эту проблему — разместил здесь, чтобы, надеюсь, помочь кому-то еще не биться головой о стены!

Оказывается, я все делал правильно, я просто не вызывал метод save() после того, как внес свои изменения……! О!

Я довольно привык к функциям в WordPress, имеющим немедленный эффект — допустимый вызов update_post_meta, например, вступит в силу сразу.

Вместо этого WooCommerce хранит изменения с помощью геттеров/сеттеров в локальном экземпляре, созданном с помощью WC_Order (или других абстракций). Они сохраняются в базе данных* только при вызове метода save (). Я считаю, что это должно помочь предотвратить ненужные вызовы базы данных.

*или хранилище данных, если вы делаете что-то очень необычное.

Пример кода для тех, кому это нужно, для идентификатора заказа «123» и нового идентификатора пользователя «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:

«Методы настройки обновляют информацию в объекте WC_Data, хранящемся в рабочей памяти. Однако для внесения изменений в базу данных необходимо вызвать один из методов работы с базой данных.»

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