PluginProbe
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services / 6.6.0
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services v6.6.0
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 8.5.2 All 533 releases
chatbot / includes / class-wpwbot-table.php

class-wpwbot-table.php in WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services 6.6.0, at includes/class-wpwbot-table.php

435 lines 16.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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
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( "SHOW TABLES LIKE '{$this->table_name}'" ) != $this->table_name ); //DB Call OK, No Caching OK
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 /*
161 * Insert data into the index table
162 */
163 private function fill_table( $posts ) {
164
165 }
166 /*
167 * Scrap all product data and insert to table
168 */
169 private function insert_into_table( $data ) {
170 global $wpdb;
171 $values = array();
172 foreach( $data['terms'] as $source => $all_terms ) {
173 foreach ( $all_terms as $term => $count ) {
174 if ( ! $term ) {
175 continue;
176 }
177 $value = $wpdb->prepare(
178 "(%d, %s, %s, %s, %d, %d, %s, %s)",
179 $data['id'], $term, $source, 'product', $count, $data['in_stock'], $data['visibility'], $data['lang']
180 );
181 $values[] = $value;
182 }
183 }
184 if ( count( $values ) > 0 ) {
185 $values = implode( ', ', $values );
186 $query = "INSERT IGNORE INTO {$this->table_name}
187 (`id`, `term`, `term_source`, `type`, `count`, `in_stock`, `visibility`, `lang`)
188 VALUES $values
189 ";
190 $wpdb->query( $query ); //DB Call OK, No Caching OK
191 }
192 }
193 /*
194 * Update index table
195 */
196 public function update_table( $post_id, $post, $update ) {
197 global $wpdb;
198 if ( $this->is_table_not_exist() ) {
199 $this->create_table();
200 }
201 $slug = 'product';
202 if ( $slug != $post->post_type ) {
203 return;
204 }
205 $wpdb->delete( $this->table_name, array( 'id' => $post_id ) ); //DB Call OK, No Caching OK
206 $posts = get_posts( array(
207 'posts_per_page' => -1,
208 'fields' => 'ids',
209 'post_type' => 'product',
210 'post_status' => 'publish',
211 'suppress_filters' => false,
212 'no_found_rows' => 1,
213 'include' => $post_id
214 ) );
215 $this->fill_table( $posts );
216 }
217 /*
218 * Fires when products terms are changed
219 */
220 public function term_changed( $term_id, $tt_id, $taxonomy ) {
221 if ( $taxonomy === 'product_cat' || $taxonomy === 'product_tag' ) {
222 }
223 }
224 /*
225 * Fires when products variations are changed
226 */
227 public function variable_product_changed( $product, $children = null ) {
228 global $wpdb;
229 $product_id = '';
230
231 if ( $this->is_table_not_exist() ) {
232 $this->create_table();
233 }
234
235 if ( is_object( $product ) ) {
236 $product_id = $product->get_id();
237 } else {
238 $product_id = $product;
239 }
240
241 $wpdb->delete( $this->table_name, array( 'id' => $product_id ) ); //DB Call OK, No Caching OK
242
243 $posts = get_posts( array(
244 'posts_per_page' => -1,
245 'fields' => 'ids',
246 'post_type' => 'product',
247 'post_status' => 'publish',
248 'suppress_filters' => false,
249 'no_found_rows' => 1,
250 'include' => $product_id
251 ) );
252 $this->fill_table( $posts );
253 }
254 /*
255 * Cancel index
256 */
257 public function cancel_reindex() {
258 $nonce = sanitize_text_field($_POST['nonce']);
259 if (! wp_verify_nonce($nonce,'wp_chatbot')) {
260 wp_send_json(array('success' => false, 'msg' => esc_html__('Failed in Security check', 'sm')));
261 wp_die();
262
263 }else{
264 delete_option( 'wp_chatbot_index_meta' );
265 wp_send_json_success( 'Deleted!' );
266 }
267 }
268 /*
269 * Strip shortcodes
270 */
271 private function strip_shortcodes( $content ) {
272 $content = preg_replace( '#\[[^\]]+\]#', '', $content );
273 return $content;
274 }
275 /*
276 * Extract terms from content
277 */
278 private function extract_terms( $str ) {
279 $stopwords = str_replace('\\', '', get_option('qlcd_wp_chatbot_stop_words'));
280 $str = $this->html2txt( $str );
281 // Avoid single A-Z.
282
283 $special_cars = $this->get_special_chars();
284 $str = str_replace( $special_cars, "", $str );
285 $str = str_replace( array(
286 "ˇ",
287 "°",
288 "Ë›",
289 "Ëť",
290 "¸",
291 "§",
292 "=",
293 "¨",
294 "’",
295 "‘",
296 "”",
297 "“",
298 "„",
299 "´",
300 "—",
301 "–",
302 "Ă—",
303 '&#8217;',
304 "&nbsp;",
305 chr( 194 ) . chr( 160 )
306 ), " ", $str );
307 $str = str_replace( 'Ăź', 'ss', $str );
308 $str = preg_replace( '/[[:space:]]+/', ' ', $str );
309 // Most objects except unicode characters
310 $str = preg_replace( '/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\x9F]/u', '', $str );
311 // Line feeds, carriage returns, tabs
312 $str = preg_replace( '/[\x00-\x1F\x80-\x9F]/u', '', $str );
313 if ( function_exists( 'mb_strtolower' ) ) {
314 $str = mb_strtolower( $str );
315 } else {
316 $str = strtolower( $str );
317 }
318 $str = preg_replace( '/^[a-z]$/i', "", $str );
319 $str = trim( preg_replace( '/\s+/', ' ', $str ) );
320 $str_array = array_count_values( explode( ' ', $str ) );
321 if ( $stopwords && $str_array && ! empty( $str_array ) ) {
322 $stopwords_array = explode( ',', $stopwords );
323 if ( $stopwords_array && ! empty( $stopwords_array ) ) {
324 $stopwords_array = array_map( 'trim', $stopwords_array );
325 foreach ( $str_array as $str_word => $str_count ) {
326 if ( in_array( $str_word, $stopwords_array ) ) {
327 unset( $str_array[$str_word] );
328 }
329 }
330 }
331 }
332 return $str_array;
333 }
334 /*
335 * Removes scripts, styles, html tags
336 */
337 public function html2txt( $str ) {
338 $search = array(
339 '@<script[^>]*?>.*?</script>@si',
340 '@<[\/\!]*?[^<>]*?>@si',
341 '@<style[^>]*?>.*?</style>@siU',
342 '@<![\s\S]*?--[ \t\n\r]*>@'
343 );
344 $str = preg_replace( $search, '', $str );
345 $str = esc_attr( $str );
346 $str = stripslashes( $str );
347 $str = str_replace( array( "\r", "\n" ), ' ', $str );
348 $str = str_replace( array(
349 "·",
350 "…",
351 "€",
352 "&shy;"
353 ), "", $str );
354 return $str;
355 }
356 /*
357 * Get special characters that must be striped
358 */
359 public function get_special_chars() {
360 $chars = array(
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 "{",
388 "}",
389 "/",
390 "[",
391 "]",
392 );
393 return apply_filters( 'wp_chatbot_special_chars', $chars );
394 }
395 /*
396 * Get string with current product terms ids
397 *
398 * @return string List of terms ids
399 */
400 private function get_terms_list( $id, $taxonomy ) {
401 $terms = get_the_terms( $id, $taxonomy );
402 if ( is_wp_error( $terms ) ) {
403 return '';
404 }
405 if ( empty( $terms ) ) {
406 return '';
407 }
408 $cats_array_temp = array();
409 foreach ( $terms as $term ) {
410 $cats_array_temp[] = $term->term_id;
411 }
412 return implode( ', ', $cats_array_temp );
413 }
414 /*
415 * Get string with current product terms names
416 *
417 * @return string List of terms names
418 */
419 private function get_terms_names_list( $id, $taxonomy ) {
420 $terms = get_the_terms( $id, $taxonomy );
421 if ( is_wp_error( $terms ) ) {
422 return '';
423 }
424 if ( empty( $terms ) ) {
425 return '';
426 }
427 $cats_array_temp = array();
428 foreach ( $terms as $term ) {
429 $cats_array_temp[] = $term->name;
430 }
431 return implode( ', ', $cats_array_temp );
432 }
433 }
434 endif;
435 new wpwBot_Table();