PluginProbe
Booking Calendar / 11.8
Booking Calendar v11.8
11.8.1 11.8 11.7 11.6.1 11.6 11.5 11.4.3 11.4.2 11.4.1 11.4 11.3 11.2.1 11.2 11.1 11.0 10.15.7 10.15.6 10.1.3 10.10 10.10.1 10.10.2 10.11 10.11.2 10.11.3 10.11.4 All 201 releases
booking / includes / page-availability / availability__resource.php

availability__resource.php in Booking Calendar 11.8, at includes/page-availability/availability__resource.php

504 lines 22.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @version 1.0
4 * @package Booking Calendar
5 * @category Resource Availability - define "unavailable" "date_status" in "wp_booking_dates_props" table.
6 * @author wpdevelop
7 *
8 * @web-site https://wpbookingcalendar.com/
9 * @email info@wpbookingcalendar.com
10 * @modified 2022-11-23
11 *
12 */
13
14 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
15
16
17 /**
18 * Get unavailable dates for the booking resource. Based on 'resource availability' - new Availability UI.
19 *
20 * @param int $resource_id
21 *
22 * @return array|object|stdClass[]|null
23 */
24 function wpbc_resource__get_unavailable_dates( $resource_id = 1 ){
25
26 $resource_id = intval( $resource_id );
27 if ( empty( $resource_id ) ) {
28 $resource_id = 1;
29 }
30
31 $resource_availability = wpbc_availability__get_dates_status__sql( array(
32 'calendar_date' => 'CURDATE', // 'CURDATE' | 'ALL'
33 'prop_name' => 'date_status', // 'rate', 'allow_start_day_selection', 'allow_days_number_to_select', 'availability_count', ...
34 'prop_value' => 'unavailable', // 'unavailable', 'available', 'pending', 'approved'
35 'resource_id' => intval( $resource_id ) // int or dcv
36 ) );
37
38 $unavailable__dates_y_m_d__arr = array();
39
40 foreach ( $resource_availability as $unavailable_db_obj ) {
41 list( $date_y_m_d, $time_his ) = explode( ' ', $unavailable_db_obj->calendar_date );
42 $unavailable__dates_y_m_d__arr[] = $date_y_m_d;
43 }
44
45 return $unavailable__dates_y_m_d__arr;
46 }
47
48
49 /**
50 * Get unavailable dates for array of booking resources
51 *
52 * @param array $resource_id_arr // [1, 13, 8, 6, 7]
53 * @param mixed $search_dates // 'CURDATE' | 'ALL' | [ "2023-08-03" , "2023-08-04" , "2023-08-05" ]
54 *
55 * @return array - array of unavailable dates: array( resource_A_ID => array( DATES_Y_M_D, .... ),
56 resource_B_ID => array( DATES_Y_M_D, .... ), ...
57 Example:
58 array( 1 => array( "2023-08-03" , "2023-08-04" ),
59 8 => array( "2023-08-03" ), ...
60 */
61 function wpbc_for_resources_arr__get_unavailable_dates( $resource_id_arr, $search_dates = 'CURDATE' ) { // FixIn: 9.7.3.11.
62
63 // Booking resources -----------------------------------------------------------------------------------------------
64 $resource_id_csd = implode( ',', $resource_id_arr ); // '9,13,5,6,7,1,2,10,11,12,3,4,8'
65
66 // Dates -----------------------------------------------------------------------------------------------------------
67 if ( is_array( $search_dates ) ) { // Array of dates: ["2023-08-03"]
68
69 foreach ( $search_dates as $date_ymd ) {
70 $search_dates_arr[] = $date_ymd . ' 00:00:00';
71 }
72
73 /**
74 * // FixIn: 10.14.17.1.
75 * If we have only one date param,eter, it is means that we defined only one parameter in shortcode: calendar_dates_start or calendar_dates_end
76 * and in this case we need to search >= or <= (but because in this function, we do not know what exactly it was parameter, start or end), we will search for all dates.
77 */
78 if ( count( $search_dates_arr ) === 1 ) {
79 $search_dates_formated = 'ALL';
80 } else {
81 $search_dates_formated = implode( ',', $search_dates_arr );
82 }
83
84
85 } else { // Probably 'CURDATE' | 'ALL'
86
87 $search_dates_formated = ( in_array( $search_dates, array( 'ALL', 'CURDATE' ) ) )
88 ? $search_dates
89 : 'CURDATE' ;
90 }
91
92 // Unavailable objects ---------------------------------------------------------------------------------------------
93 $resource_availability = wpbc_availability__get_dates_status__sql( array(
94 'calendar_date' => $search_dates_formated, // 'CURDATE' | 'ALL'
95 'prop_name' => 'date_status', // 'rate', 'allow_start_day_selection', 'allow_days_number_to_select', 'availability_count', ...
96 'prop_value' => 'unavailable', // 'unavailable', 'available', 'pending', 'approved'
97 'resource_id' => $resource_id_csd // int or dcv
98 ) );
99
100 // Formatted array of unavailable booking resource dates ----------------------------------------------------------
101 $resource_unavailable_dates_arr = array();
102 foreach ( $resource_availability as $resource_unavailable_obj ) {
103
104 if ( ! isset( $resource_unavailable_dates_arr[ $resource_unavailable_obj->resource_id ] ) ) {
105 $resource_unavailable_dates_arr[ $resource_unavailable_obj->resource_id ] = array();
106 }
107 $calendar_date = explode( ' ', $resource_unavailable_obj->calendar_date );
108 $resource_unavailable_dates_arr[ $resource_unavailable_obj->resource_id ][] = $calendar_date[0];
109 }
110
111 return $resource_unavailable_dates_arr;
112 }
113
114
115 /**
116 * Get dates status of specific booking resource
117 *
118 * @param array $params = array(
119 'prop_name' => 'date_status', // 'rate', 'allow_start_day_selection', 'allow_days_number_to_select', 'availability_count', ...
120 'prop_value' => 'unavailable', // 'unavailable', 'available', 'pending', 'approved'
121 'resource_id' => 1 // int or dcv
122 )
123 *
124 * booking date property can be relative to: prop_name = 'date_status', 'rate', 'allow_start_day_selection', 'allow_days_number_to_select', 'availability_count', ...
125 *
126 * prop_name = 'date_status' -> prop_value = 'unavailable', 'available', 'pending', 'approved'
127 *
128 * @return array of DB objects array(
129 0 = {stdClass} {
130 ->booking_dates_prop_id = "1"
131 ->resource_id = "4"
132 ->calendar_date = "2023-04-04 00:00:00"
133 ->prop_name = "date_status"
134 ->prop_value = "unavailable"
135 }
136 , ... )
137 *
138 * Example:
139 wpbc_availability__get_dates_status__sql( array(
140 'calendar_date' => 'CURDATE', // 'CURDATE' | 'ALL' | '2023-07-15 00:00:00,2023-07-21 00:00:00'
141 'prop_name' => 'date_status', // 'rate', 'allow_start_day_selection', 'allow_days_number_to_select', 'availability_count', ...
142 'prop_value' => 'unavailable', // 'unavailable', 'available', 'pending', 'approved'
143 'resource_id' => 1 // int or dcv
144 ) );
145 */
146 function wpbc_availability__get_dates_status__sql( $params ){
147
148 // CACHE - GET :: check if such request was cached and get it ----------------------------------------------- // FixIn: 9.7.3.14.
149 $params_for_cache_key = $params;
150 if ( isset( $params_for_cache_key['resource_id'] ) ) {
151 $params_for_cache_key['resource_id'] = (string) $params_for_cache_key['resource_id'];
152 }
153 $params_for_cache = maybe_serialize( $params_for_cache_key );
154 $cache_result = wpbc_cache__get( 'wpbc_availability__get_dates_status__sql', $params_for_cache );
155 if ( ! is_null( $cache_result ) ) {
156 return $cache_result;
157 }
158 // -----------------------------------------------------------------------------------------------------------------
159
160
161 $defaults = array(
162 'calendar_date' => 'CURDATE', // 'CURDATE' | 'ALL' | '2023-07-15 00:00:00,2023-07-21 00:00:00' // FixIn: 9.7.3.11.
163 'prop_name' => 'date_status', // 'rate', 'allow_start_day_selection', 'allow_days_number_to_select', 'availability_count', ...
164 'prop_value' => 'unavailable', // 'unavailable', 'available', 'pending', 'approved'
165 'resource_id' => 1 // int or dcv
166 );
167 $params = wp_parse_args( $params, $defaults );
168
169 // S a n i t i z e
170 $params_rules = array(
171 'calendar_date' => array( 'validate' => 's', 'default' => 'CURDATE' ) , // array( 'validate' => array( 'CURDATE', 'ALL' ), 'default' => 'CURDATE' ) ,
172 'prop_name' => array( 'validate' => 's', 'default' => 'date_status' ) ,
173 'prop_value' => array( 'validate' => 's', 'default' => 'unavailable' ) ,
174 'resource_id' => array( 'validate' => 'digit_or_csd', 'default' => 1 )
175 );
176 $params = wpbc_sanitize_params_in_arr( $params, $params_rules );
177 /**
178
179 $params['resource_id'] = ( '' != $params['resource_id'] ) ? wpbc_sanitize_digit_or_csd( $params['resource_id'] ) : 1;
180 $params['prop_name'] = wpbc_sanitize_text( $params['prop_name'] );
181 $params['prop_value'] = wpbc_sanitize_text( $params['prop_value'] );
182 */
183
184
185 // S Q L
186 global $wpdb;
187 $sql = array();
188 $sql_args = array();
189
190
191 $sql['start_select'] = "SELECT * "; // "SELECT DISTINCT calendar_date ";
192 $sql['from'] = "FROM {$wpdb->prefix}booking_dates_props ";
193
194 // W H E R E
195 $sql['where'] = 'WHERE ( 1 = 1 ) ';
196 $sql['where'] .= " AND resource_id IN ( {$params['resource_id']} ) ";
197
198 if ( '' != $params['calendar_date'] ) {
199
200 // FixIn: 9.7.3.11.
201 if ( 'ALL' == $params['calendar_date'] ) {
202 // All dates
203 } else if ( 'CURDATE' == $params['calendar_date'] ) {
204
205 $sql['where'] .= " AND calendar_date >= " . wpbc_sql_date_math_expr_explicit('', 'curdate') . " "; // Current dates
206
207 } else { // Specific Date(s)
208
209 if ( false === strpos( $params['calendar_date'], ',' ) ) { // One date: - '2023-07-15 00:00:00'
210
211 $sql['where'] .= " AND ( calendar_date = %s ) ";
212 $sql_args[] = $params['calendar_date'];
213 } else { // Comma seperated dates: - '2023-07-15 00:00:00, 2023-07-16 00:00:00'
214
215 $dates_arr = explode( ',', $params['calendar_date'] );
216 $in_search_arr = array();
217 foreach ( $dates_arr as $date_ymd ) {
218 $in_search_arr[] = '%s';
219 $sql_args[] = $date_ymd;
220 }
221 // FixIn: 10.14.17.1.
222 $sql_args = wpbc_sanitize_date_ymdhis_to_check( $sql_args );
223 /**
224 * If we have onbly 2 dates, then we understand such dates as from - to.
225 * usually such situation in shortcodes with these parameters calendar_dates_start / calendar_dates_end.
226 * E.g.: [bookingcalendar resource_id=2 nummonths=2 calendar_dates_start='2026-02-01' calendar_dates_end='2026-03-31']
227 */
228 if ( 2 === count( $sql_args ) ) {
229 $sql['where'] .= " AND calendar_date >= %s ";
230 $sql['where'] .= " AND calendar_date <= %s ";
231 } else {
232 $in_search_dates_csv = implode( ',', $in_search_arr );
233 $sql['where'] .= " AND calendar_date IN ( {$in_search_dates_csv} ) ";
234 }
235 }
236 }
237 }
238
239 if ( '' != $params['prop_name'] ) {
240 $sql['where'] .= " AND ( prop_name = %s ) ";
241 $sql_args[] = $params['prop_name'];
242 }
243
244 if ( '' != $params['prop_value'] ) {
245 $sql['where'] .= " AND ( prop_value = %s ) ";
246 $sql_args[] = $params['prop_value'];
247 }
248
249 // O R D E R
250 $sql['order'] = " ORDER BY calendar_date";
251
252 // L I M I T
253 $sql['limit'] = '';
254 /**
255 * $sql['limit'] = " LIMIT %d, %d ";
256 $sql_args[] = ( $params['page_num'] - 1 ) * $params['page_items_count'];
257 $sql_args[] = $params['page_items_count'];
258 */
259
260
261
262 /**
263 * Good Practice: https://blog.ircmaxell.com/2017/10/disclosure-wordpress-wpdb-sql-injection-technical.html
264 *
265 $sql['where'] .= "( bk.form LIKE %s ) ";
266 $sql_args[] = '%' . $wpdb->esc_like( $params['keyword'] ) . '%';
267
268 if ( is_numeric( $params['keyword'] ) ) {
269 $sql['where'] .= " OR ( bk.booking_id = %d ) ";
270 $sql_args[] = intval( $params['keyword'] );
271 }
272 *
273 */
274 /* phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare */
275 $sql_prepared = $wpdb->prepare( $sql['start_select'] . $sql['from'] . $sql['where'] . $sql['order'] . $sql['limit'], $sql_args );
276 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter
277 $bookings_sql_obj = $wpdb->get_results( $sql_prepared );
278
279 // CACHE - SAVE :: ------------------------------------------------------------------------------------------------
280 $cache_result = wpbc_cache__save( 'wpbc_availability__get_dates_status__sql', $params_for_cache, $bookings_sql_obj );
281
282 return $bookings_sql_obj;
283 /*
284 "CREATE TABLE {$wpdb->prefix}booking_dates_props (
285 booking_dates_prop_id bigint(20) unsigned NOT NULL auto_increment,
286 resource_id bigint(10) NOT NULL default 1,
287 calendar_date datetime NOT NULL default '0000-00-00 00:00:00',
288 prop_name varchar(200) NOT NULL default '',
289 prop_value text,
290 PRIMARY KEY (booking_dates_prop_id)
291 )";
292 */
293 }
294
295
296 /**
297 * Update dates status
298 *
299 * @param $params array(
300 'resource_id' => 1, // int
301 'prop_name' => 'date_status', // 'rate', 'allow_start_day_selection', 'allow_days_number_to_select', 'availability_count', ...
302 'prop_value' => 'unavailable', // 'available', 'unavailable' , 'pending', 'approved'
303 'dates_selection' => '' // '2023-04-04 | 2023-04-07'
304
305 )
306 *
307 * @return bool|int - return how many DB rows affected -how many dates processed
308 */
309 function wpbc_availability__update_dates_status__sql( $params ){
310
311 $defaults = array(
312 'resource_id' => 1, // int
313 'prop_name' => 'date_status', // 'rate', 'allow_start_day_selection', 'allow_days_number_to_select', 'availability_count', ...
314 'prop_value' => 'unavailable', // 'available', 'unavailable' , 'pending', 'approved'
315 'dates_selection' => '' // '2023-04-04 | 2023-04-07'
316
317 );
318 $params = wp_parse_args( $params, $defaults );
319
320 // S a n i t i z e
321 $params_rules = array(
322 'dates_selection' => array( 'validate' => 's', 'default' => '' ) ,
323 'prop_name' => array( 'validate' => 's', 'default' => 'date_status' ) ,
324 'prop_value' => array( 'validate' => 's', 'default' => 'unavailable' ) ,
325 'resource_id' => array( 'validate' => 'digit_or_csd', 'default' => 1 )
326 );
327 $params = wpbc_sanitize_params_in_arr( $params, $params_rules );
328
329
330 if ( false !== strpos( $params['dates_selection'], '~' ) ) { // Range Days
331
332 $dates_arr = wpbc_get_dates_arr__from_dates_range( array(
333 'dates_separator' => ' ~ ', // ' ~ '
334 'dates' => $params['dates_selection'], // '2023-04-04 ~ 2023-04-07'
335 ) );
336
337 } else { // Multiple Days
338 $dates_arr = wpbc_get_dates_arr__from_dates_comma_separated( array(
339 'dates_separator' => ', ', // ', '
340 'dates' => $params['dates_selection'], // '2023-04-04 ~ 2023-04-07'
341 ) );
342 }
343
344 $row_number = false;
345
346 if ( ! empty( $dates_arr ) ) {
347
348 global $wpdb;
349
350 // Remove dates ------------------------------------------------------------------------------------------------
351
352 // "DELETE FROM {$wpdb->prefix}booking_dates_props WHERE resource_id = %d AND prop_name = %s AND ( calendar_date = %s OR calendar_date = %s )"
353 $sql = "DELETE FROM {$wpdb->prefix}booking_dates_props WHERE resource_id = %d AND prop_name = %s ";
354
355 $sql_args = array();
356 $sql_args[] = $params['resource_id'];
357 $sql_args[] = $params['prop_name'];
358
359 $sub_sql = array();
360 foreach ( $dates_arr as $calendar_date ) {
361
362 $sub_sql[] = 'calendar_date = %s';
363 $sql_args[] = $calendar_date . ' 00:00:00';
364 }
365 if ( count( $sub_sql ) > 0 ) {
366 $sql .= ' AND ( ';
367 $sub_sql = implode( ' OR ', $sub_sql );
368 $sql .= $sub_sql;
369 $sql .= " )";
370 }
371 /* phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare */
372 $sql_prepared = $wpdb->prepare( $sql, $sql_args );
373 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter
374 $row_number = $wpdb->query( $sql_prepared );
375
376
377 // If we set the dates as 'available', then we skip INSERT into DB, because previously we have already deleted all 'unavailable' dates status for such dates
378 if ( ( 'date_status' == $params['prop_name'] ) && ( 'available' == $params['prop_value'] ) ) {
379 return $row_number;
380 }
381
382 // Insert new dates ------------------------------------------------------------------------------------------------
383 $sql_args = array();
384
385 $sql = "INSERT INTO {$wpdb->prefix}booking_dates_props ( resource_id, calendar_date, prop_name, prop_value) VALUES ";
386
387 $sub_sql = array();
388 foreach ( $dates_arr as $calendar_date ) {
389
390 $sub_sql[] = "( %d, %s, %s, %s )";
391 $sql_args[] = $params['resource_id'];
392 $sql_args[] = $calendar_date . ' 00:00:00';
393 $sql_args[] = $params['prop_name'];
394 $sql_args[] = $params['prop_value'];
395 }
396
397 $sub_sql = implode( ',', $sub_sql );
398 $sql .= $sub_sql;
399 /* phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare */
400 $sql_prepared = $wpdb->prepare( $sql, $sql_args );
401 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter
402 $row_number = $wpdb->query( $sql_prepared );
403 }
404
405 return $row_number;
406 }
407
408
409 /**
410 * Delete the dates status from DB - erase availability
411 *
412 * @param array $params array(
413 'resource_id' => 1, // int
414 'prop_name' => 'date_status', // 'rate', 'allow_start_day_selection', 'allow_days_number_to_select', 'availability_count', ...
415 'prop_value' => 'unavailable', // 'available', 'unavailable' , 'pending', 'approved'
416 'dates_selection' => 'all' // '2023-04-04 ~ 2023-04-07'
417
418 )
419 *
420 * @return bool|int - count of deleted rows or false if operation was not applied
421 *
422 * Examples:
423 * wpbc_availability__delete_dates_status__sql(array( 'resource_id' => 1 ));
424 * wpbc_availability__delete_dates_status__sql(array( 'resource_id' => 1, 'prop_name' => 'date_status' ))
425 * wpbc_availability__delete_dates_status__sql(array( 'resource_id' => 1, 'prop_name' => 'date_status', 'dates_selection' => 'all' ))
426 * wpbc_availability__delete_dates_status__sql(array( 'resource_id' => 1, 'prop_name' => 'date_status', 'dates_selection' => '2023-04-04 ~ 2023-04-07' ))
427 * wpbc_availability__delete_dates_status__sql(array( 'resource_id' => 1, 'prop_name' => 'date_status', 'dates_selection' => '2023-04-04, 2023-04-07, 2023-04-05' ))
428 */
429 function wpbc_availability__delete_dates_status__sql( $params ){
430
431 $defaults = array(
432 'resource_id' => 1, // int
433 'prop_name' => 'date_status', // 'rate', 'allow_start_day_selection', 'allow_days_number_to_select', 'availability_count', ...
434 'prop_value' => 'unavailable', // 'available', 'unavailable' , 'pending', 'approved'
435 'dates_selection' => 'all' // '2023-04-04 ~ 2023-04-07'
436
437 );
438 $params = wp_parse_args( $params, $defaults );
439
440 // S a n i t i z e
441 $params_rules = array(
442 'dates_selection' => array( 'validate' => 's', 'default' => '' ) ,
443 'prop_name' => array( 'validate' => 's', 'default' => 'date_status' ) ,
444 'prop_value' => array( 'validate' => 's', 'default' => 'unavailable' ) ,
445 'resource_id' => array( 'validate' => 'digit_or_csd', 'default' => 1 )
446 );
447 $params = wpbc_sanitize_params_in_arr( $params, $params_rules );
448
449
450
451 if ( 'all' === $params['dates_selection'] ) { // All Dates
452
453 $dates_arr = array();
454
455 } elseif ( false !== strpos( $params['dates_selection'], '~' ) ) { // Range Days
456
457 $dates_arr = wpbc_get_dates_arr__from_dates_range( array(
458 'dates_separator' => ' ~ ', // ' ~ '
459 'dates' => $params['dates_selection'], // '2023-04-04 ~ 2023-04-07'
460 ) );
461
462 } else { // Multiple Days
463 $dates_arr = wpbc_get_dates_arr__from_dates_comma_separated( array(
464 'dates_separator' => ', ', // ', '
465 'dates' => $params['dates_selection'], // '2023-04-04, 2023-04-07, 2023-04-05'
466 ) );
467 }
468
469 $row_number = false;
470
471 global $wpdb;
472
473 // Remove dates ------------------------------------------------------------------------------------------------
474
475 // "DELETE FROM {$wpdb->prefix}booking_dates_props WHERE resource_id = %d AND prop_name = %s AND ( calendar_date = %s OR calendar_date = %s )"
476 $sql = "DELETE FROM {$wpdb->prefix}booking_dates_props WHERE resource_id = %d AND prop_name = %s ";
477
478 $sql_args = array();
479 $sql_args[] = $params['resource_id'];
480 $sql_args[] = $params['prop_name'];
481
482 // If we transfer here dates, instead of 'all', then we delete only such specific dates status from DB
483 if ( ! empty( $dates_arr ) ) {
484 $sub_sql = array();
485 foreach ( $dates_arr as $calendar_date ) {
486
487 $sub_sql[] = 'calendar_date = %s';
488 $sql_args[] = $calendar_date . ' 00:00:00';
489 }
490 if ( count( $sub_sql ) > 0 ) {
491 $sql .= ' AND ( ';
492 $sub_sql = implode( ' OR ', $sub_sql );
493 $sql .= $sub_sql;
494 $sql .= " )";
495 }
496 }
497 /* phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare */
498 $sql_prepared = $wpdb->prepare( $sql, $sql_args );
499 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.PreparedSQL.NotPrepared, PluginCheck.Security.DirectDB.UnescapedDBParameter
500 $row_number = $wpdb->query( $sql_prepared );
501
502 return $row_number;
503 }
504