#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