PluginProbe
MxChat – AI Chatbot & Content Generation for WordPress / 2.4.6
MxChat – AI Chatbot & Content Generation for WordPress v2.4.6
3.2.21 3.2.20 3.2.19 3.2.18 3.2.17 3.2.16 3.2.15 3.2.14 3.2.12 3.2.13 3.2.11 3.2.10 3.2.9 3.2.8 3.2.7 3.2.6 3.2.5 3.2.4 3.2.3 3.2.2 3.2.1 2.0.3 2.0.4 2.0.5 2.0.6 All 152 releases
mxchat-basic / includes / class-mxchat-woocommerce.php

class-mxchat-woocommerce.php in MxChat – AI Chatbot & Content Generation for WordPress 2.4.6, at includes/class-mxchat-woocommerce.php

242 lines 7.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if (!defined('ABSPATH')) {
4 exit;
5 }
6
7 class MxChat_WooCommerce {
8
9 public static function init() {
10 add_action('wp_ajax_mxchat_fetch_user_orders', array(__CLASS__, 'mxchat_fetch_user_orders'));
11 add_action('wp_ajax_nopriv_mxchat_fetch_user_orders', array(__CLASS__, 'mxchat_fetch_user_orders'));
12
13 add_action('wp_ajax_mxchat_add_to_cart', array(__CLASS__, 'mxchat_add_to_cart'));
14 add_action('wp_ajax_nopriv_mxchat_add_to_cart', array(__CLASS__, 'mxchat_add_to_cart'));
15
16 }
17
18 // New function to handle add to cart requests
19 public static function mxchat_add_to_cart() {
20 // Validate nonce
21 if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'mxchat_nonce')) {
22 wp_send_json_error('Invalid nonce.');
23 wp_die();
24 }
25
26 $product_id = isset($_POST['product_id']) ? intval($_POST['product_id']) : 0;
27 if (!$product_id) {
28 wp_send_json_error('Invalid product ID.');
29 wp_die();
30 }
31
32 // Add to WooCommerce cart
33 $added = WC()->cart->add_to_cart($product_id);
34 if ($added) {
35 $product = wc_get_product($product_id);
36 wp_send_json_success(['message' => "The product '{$product->get_name()}' has been added to your cart."]);
37 } else {
38 wp_send_json_error('Error adding product to cart.');
39 }
40 wp_die();
41 }
42
43
44 public static function mxchat_fetch_user_orders_details($type = 'all') {
45 $user_id = get_current_user_id();
46 if (!$user_id && isset(WC()->session)) {
47 $user_id = WC()->session->get_customer_id();
48 }
49
50 if (!$user_id) {
51 return [];
52 }
53
54 $args = array(
55 'customer_id' => $user_id,
56 'limit' => ($type === 'last') ? 1 : 5, // Limit to last 5 orders for 'all'
57 'orderby' => 'date',
58 'order' => 'DESC',
59 );
60
61 $orders = wc_get_orders($args);
62
63 if (empty($orders)) {
64 return [];
65 }
66
67 $order_details = [];
68 foreach ($orders as $order) {
69 $items = [];
70 foreach ($order->get_items() as $item) {
71 $items[] = [
72 'name' => $item->get_name(),
73 'total' => $order->get_formatted_line_subtotal($item),
74 'license_key' => $item->get_meta('_license_key'), // Get specific meta if needed
75 'quantity' => $item->get_quantity()
76 ];
77 }
78
79 $order_details[] = [
80 'order_id' => $order->get_id(),
81 'date' => $order->get_date_created()->date('F j, Y'),
82 'status' => wc_get_order_status_name($order->get_status()),
83 'total' => $order->get_total(),
84 'formatted_total' => $order->get_formatted_order_total(),
85 'items' => $items
86 ];
87
88 if ($type === 'last') {
89 break;
90 }
91 }
92
93 return $order_details;
94 }
95
96
97 // Check if there are items in the cart
98 public static function cart_has_items() {
99 return WC()->cart && WC()->cart->get_cart_contents_count() > 0;
100 }
101
102 /**
103 * Extract product ID from message with advanced matching.
104 *
105 * @param string $message The search message
106 * @return int|null Product ID if found, null if no match
107 */
108 public static function mxchat_extract_product_id_from_message($message) {
109 if (!function_exists('wc_get_products')) {
110 error_log("WooCommerce is not active or not available.");
111 return null;
112 }
113
114 // Clean and normalize input
115 $message = sanitize_text_field(strtolower($message));
116 error_log("Product extraction message: " . $message);
117
118 // Get all published products
119 $products = wc_get_products([
120 'status' => 'publish',
121 'limit' => -1,
122 'return' => 'objects'
123 ]);
124
125 error_log("Total products to search: " . count($products));
126
127 // Store all matches with their scores
128 $matches = [];
129
130 // Search terms (original message and name-only version)
131 $search_terms = explode(' ', $message);
132 error_log("Search terms: " . implode(', ', $search_terms));
133
134 foreach ($products as $product) {
135 $score = 0;
136 $product_name = strtolower($product->get_name());
137 $product_slug = strtolower($product->get_slug());
138 $product_sku = strtolower($product->get_sku());
139
140 // Score calculation
141 $matched_terms = 0;
142 $consecutive_matches = 0;
143 $max_consecutive = 0;
144
145 // Check for consecutive term matches
146 for ($i = 0; $i < count($search_terms); $i++) {
147 $term = $search_terms[$i];
148
149 // Skip common words
150 if (strlen($term) <= 2 || in_array($term, ['the', 'and', 'or', 'for', 'to', 'in', 'on', 'at', 'of'])) {
151 continue;
152 }
153
154 // Check name, slug, and SKU
155 if (strpos($product_name, $term) !== false ||
156 strpos($product_slug, $term) !== false ||
157 strpos($product_sku, $term) !== false) {
158
159 $matched_terms++;
160 $consecutive_matches++;
161 $max_consecutive = max($max_consecutive, $consecutive_matches);
162 } else {
163 $consecutive_matches = 0;
164 }
165 }
166
167 // Calculate final score
168 if ($matched_terms > 0) {
169 // Base score from matched terms
170 $score = $matched_terms / count(array_filter($search_terms, function($term) {
171 return strlen($term) > 2;
172 }));
173
174 // Bonus for consecutive matches
175 $score += ($max_consecutive > 1) ? 0.3 : 0;
176
177 // Bonus for exact matches
178 if (strpos($product_name, implode(' ', $search_terms)) !== false) {
179 $score += 0.5;
180 }
181
182 // Store match if score is above zero
183 if ($score > 0) {
184 $matches[] = [
185 'product_id' => $product->get_id(),
186 'score' => $score,
187 'name' => $product_name,
188 'consecutive_matches' => $max_consecutive
189 ];
190
191 error_log(sprintf(
192 "Product '%s' scored %f with %d consecutive matches",
193 $product_name,
194 $score,
195 $max_consecutive
196 ));
197 }
198 }
199 }
200
201 // Sort matches by score
202 usort($matches, function($a, $b) {
203 if ($b['score'] === $a['score']) {
204 // If scores are equal, prefer the one with more consecutive matches
205 return $b['consecutive_matches'] - $a['consecutive_matches'];
206 }
207 return $b['score'] <=> $a['score'];
208 });
209
210 // Return the best match if we found any
211 if (!empty($matches)) {
212 $best_match = $matches[0];
213 error_log(sprintf(
214 "Selected best match: '%s' (ID: %d) with score %f and %d consecutive matches",
215 $best_match['name'],
216 $best_match['product_id'],
217 $best_match['score'],
218 $best_match['consecutive_matches']
219 ));
220 return $best_match['product_id'];
221 }
222
223 error_log("No product matches found");
224 return null;
225 }
226
227
228
229 // Store the product ID in session when discussed
230 public static function store_last_discussed_product($product_id) {
231 set_transient('mxchat_last_product', $product_id, 12 * HOUR_IN_SECONDS);
232 }
233
234 // Retrieve the last discussed product ID
235 public static function get_last_discussed_product() {
236 return get_transient('mxchat_last_product');
237 }
238
239 }
240
241 MxChat_WooCommerce::init();
242