PluginProbe
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services / 8.7.7
WPBot – AI ChatBot for Live Support, Lead Generation, WordPress Automation, AI Services v8.7.7
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
← All changes | includes/class-response-list.php +317 -317 8.6.28.7.7 View file →
@@ -1,318 +1,318 @@
1 -<?php
2 -if (!defined('ABSPATH')) exit; // Exit if accessed directly
3 -if ( ! class_exists( 'WP_List_Table' ) ) {
4 - require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
5 -}
6 -
7 -class Response_list extends WP_List_Table {
8 -
9 -
10 - public $chatbot_admin_page;
11 - /** Class constructor */
12 - public function __construct() {
13 -
14 - parent::__construct( [
15 - 'singular' => __( 'Response', 'chatbot' ), //singular name of the listed records
16 - 'plural' => __( 'Responses', 'chatbot' ), //plural name of the listed records
17 - 'ajax' => false //does this table support ajax?
18 - ] );
19 -
20 - $this->chatbot_admin_page = admin_url('admin.php?page=simple-text-response');
21 -
22 - }
23 -
24 -
25 - /**
26 - * Retrieve customers data from the database
27 - *
28 - * @param int $per_page
29 - * @param int $page_number
30 - *
31 - * @return mixed
32 - */
33 - public static function get_responses( $per_page = 5, $page_number = 1 ) {
34 - global $wpdb;
35 -
36 - // Default order by and order
37 - $orderby = 'id';
38 - $order = 'DESC';
39 -
40 - // Allow sorting by column and order if provided and valid
41 - if ( ! empty( $_REQUEST['orderby'] ) ) {
42 - // Whitelist allowed columns to prevent SQL injection
43 - $allowed = array( 'id', 'intent', 'response', 'type' );
44 - $orderby_request = esc_sql( wp_unslash($_REQUEST['orderby']) );
45 - if ( in_array( $orderby_request, $allowed ) ) {
46 - $orderby = $orderby_request;
47 - }
48 - }
49 - if ( ! empty( $_REQUEST['order'] ) ) {
50 - $order_request = strtoupper( esc_sql( wp_unslash($_REQUEST['order']) ) );
51 - if ( in_array( $order_request, array( 'ASC', 'DESC' ) ) ) {
52 - $order = $order_request;
53 - }
54 - }
55 -
56 - $offset = ( $page_number - 1 ) * $per_page;
57 -
58 - // Build the SQL query with validated orderby and order
59 - $sql = $wpdb->prepare(
60 - "SELECT * FROM {$wpdb->prefix}wpbot_response ORDER BY $orderby $order LIMIT %d OFFSET %d",
61 - $per_page,
62 - $offset
63 - );
64 -
65 - $result = $wpdb->get_results( $sql, 'ARRAY_A' ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter
66 -
67 - return $result;
68 - }
69 -
70 -
71 - /**
72 - * Delete a customer record.
73 - *
74 - * @param int $id customer ID
75 - */
76 - public static function delete_response( $id ) {
77 - global $wpdb;
78 -
79 - $wpdb->delete( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
80 - "{$wpdb->prefix}wpbot_response",
81 - [ 'id' => $id ],
82 - [ '%d' ]
83 - );
84 -
85 - }
86 -
87 -
88 - /**
89 - * Returns the count of records in the database.
90 - *
91 - * @return null|string
92 - */
93 - public static function record_count() {
94 - global $wpdb;
95 -
96 - $sql = "SELECT COUNT(*) FROM {$wpdb->prefix}wpbot_response";
97 -
98 - return $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared
99 - }
100 -
101 -
102 - /** Text displayed when no customer data is available */
103 - public function no_items() {
104 - esc_html_e( 'No responses avaliable.', 'chatbot' );
105 - }
106 -
107 -
108 - /**
109 - * Render a column when no column specific method exist.
110 - *
111 - * @param array $item
112 - * @param string $column_name
113 - *
114 - * @return mixed
115 - */
116 - public function column_default( $item, $column_name ) {
117 -
118 -
119 -
120 -
121 - if(class_exists('Qcld_str_pro')){
122 - switch ( $column_name ) {
123 - case 'query':
124 - case 'keyword':
125 - case 'intent':
126 - case 'category':
127 - return $item[ $column_name ];
128 -
129 - case 'responses':
130 - return $item[ 'response' ];
131 - default:
132 - return print_r( $item, true ); //Show the whole array for troubleshooting purposes
133 - }
134 - }else{
135 - switch ( $column_name ) {
136 - case 'query':
137 - case 'keyword':
138 - case 'intent':
139 - return $item[ $column_name ];
140 -
141 - case 'responses':
142 - return $item[ 'response' ];
143 - default:
144 - return print_r( $item, true ); //Show the whole array for troubleshooting purposes
145 - }
146 - }
147 -
148 - }
149 -
150 - /**
151 - * Render the bulk edit checkbox
152 - *
153 - * @param array $item
154 - *
155 - * @return string
156 - */
157 - function column_cb( $item ) {
158 - return sprintf(
159 - '<input type="checkbox" name="bulk-delete[]" value="%s" />', $item['id']
160 - );
161 - }
162 -
163 -
164 - /**
165 - * Method for name column
166 - *
167 - * @param array $item an array of DB data
168 - *
169 - * @return string
170 - */
171 - function column_query( $item ) {
172 -
173 - $delete_nonce = wp_create_nonce( 'wp_delete_query' );
174 - $edit_nonce = wp_create_nonce( 'wp_edit_query' );
175 -
176 - $title = '<strong>' . $item['query'] . '</strong>';
177 -// var_dump($title);
178 - $actions = [
179 - 'edit' => sprintf( '<a href="?page=%s&action=%s&query=%s&_wpnonce=%s">Edit</a>', esc_attr(wp_unslash($_REQUEST['page'])), 'edit', absint( $item['id'] ), $edit_nonce ),
180 - 'delete' => sprintf( '<a href="?page=%s&action=%s&query=%s&_wpnonce=%s">Delete</a>', esc_attr(wp_unslash($_REQUEST['page'])), 'delete', absint( $item['id'] ), $delete_nonce )
181 - ];
182 -
183 - return $title . $this->row_actions( $actions );
184 - }
185 -
186 -
187 - /**
188 - * Associative array of columns
189 - *
190 - * @return array
191 - */
192 - function get_columns() {
193 -
194 -
195 - if(class_exists('Qcld_str_pro')){
196 - $columns = [
197 - 'cb' => '<input type="checkbox" />',
198 - 'query' => __( 'Query', 'chatbot' ),
199 - 'keyword' => __( 'Keyword', 'chatbot' ),
200 - 'responses' => __( 'Response', 'chatbot' ),
201 - 'intent'=> __( 'Intent', 'chatbot' ),
202 - 'category'=> __( 'Category', 'chatbot' ),
203 -
204 - ];
205 - }else{
206 - $columns = [
207 - 'cb' => '<input type="checkbox" />',
208 - 'query' => __( 'Query', 'chatbot' ),
209 - 'keyword' => __( 'Keyword', 'chatbot' ),
210 - 'responses' => __( 'Response', 'chatbot' ),
211 - 'intent'=> __( 'Intent', 'chatbot' ),
212 -
213 - ];
214 - }
215 -
216 - return $columns;
217 - }
218 -
219 -
220 - /**
221 - * Columns to make sortable.
222 - *
223 - * @return array
224 - */
225 - public function get_sortable_columns() {
226 - $sortable_columns = array(
227 - 'query' => array( 'query', true ),
228 - );
229 -
230 - return $sortable_columns;
231 - }
232 -
233 - /**
234 - * Returns an associative array containing the bulk action
235 - *
236 - * @return array
237 - */
238 - public function get_bulk_actions() {
239 - $actions = [
240 - 'bulk-delete' => 'Delete'
241 - ];
242 -
243 - return $actions;
244 - }
245 -
246 -
247 - /**
248 - * Handles data query and filter, sorting, and pagination.
249 - */
250 - public function prepare_items() {
251 -
252 - $this->_column_headers = $this->get_column_info();
253 -
254 - /** Process bulk action */
255 - $this->process_bulk_action();
256 - if( !empty($_POST['wp_screen_options'] )){
257 - $per_page = (int)$_POST['wp_screen_options']["value"];
258 - }else{
259 - $per_page = $this->get_items_per_page( 'responses_per_page' );
260 -
261 - }
262 - $current_page = $this->get_pagenum();
263 - $total_items = self::record_count();
264 -
265 - $this->set_pagination_args( [
266 - 'total_items' => $total_items, //WE have to calculate the total number of items
267 - 'per_page' => $per_page //WE have to determine how many items to show on a page
268 - ] );
269 -
270 - $this->items = self::get_responses( $per_page, $current_page );
271 - }
272 -
273 - public function process_bulk_action() {
274 -
275 -
276 -
277 - //Detect when a bulk action is being triggered...
278 - if ( 'delete' === $this->current_action() ) {
279 -
280 - // In our file that handles the request, verify the nonce.
281 - $nonce = esc_attr(wp_unslash($_REQUEST['_wpnonce']));
282 -
283 - if ( ! wp_verify_nonce( $nonce, 'wp_delete_query' ) ) {
284 - die( 'Go get a life script kiddies' );
285 - }
286 - else {
287 - self::delete_response( absint( wp_unslash($_GET['query']) ) );
288 -
289 - // esc_url_raw() is used to prevent converting ampersand in url to "#038;"
290 - // add_query_arg() return the current url
291 - //wp_redirect( esc_url_raw($this->chatbot_admin_page) );
292 - //exit;
293 - }
294 -
295 - }
296 -
297 - // If the delete bulk action is triggered
298 - if ( ( isset($_POST['action']) && wp_unslash($_POST['action']) == 'bulk-delete' )
299 - || ( isset($_POST['action2']) && wp_unslash($_POST['action2']) == 'bulk-delete' )
300 - ) {
301 -
302 - $delete_ids = esc_sql( wp_unslash($_POST['bulk-delete']) );
303 -
304 -
305 - // loop over the array of record IDs and delete them
306 - foreach ( $delete_ids as $id ) {
307 - self::delete_response( $id );
308 -
309 - }
310 -
311 - // esc_url_raw() is used to prevent converting ampersand in url to "#038;"
312 - // add_query_arg() return the current url
313 - wp_safe_redirect( esc_url_raw($this->chatbot_admin_page) );
314 - exit;
315 - }
316 - }
317 -
1 +<?php
2 +if (!defined('ABSPATH')) exit; // Exit if accessed directly
3 +if ( ! class_exists( 'WP_List_Table' ) ) {
4 + require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );
5 +}
6 +
7 +class Response_list extends WP_List_Table {
8 +
9 +
10 + public $chatbot_admin_page;
11 + /** Class constructor */
12 + public function __construct() {
13 +
14 + parent::__construct( [
15 + 'singular' => __( 'Response', 'chatbot' ), //singular name of the listed records
16 + 'plural' => __( 'Responses', 'chatbot' ), //plural name of the listed records
17 + 'ajax' => false //does this table support ajax?
18 + ] );
19 +
20 + $this->chatbot_admin_page = admin_url('admin.php?page=simple-text-response');
21 +
22 + }
23 +
24 +
25 + /**
26 + * Retrieve customers data from the database
27 + *
28 + * @param int $per_page
29 + * @param int $page_number
30 + *
31 + * @return mixed
32 + */
33 + public static function get_responses( $per_page = 5, $page_number = 1 ) {
34 + global $wpdb;
35 +
36 + // Default order by and order
37 + $orderby = 'id';
38 + $order = 'DESC';
39 +
40 + // Allow sorting by column and order if provided and valid
41 + if ( ! empty( $_REQUEST['orderby'] ) ) {
42 + // Whitelist allowed columns to prevent SQL injection
43 + $allowed = array( 'id', 'intent', 'response', 'type' );
44 + $orderby_request = esc_sql( wp_unslash($_REQUEST['orderby']) );
45 + if ( in_array( $orderby_request, $allowed ) ) {
46 + $orderby = $orderby_request;
47 + }
48 + }
49 + if ( ! empty( $_REQUEST['order'] ) ) {
50 + $order_request = strtoupper( esc_sql( wp_unslash($_REQUEST['order']) ) );
51 + if ( in_array( $order_request, array( 'ASC', 'DESC' ) ) ) {
52 + $order = $order_request;
53 + }
54 + }
55 +
56 + $offset = ( $page_number - 1 ) * $per_page;
57 +
58 + // Build the SQL query with validated orderby and order
59 + $sql = $wpdb->prepare(
60 + "SELECT * FROM {$wpdb->prefix}wpbot_response ORDER BY $orderby $order LIMIT %d OFFSET %d",
61 + $per_page,
62 + $offset
63 + );
64 +
65 + $result = $wpdb->get_results( $sql, 'ARRAY_A' ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter
66 +
67 + return $result;
68 + }
69 +
70 +
71 + /**
72 + * Delete a customer record.
73 + *
74 + * @param int $id customer ID
75 + */
76 + public static function delete_response( $id ) {
77 + global $wpdb;
78 +
79 + $wpdb->delete( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
80 + "{$wpdb->prefix}wpbot_response",
81 + [ 'id' => $id ],
82 + [ '%d' ]
83 + );
84 +
85 + }
86 +
87 +
88 + /**
89 + * Returns the count of records in the database.
90 + *
91 + * @return null|string
92 + */
93 + public static function record_count() {
94 + global $wpdb;
95 +
96 + $sql = "SELECT COUNT(*) FROM {$wpdb->prefix}wpbot_response";
97 +
98 + return $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared
99 + }
100 +
101 +
102 + /** Text displayed when no customer data is available */
103 + public function no_items() {
104 + esc_html_e( 'No responses avaliable.', 'chatbot' );
105 + }
106 +
107 +
108 + /**
109 + * Render a column when no column specific method exist.
110 + *
111 + * @param array $item
112 + * @param string $column_name
113 + *
114 + * @return mixed
115 + */
116 + public function column_default( $item, $column_name ) {
117 +
118 +
119 +
120 +
121 + if(class_exists('Qcld_str_pro')){
122 + switch ( $column_name ) {
123 + case 'query':
124 + case 'keyword':
125 + case 'intent':
126 + case 'category':
127 + return $item[ $column_name ];
128 +
129 + case 'responses':
130 + return $item[ 'response' ];
131 + default:
132 + return print_r( $item, true ); //Show the whole array for troubleshooting purposes
133 + }
134 + }else{
135 + switch ( $column_name ) {
136 + case 'query':
137 + case 'keyword':
138 + case 'intent':
139 + return $item[ $column_name ];
140 +
141 + case 'responses':
142 + return $item[ 'response' ];
143 + default:
144 + return print_r( $item, true ); //Show the whole array for troubleshooting purposes
145 + }
146 + }
147 +
148 + }
149 +
150 + /**
151 + * Render the bulk edit checkbox
152 + *
153 + * @param array $item
154 + *
155 + * @return string
156 + */
157 + function column_cb( $item ) {
158 + return sprintf(
159 + '<input type="checkbox" name="bulk-delete[]" value="%s" />', $item['id']
160 + );
161 + }
162 +
163 +
164 + /**
165 + * Method for name column
166 + *
167 + * @param array $item an array of DB data
168 + *
169 + * @return string
170 + */
171 + function column_query( $item ) {
172 +
173 + $delete_nonce = wp_create_nonce( 'wp_delete_query' );
174 + $edit_nonce = wp_create_nonce( 'wp_edit_query' );
175 +
176 + $title = '<strong>' . $item['query'] . '</strong>';
177 +// var_dump($title);
178 + $actions = [
179 + 'edit' => sprintf( '<a href="?page=%s&action=%s&query=%s&_wpnonce=%s">Edit</a>', esc_attr(wp_unslash($_REQUEST['page'])), 'edit', absint( $item['id'] ), $edit_nonce ),
180 + 'delete' => sprintf( '<a href="?page=%s&action=%s&query=%s&_wpnonce=%s">Delete</a>', esc_attr(wp_unslash($_REQUEST['page'])), 'delete', absint( $item['id'] ), $delete_nonce )
181 + ];
182 +
183 + return $title . $this->row_actions( $actions );
184 + }
185 +
186 +
187 + /**
188 + * Associative array of columns
189 + *
190 + * @return array
191 + */
192 + function get_columns() {
193 +
194 +
195 + if(class_exists('Qcld_str_pro')){
196 + $columns = [
197 + 'cb' => '<input type="checkbox" />',
198 + 'query' => __( 'Query', 'chatbot' ),
199 + 'keyword' => __( 'Keyword', 'chatbot' ),
200 + 'responses' => __( 'Response', 'chatbot' ),
201 + 'intent'=> __( 'Intent', 'chatbot' ),
202 + 'category'=> __( 'Category', 'chatbot' ),
203 +
204 + ];
205 + }else{
206 + $columns = [
207 + 'cb' => '<input type="checkbox" />',
208 + 'query' => __( 'Query', 'chatbot' ),
209 + 'keyword' => __( 'Keyword', 'chatbot' ),
210 + 'responses' => __( 'Response', 'chatbot' ),
211 + 'intent'=> __( 'Intent', 'chatbot' ),
212 +
213 + ];
214 + }
215 +
216 + return $columns;
217 + }
218 +
219 +
220 + /**
221 + * Columns to make sortable.
222 + *
223 + * @return array
224 + */
225 + public function get_sortable_columns() {
226 + $sortable_columns = array(
227 + 'query' => array( 'query', true ),
228 + );
229 +
230 + return $sortable_columns;
231 + }
232 +
233 + /**
234 + * Returns an associative array containing the bulk action
235 + *
236 + * @return array
237 + */
238 + public function get_bulk_actions() {
239 + $actions = [
240 + 'bulk-delete' => 'Delete'
241 + ];
242 +
243 + return $actions;
244 + }
245 +
246 +
247 + /**
248 + * Handles data query and filter, sorting, and pagination.
249 + */
250 + public function prepare_items() {
251 +
252 + $this->_column_headers = $this->get_column_info();
253 +
254 + /** Process bulk action */
255 + $this->process_bulk_action();
256 + if( !empty($_POST['wp_screen_options'] )){
257 + $per_page = (int)$_POST['wp_screen_options']["value"];
258 + }else{
259 + $per_page = $this->get_items_per_page( 'responses_per_page' );
260 +
261 + }
262 + $current_page = $this->get_pagenum();
263 + $total_items = self::record_count();
264 +
265 + $this->set_pagination_args( [
266 + 'total_items' => $total_items, //WE have to calculate the total number of items
267 + 'per_page' => $per_page //WE have to determine how many items to show on a page
268 + ] );
269 +
270 + $this->items = self::get_responses( $per_page, $current_page );
271 + }
272 +
273 + public function process_bulk_action() {
274 +
275 +
276 +
277 + //Detect when a bulk action is being triggered...
278 + if ( 'delete' === $this->current_action() ) {
279 +
280 + // In our file that handles the request, verify the nonce.
281 + $nonce = esc_attr(wp_unslash($_REQUEST['_wpnonce']));
282 +
283 + if ( ! wp_verify_nonce( $nonce, 'wp_delete_query' ) ) {
284 + die( 'Go get a life script kiddies' );
285 + }
286 + else {
287 + self::delete_response( absint( wp_unslash($_GET['query']) ) );
288 +
289 + // esc_url_raw() is used to prevent converting ampersand in url to "#038;"
290 + // add_query_arg() return the current url
291 + //wp_redirect( esc_url_raw($this->chatbot_admin_page) );
292 + //exit;
293 + }
294 +
295 + }
296 +
297 + // If the delete bulk action is triggered
298 + if ( ( isset($_POST['action']) && wp_unslash($_POST['action']) == 'bulk-delete' )
299 + || ( isset($_POST['action2']) && wp_unslash($_POST['action2']) == 'bulk-delete' )
300 + ) {
301 +
302 + $delete_ids = esc_sql( wp_unslash($_POST['bulk-delete']) );
303 +
304 +
305 + // loop over the array of record IDs and delete them
306 + foreach ( $delete_ids as $id ) {
307 + self::delete_response( $id );
308 +
309 + }
310 +
311 + // esc_url_raw() is used to prevent converting ampersand in url to "#038;"
312 + // add_query_arg() return the current url
313 + wp_safe_redirect( esc_url_raw($this->chatbot_admin_page) );
314 + exit;
315 + }
316 + }
317 +
318 318 }