Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?
Дело в том, что в документации указано
данные о подписках будут храниться в таблице shop_subscription (или wp_shop_subscription, в зависимости от префикса таблиц в вашей базе данных).
Но у меня да же нет таблиц с subscription
Мне нужно подключиться к бд и получать данные на прямую из базы данных, но найти где лежат пользователи и подписки пользователей я не могу, буду рад помощи, спасибо.
Woocomerce 7.9.0 woocomerce subscription 5.2.0 |
Woocomerce 7.9.0 woocomerce subscription 5.2.0
Дополнительно:
ВП и так подключён БД и не нужно лазить напрямую ни подключаться ни вообще лазить в базу. Нужно использовать родные функции ВП.
id, ник, подписки, пользователя, их статус и т.д. , аватарку пользователя
Причем я пытался сделать на 1 id, я получал только свой никнейм, но адресоваться ко 2 id я не мог, возможно я делал ключ именно для 1 пользователя, но у меня сервер и должен сканировать всё, буду рад вашей помощи
Woocommerce Subscription работает с объектами класса WC_Subscription (не только с ним, но это базовый класс, глубже копать вам не нужно), который наследуется от WC_Order:
class WC_Subscription extends WC_Order {...}
соответственно, данные хранятся в таблицах woocommerce.
Напрямую через запросы к таблицам вы работать с подписками конечно можете, но это как-бы не очень хорошая идея. Чтобы получить данные подписок пользователя вам достаточно вызвать функцию wcs_get_users_subscriptions($user_id) и передать в неё id пользователя. Перед этим, желательно проверить, а есть ли у пользователя вообще подписки - wcs_user_has_subscription($user_id).
Пример:
// каким-то образом получаете id пользователя $user_id = get_current_user_id(); // далее проверяете, есть ли у пользователя подписки if (wcs_user_has_subscription($user_id)) { // получаете массив объектов WC_Subscription $users_subscriptions = wcs_get_users_subscriptions($user_id); // далее, вытаскиваете из объектов всё, что вам нужно. Здесь я привёл лишь некоторые данные из возможных. На самом деле их там гораздо больше. Версия WC Subscription 5.6.0. $result = array_map( function($subscription) { return [ 'id' => $subscription->get_id(), 'version' => $subscription->get_version(), 'customer_id' => $subscription->get_customer_id(), 'status' => $subscription->get_status(), 'currency' => $subscription->get_currency(), 'date_created' => $subscription->get_date( 'date_created' ), 'next_payment' => $subscription->get_date( 'next_payment' ), 'date_end' => $subscription->get_date( 'end' ), 'date_trial_end' => $subscription->get_date( 'trial_end' ), 'payment_method' => $subscription->get_payment_method_title(), 'total' => $subscription->get_total(), 'discount_total' => $subscription->get_discount_total(), 'shipping_total' => $subscription->get_shipping_total() ]; }, $users_subscriptions ); echo '<pre>'; print_r($result); echo '</pre>'; } |
// каким-то образом получаете id пользователя $user_id = get_current_user_id(); // далее проверяете, есть ли у пользователя подписки if (wcs_user_has_subscription($user_id)) { // получаете массив объектов WC_Subscription $users_subscriptions = wcs_get_users_subscriptions($user_id); // далее, вытаскиваете из объектов всё, что вам нужно. Здесь я привёл лишь некоторые данные из возможных. На самом деле их там гораздо больше. Версия WC Subscription 5.6.0. $result = array_map( function($subscription) { return [ 'id' => $subscription->get_id(), 'version' => $subscription->get_version(), 'customer_id' => $subscription->get_customer_id(), 'status' => $subscription->get_status(), 'currency' => $subscription->get_currency(), 'date_created' => $subscription->get_date( 'date_created' ), 'next_payment' => $subscription->get_date( 'next_payment' ), 'date_end' => $subscription->get_date( 'end' ), 'date_trial_end' => $subscription->get_date( 'trial_end' ), 'payment_method' => $subscription->get_payment_method_title(), 'total' => $subscription->get_total(), 'discount_total' => $subscription->get_discount_total(), 'shipping_total' => $subscription->get_shipping_total() ]; }, $users_subscriptions ); echo '<pre>'; print_r($result); echo '</pre>'; }
Для получения данных профиля пользователя вам вполне достаточно функции get_user_by('ID', $user_id).
Для получения ссылки на аватар - get_avatar_url($user_id)
- Хорошо, а как мне с этим взаимодействовать с наружи? на пример при помощи C#
- просто я тут уже и GraphiQL поставил но не получается подписки получить)
- Добавлять REST API эндпойнт, что-то типа:
GET https://your_wp_site.com/wp-json/your_namespace/v1...
в запросе передавать id пользователя и формировать данные, как я описал выше в примере.
Если внешнее приложение не будет знать id пользователя на стороне WP - вместо id передавать email. Соответственно, в коде примера получать внутренний id пользователя по email, остальное примерно также.
- Михаил Нестеров, кстати ещё хотел спросить, вот есть создание ключа
Я правильно понимаю что доступ только для самого себя будет иметь или если сделать REST API эндпойнт то не нужно будет ключ?
- Да, для себя и не хотите делать проверку по ключу, то можете без ключа.
Только тогда при создании эндпойнта нужно будет задать значение для 'permission_callback' => '__return_true', примерно так:register_rest_route( 'your_namespace/v1/user/(?P<id>d+)/subscriptions', [ [ 'methods' => WP_REST_Server::READABLE, 'callback' => 'your_callback_function', 'permission_callback' => '__return_true', ], ]); function your_callback_function( WP_REST_Request $request ) { $user_id = (int) $request->get_param('id'); // тут получаете всё что нужно по id пользователя... return $result; }
register_rest_route( 'your_namespace/v1/user/(?P<id>d+)/subscriptions', [ [ 'methods' => WP_REST_Server::READABLE, 'callback' => 'your_callback_function', 'permission_callback' => '__return_true', ], ]); function your_callback_function( WP_REST_Request $request ) { $user_id = (int) $request->get_param('id'); // тут получаете всё что нужно по id пользователя... return $result; }
- Михаил Нестеров, А не подскажите, вот у меня есть товар
id 1820 если я правильно понял, у подписки несколько вариаций я же могу увидеть к какому товару эта подписка относиться?
- Да, можете. Тут только есть пару нюансов. Товар можно получить из заказа. Но, в подписке не хранится id заказа, а хранится order_key (строка вида wc_order_jnzYOUIBzrNMJ).
Поэтому, нужно сначала получить id заказа по order_key, а потом уже товары из заказа. Тогда $result будет примерно такой:$result = array_map( function($subscription) { // получить id заказа по order_key функцией wc_get_order_id_by_order_key($order_key) $order_id = wc_get_order_id_by_order_key( $subscription->get_order_key() ); // получить заказ по id заказа $order = wc_get_order($order_id); // получить товары из заказа $order_items = array_map( function($item) { return [ 'product_id' => $item->get_product_id(), 'variation_id' => $item->get_variation_id(), 'product_name' => $item->get_name() ]; }, $order->get_items() ); return [ 'id' => $subscription->get_id(), 'version' => $subscription->get_version(), 'customer_id' => $subscription->get_customer_id(), 'status' => $subscription->get_status(), 'currency' => $subscription->get_currency(), 'date_created' => $subscription->get_date( 'date_created' ), 'next_payment' => $subscription->get_date( 'next_payment' ), 'date_end' => $subscription->get_date( 'end' ), 'date_trial_end' => $subscription->get_date( 'trial_end' ), 'payment_method' => $subscription->get_payment_method_title(), 'total' => $subscription->get_total(), 'discount_total' => $subscription->get_discount_total(), 'shipping_total' => $subscription->get_shipping_total(), 'order_key' => $subscription->get_order_key(), 'order_items' => $order_items ]; }, $users_subscriptions );
$result = array_map( function($subscription) { // получить id заказа по order_key функцией wc_get_order_id_by_order_key($order_key) $order_id = wc_get_order_id_by_order_key( $subscription->get_order_key() ); // получить заказ по id заказа $order = wc_get_order($order_id); // получить товары из заказа $order_items = array_map( function($item) { return [ 'product_id' => $item->get_product_id(), 'variation_id' => $item->get_variation_id(), 'product_name' => $item->get_name() ]; }, $order->get_items() ); return [ 'id' => $subscription->get_id(), 'version' => $subscription->get_version(), 'customer_id' => $subscription->get_customer_id(), 'status' => $subscription->get_status(), 'currency' => $subscription->get_currency(), 'date_created' => $subscription->get_date( 'date_created' ), 'next_payment' => $subscription->get_date( 'next_payment' ), 'date_end' => $subscription->get_date( 'end' ), 'date_trial_end' => $subscription->get_date( 'trial_end' ), 'payment_method' => $subscription->get_payment_method_title(), 'total' => $subscription->get_total(), 'discount_total' => $subscription->get_discount_total(), 'shipping_total' => $subscription->get_shipping_total(), 'order_key' => $subscription->get_order_key(), 'order_items' => $order_items ]; }, $users_subscriptions );
- Михаил Нестеров, а как то по другому можно понимать к чему относиться подписка?
И не подскажите почему мой код выдаёт ошибку:
add_action('get-user-info-from-server', function () { register_rest_route('your_namespace/v1', '/user/(?P<id>d+)/subscriptions', array( 'methods' => 'GET', 'callback' => 'get_user_subscriptions', 'permission_callback' => '__return_true', )); }); // Обработчик запроса API function get_user_subscriptions($request) { $user_id = $request->get_param('id'); $user_info = get_userdata($user_id); $avatar_url = get_avatar_url($user_id); $subscriptions = wcs_get_users_subscriptions($user_id); $formatted_data = array( 'user_id' => $user_id, 'user_name' => $user_info->display_name, 'user_email' => $user_info->user_email, 'avatar_url' => $avatar_url, 'subscriptions' => array() ); foreach ($subscriptions as $subscription) { $formatted_data['subscriptions'][] = array( 'subscription_id' => $subscription->get_id(), 'subscription_status' => $subscription->get_status(), 'subscription_product' => $subscription->get_product()->get_name(), 'subscription_start_date' => $subscription->get_date('start'), 'subscription_end_date' => $subscription->get_date('end') ); } return rest_ensure_response($formatted_data); }
add_action('get-user-info-from-server', function () { register_rest_route('your_namespace/v1', '/user/(?P<id>d+)/subscriptions', array( 'methods' => 'GET', 'callback' => 'get_user_subscriptions', 'permission_callback' => '__return_true', )); }); // Обработчик запроса API function get_user_subscriptions($request) { $user_id = $request->get_param('id'); $user_info = get_userdata($user_id); $avatar_url = get_avatar_url($user_id); $subscriptions = wcs_get_users_subscriptions($user_id); $formatted_data = array( 'user_id' => $user_id, 'user_name' => $user_info->display_name, 'user_email' => $user_info->user_email, 'avatar_url' => $avatar_url, 'subscriptions' => array() ); foreach ($subscriptions as $subscription) { $formatted_data['subscriptions'][] = array( 'subscription_id' => $subscription->get_id(), 'subscription_status' => $subscription->get_status(), 'subscription_product' => $subscription->get_product()->get_name(), 'subscription_start_date' => $subscription->get_date('start'), 'subscription_end_date' => $subscription->get_date('end') ); } return rest_ensure_response($formatted_data); }
{"code":"rest_no_route","message":"u041fu043eu0434u0445u043eu0434u044fu0449u0438u0439 u043cu0430u0440u0448u0440u0443u0442 u0434u043bu044f URL u0438 u043cu0435u0442u043eu0434u0430 u0437u0430u043fu0440u043eu0441u0430 u043du0435 u043du0430u0439u0434u0435u043d.","data":{"status":404}}
- RINCODE,
потому, что неправильно зарегистрировали эндпойнт.
Эндпойнт нужно добавлять не на произвольный эшн, а на rest_api_init. И анонимную функцию здесь лучше не использовать:add_action( 'rest_api_init', 'register_rest_route'); function register_rest_route() { register_rest_route('your_namespace/v1', '/user/(?P<id>d+)/subscriptions', array( 'methods' => 'GET', 'callback' => 'get_user_subscriptions', 'permission_callback' => '__return_true', )); }
add_action( 'rest_api_init', 'register_rest_route'); function register_rest_route() { register_rest_route('your_namespace/v1', '/user/(?P<id>d+)/subscriptions', array( 'methods' => 'GET', 'callback' => 'get_user_subscriptions', 'permission_callback' => '__return_true', )); }
- Михаил Нестеров, Наверное я что то не то сделал
wp-json/get-user-info-from-server/v1/user/1/subscriptions - ссылка по которой пытаюсь получить доступ
add_action( 'rest_api_init', 'register_rest_route'); function register_rest_route() { register_rest_route('your_namespace/v1', '/user/(?P<id>d+)/subscriptions', array( 'methods' => 'GET', 'callback' => 'get_user_subscriptions', 'permission_callback' => '__return_true', )); } // Обработчик запроса API function get_user_subscriptions($request) { $user_id = $request->get_param('id'); $user_info = get_userdata($user_id); $avatar_url = get_avatar_url($user_id); $subscriptions = wcs_get_users_subscriptions($user_id); $formatted_data = array( 'user_id' => $user_id, 'user_name' => $user_info->display_name, 'user_email' => $user_info->user_email, 'avatar_url' => $avatar_url, 'subscriptions' => array() ); foreach ($subscriptions as $subscription) { $formatted_data['subscriptions'][] = array( 'subscription_id' => $subscription->get_id(), 'subscription_status' => $subscription->get_status(), 'subscription_product' => $subscription->get_product()->get_name(), 'subscription_start_date' => $subscription->get_date('start'), 'subscription_end_date' => $subscription->get_date('end') ); } return rest_ensure_response($formatted_data); }
add_action( 'rest_api_init', 'register_rest_route'); function register_rest_route() { register_rest_route('your_namespace/v1', '/user/(?P<id>d+)/subscriptions', array( 'methods' => 'GET', 'callback' => 'get_user_subscriptions', 'permission_callback' => '__return_true', )); } // Обработчик запроса API function get_user_subscriptions($request) { $user_id = $request->get_param('id'); $user_info = get_userdata($user_id); $avatar_url = get_avatar_url($user_id); $subscriptions = wcs_get_users_subscriptions($user_id); $formatted_data = array( 'user_id' => $user_id, 'user_name' => $user_info->display_name, 'user_email' => $user_info->user_email, 'avatar_url' => $avatar_url, 'subscriptions' => array() ); foreach ($subscriptions as $subscription) { $formatted_data['subscriptions'][] = array( 'subscription_id' => $subscription->get_id(), 'subscription_status' => $subscription->get_status(), 'subscription_product' => $subscription->get_product()->get_name(), 'subscription_start_date' => $subscription->get_date('start'), 'subscription_end_date' => $subscription->get_date('end') ); } return rest_ensure_response($formatted_data); }
- RINCODE, у вас эндпойнт зарегистрирован так:
your_namespace/v1/user/1/subscriptions
а вы отправляете так:
get-user-info-from-server/v1/user/1/subscriptionsт.е. namespace неверно указан.
и вот тут скорее всего ошибка:
'subscription_product' => $subscription->get_product()->get_name(),
'subscription_product' => $subscription->get_product()->get_name(),
выше посмотрите, я по получению продукта описал, добавил в пример. Сначала получаете заказ, а из него массив продуктов. Т.е. там будет массив, даже если продукт один - всё равно массив.
- Михаил Нестеров, только вот я в php не очень силён, точнее вообще)
и если можно можете написать мне в телеграмме? https://t.me/rincoder - Михаил Нестеров, А ещё попытался наварганить из той информации что вы мне дали + что у меня было, так вот что то намешал, главное не травануться) Вообще я думал что array_map, должно вернуть нормально но что то тут не так
<?php /* Plugin Name: User Info API / мой плагин для пполучения данных пользователя Description: Adds a REST API endpoint to retrieve user information and subscriptions. Version: 1.0 Author: Your Name Author URI: Your Website License: GPL2 */ // Регистрация маршрута API add_action( 'rest_api_init', 'register_rest_route'); function register_rest_route() { register_rest_route('get-user-info-from-server/v1', '/user/(?P<id>d+)/subscriptions', array( 'methods' => 'GET', 'callback' => 'get_user_subscriptions', 'permission_callback' => '__return_true', )); } // Обработчик запроса API function get_user_subscriptions($request) { $result = array_map( function($subscription) { $user_id = $request->get_param('id'); $user_info = get_userdata($user_id); $avatar_url = get_avatar_url($user_id); $subscriptions = wcs_get_users_subscriptions($user_id); // получить id заказа по order_key функцией wc_get_order_id_by_order_key($order_key) $order_id = wc_get_order_id_by_order_key( $subscription->get_order_key() ); // получить заказ по id заказа $order = wc_get_order($order_id); // получить товары из заказа $order_items = array_map( function($item) { return [ 'product_id' => $item->get_product_id(), 'variation_id' => $item->get_variation_id(), 'product_name' => $item->get_name() ]; }, $order->get_items() ); return [ 'id' => $subscription->get_id(), 'version' => $subscription->get_version(), 'customer_id' => $subscription->get_customer_id(), 'status' => $subscription->get_status(), 'currency' => $subscription->get_currency(), 'date_created' => $subscription->get_date( 'date_created' ), 'next_payment' => $subscription->get_date( 'next_payment' ), 'date_end' => $subscription->get_date( 'end' ), 'date_trial_end' => $subscription->get_date( 'trial_end' ), 'payment_method' => $subscription->get_payment_method_title(), 'total' => $subscription->get_total(), 'discount_total' => $subscription->get_discount_total(), 'shipping_total' => $subscription->get_shipping_total(), 'order_key' => $subscription->get_order_key(), 'order_items' => $order_items ]; }, $users_subscriptions ); return rest_ensure_response($result); }
<?php /* Plugin Name: User Info API / мой плагин для пполучения данных пользователя Description: Adds a REST API endpoint to retrieve user information and subscriptions. Version: 1.0 Author: Your Name Author URI: Your Website License: GPL2 */ // Регистрация маршрута API add_action( 'rest_api_init', 'register_rest_route'); function register_rest_route() { register_rest_route('get-user-info-from-server/v1', '/user/(?P<id>d+)/subscriptions', array( 'methods' => 'GET', 'callback' => 'get_user_subscriptions', 'permission_callback' => '__return_true', )); } // Обработчик запроса API function get_user_subscriptions($request) { $result = array_map( function($subscription) { $user_id = $request->get_param('id'); $user_info = get_userdata($user_id); $avatar_url = get_avatar_url($user_id); $subscriptions = wcs_get_users_subscriptions($user_id); // получить id заказа по order_key функцией wc_get_order_id_by_order_key($order_key) $order_id = wc_get_order_id_by_order_key( $subscription->get_order_key() ); // получить заказ по id заказа $order = wc_get_order($order_id); // получить товары из заказа $order_items = array_map( function($item) { return [ 'product_id' => $item->get_product_id(), 'variation_id' => $item->get_variation_id(), 'product_name' => $item->get_name() ]; }, $order->get_items() ); return [ 'id' => $subscription->get_id(), 'version' => $subscription->get_version(), 'customer_id' => $subscription->get_customer_id(), 'status' => $subscription->get_status(), 'currency' => $subscription->get_currency(), 'date_created' => $subscription->get_date( 'date_created' ), 'next_payment' => $subscription->get_date( 'next_payment' ), 'date_end' => $subscription->get_date( 'end' ), 'date_trial_end' => $subscription->get_date( 'trial_end' ), 'payment_method' => $subscription->get_payment_method_title(), 'total' => $subscription->get_total(), 'discount_total' => $subscription->get_discount_total(), 'shipping_total' => $subscription->get_shipping_total(), 'order_key' => $subscription->get_order_key(), 'order_items' => $order_items ]; }, $users_subscriptions ); return rest_ensure_response($result); }
А ещё я включал дебаг режим и он мне написал следующее:
Fatal error: Cannot redeclare register_rest_route() (previously declared in /home/playpal.shop/public_html/wp-includes/rest-api.php:34) in /home/playpal.shop/public_html/wp-content/plugins/user-info-api/user-info-api.php on line 13 Notice: Функция is_embed вызвана неправильно. Условные теги не работают, пока не разобран запрос. До этого момента они всегда возвращают false. Дополнительную информацию можно найти на странице «Отладка в WordPress». (Это сообщение было добавлено в версии 3.1.0.) in /home/playpal.shop/public_html/wp-includes/functions.php on line 5865 Notice: Функция is_search вызвана неправильно. Условные теги не работают, пока не разобран запрос. До этого момента они всегда возвращают false. Дополнительную информацию можно найти на странице «Отладка в WordPress». (Это сообщение было добавлено в версии 3.1.0.) in /home/playpal.shop/public_html/wp-includes/functions.php on line 5865
Fatal error: Cannot redeclare register_rest_route() (previously declared in /home/playpal.shop/public_html/wp-includes/rest-api.php:34) in /home/playpal.shop/public_html/wp-content/plugins/user-info-api/user-info-api.php on line 13 Notice: Функция is_embed вызвана неправильно. Условные теги не работают, пока не разобран запрос. До этого момента они всегда возвращают false. Дополнительную информацию можно найти на странице «Отладка в WordPress». (Это сообщение было добавлено в версии 3.1.0.) in /home/playpal.shop/public_html/wp-includes/functions.php on line 5865 Notice: Функция is_search вызвана неправильно. Условные теги не работают, пока не разобран запрос. До этого момента они всегда возвращают false. Дополнительную информацию можно найти на странице «Отладка в WordPress». (Это сообщение было добавлено в версии 3.1.0.) in /home/playpal.shop/public_html/wp-includes/functions.php on line 5865
Я не очень понял что имеется в виду под is_search, но похоже я сделал что то не так, ещё я не знаю про наследование, но вкладывать функцию в функцию думаю не очень хороший поступок) Буду рад если поможете мне, на самом деле я потратил больше времени на это чем на разработку остального, буду очень признателен если поможете мне) Спокойной ночи
- RINCODE,
да, это я ошибся. Функцию register_rest_route переименуйте, которая вешается на экшн rest_api_init - любое своё название (я ниже её переименовал в my_register_rest_route_function). Поэтому Fatal Error redeclare получаете. Т.е. примерно так должно быть:add_action( 'rest_api_init', 'my_register_rest_route_function'); function my_register_rest_route_function() { register_rest_route('get-user-info-from-server/v1', '/user/(?P<id>d+)/subscriptions', array( 'methods' => 'GET', 'callback' => 'get_user_subscriptions', 'permission_callback' => '__return_true', )); }
add_action( 'rest_api_init', 'my_register_rest_route_function'); function my_register_rest_route_function() { register_rest_route('get-user-info-from-server/v1', '/user/(?P<id>d+)/subscriptions', array( 'methods' => 'GET', 'callback' => 'get_user_subscriptions', 'permission_callback' => '__return_true', )); }
- Михаил Нестеров, а не подскажите как можно вот это пофиксить
product_name":"FishHelper u0434u043bu044f u0441u0435u0440u0432u0435u0440u0430 Majestic RP - 3 u0434u043du044f"
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос






В WooCommerce Subscriptions подписки обычно не хранятся в отдельной таблице
wp_shop_subscription. В классической схеме это записи WordPress с типомshop_subscriptionв таблицеwp_posts, а данные подписки лежат вwp_postmeta. Связанные товары и позиции заказа находятся в таблицах WooCommerce order items:wp_woocommerce_order_itemsиwp_woocommerce_order_itemmeta.Базовая проверка в SQL:
SELECT ID, post_status, post_date, post_parent FROM wp_posts WHERE post_type = 'shop_subscription' ORDER BY ID DESC;
SELECT meta_key, meta_value FROM wp_postmeta WHERE post_id = 12345 ORDER BY meta_key;
Но подключаться напрямую к базе для бизнес-данных WooCommerce не лучший путь. У подписок много связей, статусов и совместимости с HPOS. Правильнее получать данные через API WooCommerce Subscriptions:
$subscriptions = wcs_get_subscriptions([ 'customer_id' => $user_id, 'subscription_status' => 'any', 'limit' => -1, ]); foreach ($subscriptions as $subscription) { echo $subscription->get_id(); echo $subscription->get_status(); echo $subscription->get_total(); }
Если включены High-Performance Order Storage, данные заказов и подписок могут быть в таблицах
wp_wc_orders,wp_wc_orders_meta,wp_wc_order_addresses, а не только вwp_posts/wp_postmeta. Поэтому прямые SQL-запросы будут ломаться при смене режима хранения.Для внешней системы на C# лучше использовать REST API. У WooCommerce есть стандартные endpoints для клиентов и заказов, а у Subscriptions при установленном расширении доступны endpoints подписок. Так вы получите ID пользователя, email, статусы подписок, даты, товары и суммы без привязки к внутренним таблицам.