function mk_book_get_or_create_completed_order($user, $email, $first, $source) { $order = mk_book_find_order($user->ID, $email); if ($order) { return mk_book_ensure_completed($order); } $product = wc_get_product(MK_BOOK_PRODUCT_ID); if (!$product) { return new WP_Error('mk_no_product', 'Product not found.', ['status' => 404]); } $order = wc_create_order([ 'customer_id' => $user->ID, 'status' => 'pending', ]); if (!$order || is_wp_error($order)) { return new WP_Error('mk_order', 'Order create failed.', ['status' => 500]); } $order->add_product($product, 1); $order->set_billing_first_name($first ?: $user->first_name); $order->set_billing_email($email); $order->set_payment_method('mk_free_book'); $order->set_payment_method_title('MK free book'); $order->set_transaction_id('MKBOOK-' . $user->ID . '-' . time()); $order->set_date_paid(current_time('mysql')); $order->add_order_note('Book access. Source: ' . $source); $order->calculate_totals(); $order->save(); return mk_book_ensure_completed($order); } function mk_book_ensure_completed($order) { $id = $order->get_id(); if (!in_array($order->get_status(), ['completed', 'processing'], true)) { add_filter('pre_wp_mail', '__return_true', 99999); try { $txn = $order->get_transaction_id(); if (!$txn) { $txn = 'MKBOOK-' . $id . '-' . time(); } $order->payment_complete($txn); } catch (Throwable $e) { mk_book_log('PAYMENT_ERR ' . $e->getMessage()); $order->set_status('completed'); $order->save(); } remove_filter('pre_wp_mail', '__return_true', 99999); } $order = wc_get_order($id); if (!$order) { return new WP_Error('mk_order_lost', 'Order lost.', ['status' => 500]); } if (!$order->get_downloadable_items()) { foreach ($order->get_items() as $item) { $product = $item->get_product(); if ($product && $product->is_downloadable()) { foreach ($product->get_downloads() as $download_id => $file) { if (function_exists('wc_downloadable_file_permission')) { wc_downloadable_file_permission($download_id, $product, $order); } } } } $order = wc_get_order($id); } return $order; } function mk_book_find_order($user_id, $email) { foreach ([['customer_id' => $user_id], ['billing_email' => $email]] as $q) { $ids = wc_get_orders(array_merge($q, [ 'status' => ['pending', 'processing', 'completed'], 'limit' => 10, 'return' => 'ids', ])); if (!is_array($ids)) { continue; } foreach ($ids as $id) { $o = wc_get_order((int) $id); if ($o && mk_book_order_has_product($o)) { return $o; } } } return false; } function mk_book_order_has_product($order) { foreach ($order->get_items() as $item) { if ((int) $item->get_product_id() === MK_BOOK_PRODUCT_ID) { return true; } } return false; } function mk_book_get_or_create_user($email, $first, $last) { $user = get_user_by('email', $email); if ($user) { if ($first && empty($user->first_name)) { wp_update_user(['ID' => $user->ID, 'first_name' => $first]); } if ($last && empty($user->last_name)) { wp_update_user(['ID' => $user->ID, 'last_name' => $last]); } if (!in_array('customer', (array) $user->roles, true) && !in_array('administrator', (array) $user->roles, true)) { $user->add_role('customer'); } return $user; } $part = strtok($email, '@'); $base = sanitize_user(is_string($part) ? $part : '', true); if (!$base) { $base = 'mkbook' . substr(md5($email), 0, 6); } $login = $base; $i = 1; while (username_exists($login)) { $login = $base . $i; $i++; if ($i > 50) { $login = $base . '_' . substr(md5($email . microtime()), 0, 8); break; } } $user_id = wp_insert_user([ 'user_login' => $login, 'user_pass' => wp_generate_password(24, true, true), 'user_email' => $email, 'first_name' => $first, 'last_name' => $last, 'role' => 'customer', ]); if (is_wp_error($user_id)) { return $user_id; } return get_userdata($user_id); } function mk_book_schedule_bg($user_id, $order_id) { $user_id = (int) $user_id; $order_id = (int) $order_id; if (function_exists('as_schedule_single_action')) { as_schedule_single_action(time() + 5, MK_BOOK_BG, [$user_id, $order_id], 'mk-book'); return; } if (!wp_next_scheduled(MK_BOOK_BG, [$user_id, $order_id])) { wp_schedule_single_event(time() + 5, MK_BOOK_BG, [$user_id, $order_id]); } } function mk_book_background_emails($user_id, $order_id) { $user = get_userdata((int) $user_id); $order = wc_get_order((int) $order_id); if (!$user || !$order) { return; } $items = $order->get_downloadable_items(); $url = $items ? ($items[0]['download_url'] ?? '') : ''; if (!$url) { return; } $name = trim($user->first_name . ' ' . $user->last_name); if ($name === '') { $name = $user->user_email; } $subject = 'Ваша книга: Введение в энерготерапию'; $message = "Здравствуйте, {$name}!\n\nВаша книга «Введение в энерготерапию»:\n{$url}\n\nСсылка действует для вашего заказа."; $headers = ['Content-Type: text/plain; charset=UTF-8']; wp_mail($user->user_email, $subject, $message, $headers); mk_book_log('BG_MAIL_SENT order=' . $order_id); } function mk_book_search($data, array $keys, $depth = 0) { if ($depth > 5 || !is_array($data)) { return ''; } foreach ($keys as $key) { if (isset($data[$key]) && (is_string($data[$key]) || is_numeric($data[$key]))) { return (string) $data[$key]; } } foreach ($data as $value) { if (is_array($value)) { $found = mk_book_search($value, $keys, $depth + 1); if ($found !== '') { return $found; } } } return ''; } function mk_book_log($message) { @file_put_contents( WP_CONTENT_DIR . '/uploads/' . MK_BOOK_LOG, date('c') . ' MK_BOOK_GRANT: ' . $message . PHP_EOL, FILE_APPEND ); } https://natalialadica.ru/post-sitemap.xml 2026-05-25T03:56:58+00:00 https://natalialadica.ru/page-sitemap.xml 2026-10-07T12:15:35+00:00 https://natalialadica.ru/product-sitemap.xml 2026-10-06T18:35:58+00:00 https://natalialadica.ru/courses-sitemap.xml 2026-10-02T12:36:22+00:00 https://natalialadica.ru/class-sitemap.xml 2026-08-06T19:53:12+00:00