Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

Ссылка скопирована
1 ответ

Дело в том, что в документации указано

данные о подписках будут храниться в таблице shop_subscription (или wp_shop_subscription, в зависимости от префикса таблиц в вашей базе данных).

Но у меня да же нет таблиц с subscription

Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

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

Woocomerce 7.9.0 woocomerce subscription 5.2.0

Woocomerce 7.9.0 woocomerce subscription 5.2.0

Дополнительно:

ВП и так подключён БД и не нужно лазить напрямую ни подключаться ни вообще лазить в базу. Нужно использовать родные функции ВП.

  • Refguser, только вот стандартные функции WP не дают мне того, что мне нужно, если бы они мне давали эту возможность небыло бы проблем
  • RINCODE, всё они дают. А у тебя ошибка XY.
  • Refguser, Хорошо, тогда подскажите пожалуйста через RestAPI мне нужно получить следующие данные по id пользователя:
    id, ник, подписки, пользователя, их статус и т.д. , аватарку пользователя

    Причем я пытался сделать на 1 id, я получал только свой никнейм, но адресоваться ко 2 id я не мог, возможно я делал ключ именно для 1 пользователя, но у меня сервер и должен сканировать всё, буду рад вашей помощи

  • RINCODE, всё написано тут https://developer.wordpress.org/rest-api/. + читай маны к плагу и/или пиши в их саппорт. Никто не будет его покупать, чтобы для тебя решить задачку.
  • Refguser, Хех, написал в саппорт 0 реакции
  • Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

    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, остальное примерно также.

    • Михаил Нестеров, кстати ещё хотел спросить, вот есть создание ключа

      Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

      Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

      Я правильно понимаю что доступ только для самого себя будет иметь или если сделать 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; }

    • Михаил Нестеров, А не подскажите, вот у меня есть товар

      Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

      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 - ссылка по которой пытаюсь получить доступ

      Добрый день, где храняться в базе данных информация о подписках в woocomerce subscription?

      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"
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Ирина WP Ответ

    В 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 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;

    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();
    }

    $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, статусы подписок, даты, товары и суммы без привязки к внутренним таблицам.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно