PluginProbe
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services / 5.2.9
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services v5.2.9
8.7.8 8.7.7 8.7.6 8.7.5 8.7.4 8.7.3 8.7.2 8.7.1 8.7.0 8.6.9 8.6.8 8.6.7 8.6.6 8.6.5 8.6.4 8.6.2 8.6.1 8.6.0 8.5.9 8.5.8 8.5.7 8.5.6 8.5.5 8.5.4 8.5.3 All 534 releases
← All changes | includes/class-wpwbot-table.php +428 -456 8.7.45.2.9 View file →
@@ -1,457 +1,429 @@
1 -<?php
2 -if ( ! defined( 'ABSPATH' ) ) {
3 - exit;
4 -}
5 -if ( ! class_exists( 'wpwBot_Table' ) ) :
6 - /**
7 - * Class for plugin index table
8 - */
9 - class wpwBot_Table {
10 - /**
11 - * @var wpwBot_Table Index table name
12 - */
13 - private $table_name;
14 - /**
15 - * Constructor
16 - */
17 - public function __construct() {
18 - global $wpdb;
19 - $this->table_name = $wpdb->prefix . QCLD_wpCHATBOT_INDEX_TABLE;
20 - add_action( 'wp_insert_post', array( $this, 'update_table' ), 10, 3 );
21 -
22 - if ( defined('wpCOMMERCE_VERSION') ) {
23 - if ( version_compare( wpCOMMERCE_VERSION, '3.0', ">=" ) ) {
24 - add_action( 'wpcommerce_variable_product_sync_data', array( $this, 'variable_product_changed' ) );
25 - } else {
26 - add_action( 'wpcommerce_variable_product_sync', array( $this, 'variable_product_changed' ), 10, 2 );
27 - }
28 - }
29 -
30 - add_action( 'wp_ajax_qcld-wp-chabot-reindex', array( $this, 'reindex_table' ) );
31 - add_action( 'wp_ajax_qcld-wp-chabot-cancel-index', array( $this, 'cancel_reindex' ) );
32 - }
33 - /*
34 - * Reindex plugin table
35 - */
36 - public function reindex_table( $return) {
37 - $nonce = sanitize_text_field(wp_unslash($_POST['nonce']));
38 - if (! wp_verify_nonce($nonce,'wp_chatbot') || ! current_user_can('manage_options')) {
39 - wp_send_json(array('success' => false, 'msg' => esc_html__('Failed in Security check', 'chatbot')));
40 - wp_die();
41 -
42 - }else{
43 - global $wpdb;
44 - $index_meta = get_option( 'wp_chatbot_index_meta', false );
45 - $status = false;
46 - // No current index going on. Let's start over
47 - if ( false === $index_meta ) {
48 - $status = 'start';
49 - $index_meta = array(
50 - 'offset' => 0,
51 - 'start' => true,
52 - );
53 -
54 - // phpcs:ignore
55 - $wpdb->query("DROP TABLE IF EXISTS {$this->table_name}"); //DB Call OK
56 -
57 - $this->create_table();
58 -
59 - $index_meta['found_posts'] = $this->get_number_of_products();
60 - } else if ( ! empty( $index_meta['site_stack'] ) && $index_meta['offset'] >= $index_meta['found_posts'] ) {
61 - $status = 'start';
62 - $index_meta['start'] = true;
63 - $index_meta['offset'] = 0;
64 - $index_meta['current_site'] = array_shift( $index_meta['site_stack'] );
65 - } else {
66 - $index_meta['start'] = false;
67 - }
68 - $index_meta = apply_filters( 'wp_chatbot_index_meta', $index_meta );
69 - $posts_per_page = apply_filters( 'wp_chatbot_index_posts_per_page', 30 );
70 - $args = array(
71 - 'posts_per_page' => $posts_per_page,
72 - 'fields' => 'ids',
73 - 'post_type' => 'product',
74 - 'post_status' => 'publish',
75 - 'offset' => $index_meta['offset'],
76 - 'ignore_sticky_posts' => true,
77 - 'suppress_filters' => true,
78 - 'no_found_rows' => 1,
79 - 'orderby' => 'ID',
80 - 'order' => 'DESC',
81 - );
82 - $posts = get_posts( $args );
83 - if ( $status !== 'start' ) {
84 - if ( $posts && count( $posts ) > 0 ) {
85 - $queued_posts = array();
86 - foreach( $posts as $post_id ) {
87 - $queued_posts[] = absint( $post_id );
88 - }
89 - $this->fill_table( $queued_posts );
90 - $index_meta['offset'] = absint( $index_meta['offset'] + $posts_per_page );
91 - if ( $index_meta['offset'] >= $index_meta['found_posts'] ) {
92 - $index_meta['offset'] = $index_meta['found_posts'];
93 - }
94 - update_option( 'wp_chatbot_index_meta', $index_meta );
95 - } else {
96 - // We are done (with this site)
97 - $index_meta['offset'] = (int) count( $posts );
98 - delete_option( 'wp_chatbot_index_meta' );
99 - update_option( 'wp_chatbot_index_count', 1 );
100 - }
101 - } else {
102 - update_option( 'wp_chatbot_index_meta', $index_meta );
103 - }
104 - if ( $return ) {
105 - return $index_meta;
106 - } else {
107 - wp_send_json_success( $index_meta );
108 - }
109 - }
110 - }
111 - /*
112 - * Get total number of products
113 - */
114 - private function get_number_of_products() {
115 - $args = array(
116 - 'posts_per_page' => -1,
117 - 'fields' => 'ids',
118 - 'post_type' => 'product',
119 - 'post_status' => 'publish',
120 - 'ignore_sticky_posts' => true,
121 - 'suppress_filters' => true,
122 - 'no_found_rows' => 1,
123 - 'orderby' => 'ID',
124 - 'order' => 'DESC',
125 - );
126 - $posts = get_posts( $args );
127 - if ( $posts && count( $posts ) > 0 ) {
128 - $count = count( $posts );
129 - } else {
130 - $count = 0;
131 - }
132 - return $count;
133 - }
134 - /*
135 - * Check if index table exist
136 - */
137 - private function is_table_not_exist() {
138 - global $wpdb;
139 - return ( $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $wpdb->esc_like( $this->table_name ) ) ) != $this->table_name ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
140 - }
141 - /*
142 - * Create index table
143 - */
144 - private function create_table() {
145 - global $wpdb;
146 - $charset_collate = $wpdb->get_charset_collate();
147 - $sql = "CREATE TABLE {$this->table_name} (
148 - id BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
149 - term VARCHAR(50) NOT NULL DEFAULT 0,
150 - term_source VARCHAR(20) NOT NULL DEFAULT 0,
151 - type VARCHAR(50) NOT NULL DEFAULT 0,
152 - count BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
153 - in_stock INT(11) NOT NULL DEFAULT 0,
154 - visibility VARCHAR(20) NOT NULL DEFAULT 0,
155 - lang VARCHAR(20) NOT NULL DEFAULT 0
156 - ) $charset_collate;";
157 - require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
158 - dbDelta( $sql );
159 -
160 - $table_report = $wpdb->prefix . 'wpbot_chat_report';
161 -
162 - if ( $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $wpdb->esc_like( $table_report ) ) ) != $table_report ) { // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange
163 - // phpcs:disable WordPress.DB.DirectDatabaseQuery.SchemaChange
164 - $sql_report = "
165 - CREATE TABLE `$table_report` (
166 - `id` int(11) NOT NULL AUTO_INCREMENT,
167 - `user_id` int(11) NOT NULL,
168 - `conversation_id` int(11) DEFAULT NULL,
169 - `message` longtext NOT NULL,
170 - `feedback` varchar(20) DEFAULT NULL,
171 - `meta_info` text DEFAULT NULL,
172 - `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
173 - PRIMARY KEY (`id`)
174 - ) $charset_collate AUTO_INCREMENT=1;
175 - ";
176 - // phpcs:enable WordPress.DB.DirectDatabaseQuery.SchemaChange
177 -
178 - require_once ABSPATH . 'wp-admin/includes/upgrade.php';
179 - dbDelta( $sql_report );
180 - }
181 - }
182 - /*
183 - * Insert data into the index table
184 - */
185 - private function fill_table( $posts ) {
186 -
187 - }
188 - /*
189 - * Scrap all product data and insert to table
190 - */
191 - private function insert_into_table( $data ) {
192 - global $wpdb;
193 - $values = array();
194 - foreach( $data['terms'] as $source => $all_terms ) {
195 - foreach ( $all_terms as $term => $count ) {
196 - if ( ! $term ) {
197 - continue;
198 - }
199 - $value = $wpdb->prepare(
200 - "(%d, %s, %s, %s, %d, %d, %s, %s)",
201 - $data['id'], $term, $source, 'product', $count, $data['in_stock'], $data['visibility'], $data['lang']
202 - );
203 - $values[] = $value;
204 - }
205 - }
206 - if ( count( $values ) > 0 ) {
207 - $values = implode( ', ', $values );
208 - $query = "INSERT IGNORE INTO {$this->table_name}
209 - (`id`, `term`, `term_source`, `type`, `count`, `in_stock`, `visibility`, `lang`)
210 - VALUES $values
211 - ";
212 - $wpdb->query( $query ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared
213 - }
214 - }
215 - /*
216 - * Update index table
217 - */
218 - public function update_table( $post_id, $post, $update ) {
219 - global $wpdb;
220 - if ( $this->is_table_not_exist() ) {
221 - $this->create_table();
222 - }
223 - $slug = 'product';
224 - if ( $slug != $post->post_type ) {
225 - return;
226 - }
227 - $wpdb->delete( $this->table_name, array( 'id' => $post_id ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
228 - $posts = get_posts( array(
229 - 'posts_per_page' => -1,
230 - 'fields' => 'ids',
231 - 'post_type' => 'product',
232 - 'post_status' => 'publish',
233 - 'suppress_filters' => false,
234 - 'no_found_rows' => 1,
235 - 'include' => $post_id
236 - ) );
237 - $this->fill_table( $posts );
238 - }
239 - /*
240 - * Fires when products terms are changed
241 - */
242 - public function term_changed( $term_id, $tt_id, $taxonomy ) {
243 - if ( $taxonomy === 'product_cat' || $taxonomy === 'product_tag' ) {
244 - }
245 - }
246 - /*
247 - * Fires when products variations are changed
248 - */
249 - public function variable_product_changed( $product, $children = null ) {
250 - global $wpdb;
251 - $product_id = '';
252 -
253 - if ( $this->is_table_not_exist() ) {
254 - $this->create_table();
255 - }
256 -
257 - if ( is_object( $product ) ) {
258 - $product_id = $product->get_id();
259 - } else {
260 - $product_id = $product;
261 - }
262 -
263 - $wpdb->delete( $this->table_name, array( 'id' => $product_id ) ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
264 -
265 - $posts = get_posts( array(
266 - 'posts_per_page' => -1,
267 - 'fields' => 'ids',
268 - 'post_type' => 'product',
269 - 'post_status' => 'publish',
270 - 'suppress_filters' => false,
271 - 'no_found_rows' => 1,
272 - 'include' => $product_id
273 - ) );
274 - $this->fill_table( $posts );
275 - }
276 - /*
277 - * Cancel index
278 - */
279 - public function cancel_reindex() {
280 - $nonce = sanitize_text_field(wp_unslash($_POST['nonce']));
281 - if (! wp_verify_nonce($nonce,'wp_chatbot') || ! current_user_can('manage_options')) {
282 - wp_send_json(array('success' => false, 'msg' => esc_html__('Failed in Security check', 'chatbot')));
283 - wp_die();
284 -
285 - }else{
286 - delete_option( 'wp_chatbot_index_meta' );
287 - wp_send_json_success( 'Deleted!' );
288 - }
289 - }
290 - /*
291 - * Strip shortcodes
292 - */
293 - private function strip_shortcodes( $content ) {
294 - $content = preg_replace( '#\[[^\]]+\]#', '', $content );
295 - return $content;
296 - }
297 - /*
298 - * Extract terms from content
299 - */
300 - private function extract_terms( $str ) {
301 - $stopwords = str_replace('\\', '', get_option('qlcd_wp_chatbot_stop_words'));
302 - $str = $this->html2txt( $str );
303 - // Avoid single A-Z.
304 -
305 - $special_cars = $this->get_special_chars();
306 - $str = str_replace( $special_cars, "", $str );
307 - $str = str_replace( array(
308 - "ˇ",
309 - "°",
310 - "Ë›",
311 - "Ëť",
312 - "¸",
313 - "§",
314 - "=",
315 - "¨",
316 - "’",
317 - "‘",
318 - "”",
319 - "“",
320 - "„",
321 - "´",
322 - "—",
323 - "–",
324 - "Ă—",
325 - '&#8217;',
326 - "&nbsp;",
327 - chr( 194 ) . chr( 160 )
328 - ), " ", $str );
329 - $str = str_replace( 'Ăź', 'ss', $str );
330 - $str = preg_replace( '/[[:space:]]+/', ' ', $str );
331 - // Most objects except unicode characters
332 - $str = preg_replace( '/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\x9F]/u', '', $str );
333 - // Line feeds, carriage returns, tabs
334 - $str = preg_replace( '/[\x00-\x1F\x80-\x9F]/u', '', $str );
335 - if ( function_exists( 'mb_strtolower' ) ) {
336 - $str = mb_strtolower( $str );
337 - } else {
338 - $str = strtolower( $str );
339 - }
340 - $str = preg_replace( '/^[a-z]$/i', "", $str );
341 - $str = trim( preg_replace( '/\s+/', ' ', $str ) );
342 - $str_array = array_count_values( explode( ' ', $str ) );
343 - if ( $stopwords && $str_array && ! empty( $str_array ) ) {
344 - $stopwords_array = explode( ',', $stopwords );
345 - if ( $stopwords_array && ! empty( $stopwords_array ) ) {
346 - $stopwords_array = array_map( 'trim', $stopwords_array );
347 - foreach ( $str_array as $str_word => $str_count ) {
348 - if ( in_array( $str_word, $stopwords_array ) ) {
349 - unset( $str_array[$str_word] );
350 - }
351 - }
352 - }
353 - }
354 - return $str_array;
355 - }
356 - /*
357 - * Removes scripts, styles, html tags
358 - */
359 - public function html2txt( $str ) {
360 - $search = array(
361 - '@<script[^>]*?>.*?</script>@si',
362 - '@<[\/\!]*?[^<>]*?>@si',
363 - '@<style[^>]*?>.*?</style>@siU',
364 - '@<![\s\S]*?--[ \t\n\r]*>@'
365 - );
366 - $str = preg_replace( $search, '', $str );
367 - $str = esc_attr( $str );
368 - $str = stripslashes( $str );
369 - $str = str_replace( array( "\r", "\n" ), ' ', $str );
370 - $str = str_replace( array(
371 - "·",
372 - "…",
373 - "€",
374 - "&shy;"
375 - ), "", $str );
376 - return $str;
377 - }
378 - /*
379 - * Get special characters that must be striped
380 - */
381 - public function get_special_chars() {
382 - $chars = array(
383 - '-',
384 - '_',
385 - '|',
386 - '+',
387 - '`',
388 - '~',
389 - '!',
390 - '@',
391 - '#',
392 - '$',
393 - '%',
394 - '^',
395 - '&',
396 - '*',
397 - '(',
398 - ')',
399 - '\\',
400 - '?',
401 - ';',
402 - ':',
403 - "'",
404 - '"',
405 - ".",
406 - ",",
407 - "<",
408 - ">",
409 - "{",
410 - "}",
411 - "/",
412 - "[",
413 - "]",
414 - );
415 - return apply_filters( 'wp_chatbot_special_chars', $chars );
416 - }
417 - /*
418 - * Get string with current product terms ids
419 - *
420 - * @return string List of terms ids
421 - */
422 - private function get_terms_list( $id, $taxonomy ) {
423 - $terms = get_the_terms( $id, $taxonomy );
424 - if ( is_wp_error( $terms ) ) {
425 - return '';
426 - }
427 - if ( empty( $terms ) ) {
428 - return '';
429 - }
430 - $cats_array_temp = array();
431 - foreach ( $terms as $term ) {
432 - $cats_array_temp[] = $term->term_id;
433 - }
434 - return implode( ', ', $cats_array_temp );
435 - }
436 - /*
437 - * Get string with current product terms names
438 - *
439 - * @return string List of terms names
440 - */
441 - private function get_terms_names_list( $id, $taxonomy ) {
442 - $terms = get_the_terms( $id, $taxonomy );
443 - if ( is_wp_error( $terms ) ) {
444 - return '';
445 - }
446 - if ( empty( $terms ) ) {
447 - return '';
448 - }
449 - $cats_array_temp = array();
450 - foreach ( $terms as $term ) {
451 - $cats_array_temp[] = $term->name;
452 - }
453 - return implode( ', ', $cats_array_temp );
454 - }
455 - }
456 -endif;
1 +<?php
2 +if ( ! defined( 'ABSPATH' ) ) {
3 + exit;
4 +}
5 +if ( ! class_exists( 'wpwBot_Table' ) ) :
6 + /**
7 + * Class for plugin index table
8 + */
9 + class wpwBot_Table {
10 + /**
11 + * @var wpwBot_Table Index table name
12 + */
13 + private $table_name;
14 + /**
15 + * Constructor
16 + */
17 + public function __construct() {
18 + global $wpdb;
19 + $this->table_name = $wpdb->prefix . QCLD_wpCHATBOT_INDEX_TABLE;
20 + add_action( 'wp_insert_post', array( $this, 'update_table' ), 10, 3 );
21 +
22 + if ( defined('wpCOMMERCE_VERSION') ) {
23 + if ( version_compare( wpCOMMERCE_VERSION, '3.0', ">=" ) ) {
24 + add_action( 'wpcommerce_variable_product_sync_data', array( $this, 'variable_product_changed' ) );
25 + } else {
26 + add_action( 'wpcommerce_variable_product_sync', array( $this, 'variable_product_changed' ), 10, 2 );
27 + }
28 + }
29 +
30 + add_action( 'wp_ajax_qcld-wp-chabot-reindex', array( $this, 'reindex_table' ) );
31 + add_action( 'wp_ajax_qcld-wp-chabot-cancel-index', array( $this, 'cancel_reindex' ) );
32 + }
33 + /*
34 + * Reindex plugin table
35 + */
36 + public function reindex_table( $return) {
37 + $nonce = sanitize_text_field($_POST['nonce']);
38 + if (! wp_verify_nonce($nonce,'wp_chatbot')) {
39 + wp_send_json(array('success' => false, 'msg' => esc_html__('Failed in Security check', 'sm')));
40 + wp_die();
41 +
42 + }else{
43 + global $wpdb;
44 + $index_meta = get_option( 'wp_chatbot_index_meta', false );
45 + $status = false;
46 + // No current index going on. Let's start over
47 + if ( false === $index_meta ) {
48 + $status = 'start';
49 + $index_meta = array(
50 + 'offset' => 0,
51 + 'start' => true,
52 + );
53 + $wpdb->query("DROP TABLE IF EXISTS {$this->table_name}");
54 + $this->create_table();
55 + $index_meta['found_posts'] = $this->get_number_of_products();
56 + } else if ( ! empty( $index_meta['site_stack'] ) && $index_meta['offset'] >= $index_meta['found_posts'] ) {
57 + $status = 'start';
58 + $index_meta['start'] = true;
59 + $index_meta['offset'] = 0;
60 + $index_meta['current_site'] = array_shift( $index_meta['site_stack'] );
61 + } else {
62 + $index_meta['start'] = false;
63 + }
64 + $index_meta = apply_filters( 'wp_chatbot_index_meta', $index_meta );
65 + $posts_per_page = apply_filters( 'wp_chatbot_index_posts_per_page', 30 );
66 + $args = array(
67 + 'posts_per_page' => $posts_per_page,
68 + 'fields' => 'ids',
69 + 'post_type' => 'product',
70 + 'post_status' => 'publish',
71 + 'offset' => $index_meta['offset'],
72 + 'ignore_sticky_posts' => true,
73 + 'suppress_filters' => true,
74 + 'no_found_rows' => 1,
75 + 'orderby' => 'ID',
76 + 'order' => 'DESC',
77 + );
78 + $posts = get_posts( $args );
79 + if ( $status !== 'start' ) {
80 + if ( $posts && count( $posts ) > 0 ) {
81 + $queued_posts = array();
82 + foreach( $posts as $post_id ) {
83 + $queued_posts[] = absint( $post_id );
84 + }
85 + $this->fill_table( $queued_posts );
86 + $index_meta['offset'] = absint( $index_meta['offset'] + $posts_per_page );
87 + if ( $index_meta['offset'] >= $index_meta['found_posts'] ) {
88 + $index_meta['offset'] = $index_meta['found_posts'];
89 + }
90 + update_option( 'wp_chatbot_index_meta', $index_meta );
91 + } else {
92 + // We are done (with this site)
93 + $index_meta['offset'] = (int) count( $posts );
94 + delete_option( 'wp_chatbot_index_meta' );
95 + update_option( 'wp_chatbot_index_count', 1 );
96 + }
97 + } else {
98 + update_option( 'wp_chatbot_index_meta', $index_meta );
99 + }
100 + if ( $return ) {
101 + return $index_meta;
102 + } else {
103 + wp_send_json_success( $index_meta );
104 + }
105 + }
106 + }
107 + /*
108 + * Get total number of products
109 + */
110 + private function get_number_of_products() {
111 + $args = array(
112 + 'posts_per_page' => -1,
113 + 'fields' => 'ids',
114 + 'post_type' => 'product',
115 + 'post_status' => 'publish',
116 + 'ignore_sticky_posts' => true,
117 + 'suppress_filters' => true,
118 + 'no_found_rows' => 1,
119 + 'orderby' => 'ID',
120 + 'order' => 'DESC',
121 + );
122 + $posts = get_posts( $args );
123 + if ( $posts && count( $posts ) > 0 ) {
124 + $count = count( $posts );
125 + } else {
126 + $count = 0;
127 + }
128 + return $count;
129 + }
130 + /*
131 + * Check if index table exist
132 + */
133 + private function is_table_not_exist() {
134 + global $wpdb;
135 + return ( $wpdb->get_var( "SHOW TABLES LIKE '{$this->table_name}'" ) != $this->table_name );
136 + }
137 + /*
138 + * Create index table
139 + */
140 + private function create_table() {
141 + global $wpdb;
142 + $charset_collate = $wpdb->get_charset_collate();
143 + $sql = "CREATE TABLE {$this->table_name} (
144 + id BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
145 + term VARCHAR(50) NOT NULL DEFAULT 0,
146 + term_source VARCHAR(20) NOT NULL DEFAULT 0,
147 + type VARCHAR(50) NOT NULL DEFAULT 0,
148 + count BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
149 + in_stock INT(11) NOT NULL DEFAULT 0,
150 + visibility VARCHAR(20) NOT NULL DEFAULT 0,
151 + lang VARCHAR(20) NOT NULL DEFAULT 0
152 + ) $charset_collate;";
153 + require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
154 + dbDelta( $sql );
155 + }
156 + /*
157 + * Insert data into the index table
158 + */
159 + private function fill_table( $posts ) {
160 +
161 + }
162 + /*
163 + * Scrap all product data and insert to table
164 + */
165 + private function insert_into_table( $data ) {
166 + global $wpdb;
167 + $values = array();
168 + foreach( $data['terms'] as $source => $all_terms ) {
169 + foreach ( $all_terms as $term => $count ) {
170 + if ( ! $term ) {
171 + continue;
172 + }
173 + $value = $wpdb->prepare(
174 + "(%d, %s, %s, %s, %d, %d, %s, %s)",
175 + $data['id'], $term, $source, 'product', $count, $data['in_stock'], $data['visibility'], $data['lang']
176 + );
177 + $values[] = $value;
178 + }
179 + }
180 + if ( count( $values ) > 0 ) {
181 + $values = implode( ', ', $values );
182 + $query = "INSERT IGNORE INTO {$this->table_name}
183 + (`id`, `term`, `term_source`, `type`, `count`, `in_stock`, `visibility`, `lang`)
184 + VALUES $values
185 + ";
186 + $wpdb->query( $query );
187 + }
188 + }
189 + /*
190 + * Update index table
191 + */
192 + public function update_table( $post_id, $post, $update ) {
193 + global $wpdb;
194 + if ( $this->is_table_not_exist() ) {
195 + $this->create_table();
196 + }
197 + $slug = 'product';
198 + if ( $slug != $post->post_type ) {
199 + return;
200 + }
201 + $wpdb->delete( $this->table_name, array( 'id' => $post_id ) );
202 + $posts = get_posts( array(
203 + 'posts_per_page' => -1,
204 + 'fields' => 'ids',
205 + 'post_type' => 'product',
206 + 'post_status' => 'publish',
207 + 'suppress_filters' => false,
208 + 'no_found_rows' => 1,
209 + 'include' => $post_id
210 + ) );
211 + $this->fill_table( $posts );
212 + }
213 + /*
214 + * Fires when products terms are changed
215 + */
216 + public function term_changed( $term_id, $tt_id, $taxonomy ) {
217 + if ( $taxonomy === 'product_cat' || $taxonomy === 'product_tag' ) {
218 + }
219 + }
220 + /*
221 + * Fires when products variations are changed
222 + */
223 + public function variable_product_changed( $product, $children = null ) {
224 + global $wpdb;
225 + $product_id = '';
226 +
227 + if ( $this->is_table_not_exist() ) {
228 + $this->create_table();
229 + }
230 +
231 + if ( is_object( $product ) ) {
232 + $product_id = $product->get_id();
233 + } else {
234 + $product_id = $product;
235 + }
236 + $wpdb->delete( $this->table_name, array( 'id' => $product_id ) );
237 + $posts = get_posts( array(
238 + 'posts_per_page' => -1,
239 + 'fields' => 'ids',
240 + 'post_type' => 'product',
241 + 'post_status' => 'publish',
242 + 'suppress_filters' => false,
243 + 'no_found_rows' => 1,
244 + 'include' => $product_id
245 + ) );
246 + $this->fill_table( $posts );
247 + }
248 + /*
249 + * Cancel index
250 + */
251 + public function cancel_reindex() {
252 + $nonce = sanitize_text_field($_POST['nonce']);
253 + if (! wp_verify_nonce($nonce,'wp_chatbot')) {
254 + wp_send_json(array('success' => false, 'msg' => esc_html__('Failed in Security check', 'sm')));
255 + wp_die();
256 +
257 + }else{
258 + delete_option( 'wp_chatbot_index_meta' );
259 + wp_send_json_success( 'Deleted!' );
260 + }
261 + }
262 + /*
263 + * Strip shortcodes
264 + */
265 + private function strip_shortcodes( $content ) {
266 + $content = preg_replace( '#\[[^\]]+\]#', '', $content );
267 + return $content;
268 + }
269 + /*
270 + * Extract terms from content
271 + */
272 + private function extract_terms( $str ) {
273 + $stopwords = str_replace('\\', '', get_option('qlcd_wp_chatbot_stop_words'));
274 + $str = $this->html2txt( $str );
275 + // Avoid single A-Z.
276 +
277 + $special_cars = $this->get_special_chars();
278 + $str = str_replace( $special_cars, "", $str );
279 + $str = str_replace( array(
280 + "ˇ",
281 + "°",
282 + "Ë›",
283 + "Ëť",
284 + "¸",
285 + "§",
286 + "=",
287 + "¨",
288 + "’",
289 + "‘",
290 + "”",
291 + "“",
292 + "„",
293 + "´",
294 + "—",
295 + "–",
296 + "Ă—",
297 + '&#8217;',
298 + "&nbsp;",
299 + chr( 194 ) . chr( 160 )
300 + ), " ", $str );
301 + $str = str_replace( 'Ăź', 'ss', $str );
302 + $str = preg_replace( '/[[:space:]]+/', ' ', $str );
303 + // Most objects except unicode characters
304 + $str = preg_replace( '/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\x9F]/u', '', $str );
305 + // Line feeds, carriage returns, tabs
306 + $str = preg_replace( '/[\x00-\x1F\x80-\x9F]/u', '', $str );
307 + if ( function_exists( 'mb_strtolower' ) ) {
308 + $str = mb_strtolower( $str );
309 + } else {
310 + $str = strtolower( $str );
311 + }
312 + $str = preg_replace( '/^[a-z]$/i', "", $str );
313 + $str = trim( preg_replace( '/\s+/', ' ', $str ) );
314 + $str_array = array_count_values( explode( ' ', $str ) );
315 + if ( $stopwords && $str_array && ! empty( $str_array ) ) {
316 + $stopwords_array = explode( ',', $stopwords );
317 + if ( $stopwords_array && ! empty( $stopwords_array ) ) {
318 + $stopwords_array = array_map( 'trim', $stopwords_array );
319 + foreach ( $str_array as $str_word => $str_count ) {
320 + if ( in_array( $str_word, $stopwords_array ) ) {
321 + unset( $str_array[$str_word] );
322 + }
323 + }
324 + }
325 + }
326 + return $str_array;
327 + }
328 + /*
329 + * Removes scripts, styles, html tags
330 + */
331 + public function html2txt( $str ) {
332 + $search = array(
333 + '@<script[^>]*?>.*?</script>@si',
334 + '@<[\/\!]*?[^<>]*?>@si',
335 + '@<style[^>]*?>.*?</style>@siU',
336 + '@<![\s\S]*?--[ \t\n\r]*>@'
337 + );
338 + $str = preg_replace( $search, '', $str );
339 + $str = esc_attr( $str );
340 + $str = stripslashes( $str );
341 + $str = str_replace( array( "\r", "\n" ), ' ', $str );
342 + $str = str_replace( array(
343 + "·",
344 + "…",
345 + "€",
346 + "&shy;"
347 + ), "", $str );
348 + return $str;
349 + }
350 + /*
351 + * Get special characters that must be striped
352 + */
353 + public function get_special_chars() {
354 + $chars = array(
355 + '-',
356 + '_',
357 + '|',
358 + '+',
359 + '`',
360 + '~',
361 + '!',
362 + '@',
363 + '#',
364 + '$',
365 + '%',
366 + '^',
367 + '&',
368 + '*',
369 + '(',
370 + ')',
371 + '\\',
372 + '?',
373 + ';',
374 + ':',
375 + "'",
376 + '"',
377 + ".",
378 + ",",
379 + "<",
380 + ">",
381 + "{",
382 + "}",
383 + "/",
384 + "[",
385 + "]",
386 + );
387 + return apply_filters( 'wp_chatbot_special_chars', $chars );
388 + }
389 + /*
390 + * Get string with current product terms ids
391 + *
392 + * @return string List of terms ids
393 + */
394 + private function get_terms_list( $id, $taxonomy ) {
395 + $terms = get_the_terms( $id, $taxonomy );
396 + if ( is_wp_error( $terms ) ) {
397 + return '';
398 + }
399 + if ( empty( $terms ) ) {
400 + return '';
401 + }
402 + $cats_array_temp = array();
403 + foreach ( $terms as $term ) {
404 + $cats_array_temp[] = $term->term_id;
405 + }
406 + return implode( ', ', $cats_array_temp );
407 + }
408 + /*
409 + * Get string with current product terms names
410 + *
411 + * @return string List of terms names
412 + */
413 + private function get_terms_names_list( $id, $taxonomy ) {
414 + $terms = get_the_terms( $id, $taxonomy );
415 + if ( is_wp_error( $terms ) ) {
416 + return '';
417 + }
418 + if ( empty( $terms ) ) {
419 + return '';
420 + }
421 + $cats_array_temp = array();
422 + foreach ( $terms as $term ) {
423 + $cats_array_temp[] = $term->name;
424 + }
425 + return implode( ', ', $cats_array_temp );
426 + }
427 + }
428 +endif;
457 429 new wpwBot_Table();