PluginProbe
Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar / 2.0
Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar v2.0
2.1.21 2.1.20 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 trunk 1.1 2.0 2.0.1 2.0.10.2 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.17 2.0.18 2.0.2 2.0.20 2.0.21 2.0.22 All 55 releases
booking-manager / core / wpbm-functions.php

wpbm-functions.php in Booking Manager – Sync WP Booking Calendar – Import Events, Export Bookings to ICS Calendar 2.0, at core/wpbm-functions.php

2,170 lines 74.1 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 Manager
5 * @subpackage Support Functions
6 * @category Functions
7 *
8 * @author wpdevelop
9 * @link http://oplugins.com/
10 * @email info@oplugins.com
11 *
12 * @modified 29.09.2015
13 */
14
15 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
16
17
18 // <editor-fold defaultstate="collapsed" desc=" V e r s i o n s " >
19 ////////////////////////////////////////////////////////////////////////////////
20 // V e r s i o n s
21 ////////////////////////////////////////////////////////////////////////////////
22
23 /** Get version
24 *
25 * @return string
26 */
27 function get_wpbm_version(){
28 $version = 'free';
29 return $version;
30 }
31
32 /** Check if user accidentially update Booking Manager Paid version to Free
33 *
34 * @return bool
35 */
36 function wpbm_is_updated_paid_to_free() {
37
38 if ( ( wpbm_is_table_exists('wpbm_log') ) && ( ! class_exists('wpbm_personal') ) )
39 return true;
40 else
41 return false;
42 }
43
44 function wpbm_get_ver_sufix() {
45
46 if ( strpos( strtolower( WPBM_VERSION ), 'multisite' ) !== false ) {
47 $v_type = '-multi';
48 } else if ( strpos( strtolower( WPBM_VERSION ), 'develop' ) !== false ) {
49 $v_type = '-dev';
50 } else {
51 $v_type = '';
52 }
53 $v = '';
54 if ( class_exists( 'wpbm_personal' ) )
55 $v = 'ps' . $v_type;
56 if ( class_exists( 'wpbm_pro' ) )
57 $v = '';
58 return $v;
59 }
60
61 function wpbm_up_link() {
62 if ( ! wpbm_is_this_demo() )
63 $v = wpbm_get_ver_sufix();
64 else $v = '';
65 return 'http://oplugins.com/plugins/booking-manager/' . ( ( empty($v) ) ? '' : 'upgrade-' . $v . '/' ) ;
66 }
67
68 /** Check if this demo website
69 *
70 * @return bool
71 */
72 function wpbm_is_this_demo() {
73 //return ! true; //TODO: comment it. 2016-09-27 // Replaced!
74 if (
75 ( ( isset( $_SERVER['SCRIPT_FILENAME'] ) ) && ( strpos( $_SERVER['SCRIPT_FILENAME'], 'oplugins.com' ) !== false ) )
76 || ( ( isset( $_SERVER['HTTP_HOST'] ) ) && ( strpos( $_SERVER['HTTP_HOST'], 'oplugins.com' ) !== false ) )
77 )
78 return true;
79 else
80 return false;
81 }
82
83 /** Get Warning Text for Demo websites */
84 function wpbm_get_warning_text_in_demo_mode() {
85
86 return '<div class="wpbm-settings-notice notice-warning"><strong>Warning!</strong> Demo test version does not allow changes to these items.</div>';
87 }
88
89 /** Show System Info (status) at item > Settings General page
90 * Link: http://server.com/wp-admin/admin.php?page=wpbm-settings&system_info=show#wpbm_general_settings_system_info_metabox
91 */
92 function wpbm_system_info() {
93
94 if ( wpbm_is_this_demo() ) return;
95
96 if ( current_user_can( 'activate_plugins' ) ) { // Only for Administrator or Super admin. More here: https://codex.wordpress.org/Roles_and_Capabilities
97
98 global $wpdb, $wp_version;
99
100 $all_plugins = get_plugins();
101 $active_plugins = get_option( 'active_plugins' );
102
103 $mysql_info = $wpdb->get_results( "SHOW VARIABLES LIKE 'sql_mode'" );
104 if ( is_array( $mysql_info ) ) $sql_mode = $mysql_info[0]->Value;
105 if ( empty( $sql_mode ) ) $sql_mode = 'Not set';
106
107 $safe_mode = ( ini_get( 'safe_mode' ) ) ? 'On' : 'Off';
108 $allow_url_fopen = ( ini_get( 'allow_url_fopen' ) ) ? 'On' : 'Off';
109 $upload_max_filesize = ( ini_get( 'upload_max_filesize' ) ) ? ini_get( 'upload_max_filesize' ) : 'N/A';
110 $post_max_size = ( ini_get( 'post_max_size' ) ) ? ini_get( 'post_max_size' ) : 'N/A';
111 $max_execution_time = ( ini_get( 'max_execution_time' ) ) ? ini_get( 'max_execution_time' ) : 'N/A';
112 $memory_limit = ( ini_get( 'memory_limit' ) ) ? ini_get( 'memory_limit' ) : 'N/A';
113 $memory_usage = ( function_exists( 'memory_get_usage' ) ) ? round( memory_get_usage() / 1024 / 1024, 2 ) . ' Mb' : 'N/A';
114 $exif_read_data = ( is_callable( 'exif_read_data' ) ) ? 'Yes' . " ( V" . substr( phpversion( 'exif' ), 0, 4 ) . ")" : 'No';
115 $iptcparse = ( is_callable( 'iptcparse' ) ) ? 'Yes' : 'No';
116 $xml_parser_create = ( is_callable( 'xml_parser_create' ) ) ? 'Yes' : 'No';
117 $theme = ( function_exists( 'wp_get_theme' ) ) ? wp_get_theme() : get_theme( get_current_theme() );
118
119 if ( function_exists( 'is_multisite' ) ) {
120 if ( is_multisite() ) $multisite = 'Yes';
121 else $multisite = 'No';
122 } else { $multisite = 'N/A';
123 }
124
125 $system_info = array(
126 'system_info' => '',
127 'php_info' => '',
128 'active_plugins' => '',
129 'inactive_plugins' => ''
130 );
131
132 $ver_small_name = get_wpbm_version();
133 if ( class_exists( 'wpbm_multiuser' ) ) $ver_small_name = 'multiuser';
134
135 $system_info['system_info'] = array(
136 'Plugin Update' => ( defined( 'WPBM_VERSION' ) ) ? WPBM_VERSION : 'N/A',
137 'Plugin Version' => ucwords( $ver_small_name ),
138 'Plugin Update Date' => date( "Y-m-d", filemtime( WPBM_FILE ) ),
139
140 'WP Version' => $wp_version,
141 'WP DEBUG' => ( ( defined('WP_DEBUG') ) && ( WP_DEBUG ) ) ? 'On' : 'Off',
142 'WP DB Version' => get_option( 'db_version' ),
143 'Operating System' => PHP_OS,
144 'Server' => $_SERVER["SERVER_SOFTWARE"],
145 'PHP Version' => PHP_VERSION,
146 'PHP Safe Mode' => $safe_mode,
147 'MYSQL Version' => $wpdb->get_var( "SELECT VERSION() AS version" ),
148 'SQL Mode' => $sql_mode,
149 'Memory usage' => $memory_usage,
150 'Site URL' => get_option( 'siteurl' ),
151 'Home URL' => home_url(),
152 'SERVER[HTTP_HOST]' => $_SERVER['HTTP_HOST'],
153 'SERVER[SERVER_NAME]' => $_SERVER['SERVER_NAME'],
154 'Multisite' => $multisite,
155 'Active Theme' => $theme['Name'] . ' ' . $theme['Version']
156 );
157
158 $system_info['php_info'] = array(
159 'PHP Version' => PHP_VERSION,
160 'PHP Safe Mode' => $safe_mode,
161 'PHP Memory Limit' => '<strong>' . $memory_limit . '</strong>',
162 'PHP Max Script Execute Time' => '<strong>' . $max_execution_time . '</strong>',
163
164 'PHP Max Post Size' => '<strong>' . $post_max_size . '</strong>',
165 'PHP MAX Input Vars' => '<strong>' . ( ( ini_get( 'max_input_vars' ) ) ? ini_get( 'max_input_vars' ) : 'N/A' ) . '</strong>', //How many input variables may be accepted (limit is applied to $_GET, $_POST and $_COOKIE superglobal separately).
166
167 'PHP Max Upload Size' => $upload_max_filesize,
168 'PHP Allow URL fopen' => $allow_url_fopen,
169 'PHP Exif support' => $exif_read_data,
170 'PHP IPTC support' => $iptcparse,
171 'PHP XML support' => $xml_parser_create
172 );
173
174 $system_info['php_info']['PHP cURL'] = ( function_exists('curl_init') ) ? 'On' : 'Off';
175 $system_info['php_info']['Max Nesting Level'] = ( ( ini_get( 'max_input_nesting_level' ) ) ? ini_get( 'max_input_nesting_level' ) : 'N/A' );
176 $system_info['php_info']['Max Time 4 script'] = ( ( ini_get( 'max_input_time' ) ) ? ini_get( 'max_input_time' ) : 'N/A' ); //Maximum amount of time each script may spend parsing request data
177 $system_info['php_info']['Log'] = ( ( ini_get( 'error_log' ) ) ? ini_get( 'error_log' ) : 'N/A' );
178
179 if ( ini_get( "suhosin.get.max_value_length" ) ) {
180
181 $system_info['suhosin_info'] = array();
182 $system_info['suhosin_info']['POST max_array_index_length'] = ( ( ini_get( 'suhosin.post.max_array_index_length' ) ) ? ini_get( 'suhosin.post.max_array_index_length' ) : 'N/A' );
183 $system_info['suhosin_info']['REQUEST max_array_index_length'] = ( ( ini_get( 'suhosin.request.max_array_index_length' ) ) ? ini_get( 'suhosin.request.max_array_index_length' ) : 'N/A' );
184
185 $system_info['suhosin_info']['POST max_totalname_length'] = ( ( ini_get( 'suhosin.post.max_totalname_length' ) ) ? ini_get( 'suhosin.post.max_totalname_length' ) : 'N/A' );
186 $system_info['suhosin_info']['REQUEST max_totalname_length'] = ( ( ini_get( 'suhosin.request.max_totalname_length' ) ) ? ini_get( 'suhosin.request.max_totalname_length' ) : 'N/A' );
187
188 $system_info['suhosin_info']['POST max_vars'] = ( ( ini_get( 'suhosin.post.max_vars' ) ) ? ini_get( 'suhosin.post.max_vars' ) : 'N/A' );
189 $system_info['suhosin_info']['REQUEST max_vars'] = ( ( ini_get( 'suhosin.request.max_vars' ) ) ? ini_get( 'suhosin.request.max_vars' ) : 'N/A' );
190
191 $system_info['suhosin_info']['POST max_value_length'] = ( ( ini_get( 'suhosin.post.max_value_length' ) ) ? ini_get( 'suhosin.post.max_value_length' ) : 'N/A' );
192 $system_info['suhosin_info']['REQUEST max_value_length'] = ( ( ini_get( 'suhosin.request.max_value_length' ) ) ? ini_get( 'suhosin.request.max_value_length' ) : 'N/A' );
193
194 $system_info['suhosin_info']['POST max_name_length'] = ( ( ini_get( 'suhosin.post.max_name_length' ) ) ? ini_get( 'suhosin.post.max_name_length' ) : 'N/A' );
195 $system_info['suhosin_info']['REQUEST max_varname_length'] = ( ( ini_get( 'suhosin.request.max_varname_length' ) ) ? ini_get( 'suhosin.request.max_varname_length' ) : 'N/A' );
196
197 $system_info['suhosin_info']['POST max_array_depth'] = ( ( ini_get( 'suhosin.post.max_array_depth' ) ) ? ini_get( 'suhosin.post.max_array_depth' ) : 'N/A' );
198 $system_info['suhosin_info']['REQUEST max_array_depth'] = ( ( ini_get( 'suhosin.request.max_array_depth' ) ) ? ini_get( 'suhosin.request.max_array_depth' ) : 'N/A' );
199 }
200
201
202 if ( function_exists('gd_info') ) {
203 $gd_info = gd_info();
204 if ( isset( $gd_info['GD Version'] ) )
205 $gd_info = $gd_info['GD Version'];
206 else
207 $gd_info = json_encode( $gd_info );
208 } else {
209 $gd_info = 'Off';
210 }
211 $system_info['php_info']['PHP GD'] = $gd_info;
212
213 // More here https://docs.woocommerce.com/document/problems-with-large-amounts-of-data-not-saving-variations-rates-etc/
214
215
216 foreach ( $all_plugins as $path => $plugin ) {
217 if ( is_plugin_active( $path ) )
218 $system_info['active_plugins'][$plugin['Name']] = $plugin['Version'];
219 else
220 $system_info['inactive_plugins'][$plugin['Name']] = $plugin['Version'];
221 }
222
223 // Showing
224 foreach ( $system_info as $section_name => $section_values ) {
225 ?>
226 <span class="wpdevelop">
227 <table class="table table-striped table-bordered">
228 <thead><tr><th colspan="2" style="border-bottom: 1px solid #eeeeee;padding: 10px;"><?php echo strtoupper( $section_name ); ?></th></tr></thead>
229 <tbody>
230 <?php
231 if ( !empty( $section_values ) ) {
232 foreach ( $section_values as $key => $value ) {
233 ?>
234 <tr>
235 <td scope="row" style="width:18em;padding:4px 8px;"><?php echo $key; ?></td>
236 <td scope="row" style="padding:4px 8px;"><?php echo $value; ?></td>
237 </tr>
238 <?php
239 }
240 }
241 ?>
242 </tbody>
243 </table>
244 </span>
245 <div class="clear"></div>
246 <?php
247 }
248 ?>
249 <hr>
250 <div style="color:#777;">
251 <h4 style="font-size:1.1em;">Commonly required configuration vars in php.ini file:</h4>
252 <h4>General section:</h4>
253 <pre><code>memory_limit = 256M
254 max_execution_time = 120
255 post_max_size = 8M
256 upload_max_filesize = 8M
257 max_input_vars = 20480
258 post_max_size = 64M</code></pre>
259 <h4>Suhosin section (if installed):</h4>
260 <pre><code>suhosin.post.max_array_index_length = 1024
261 suhosin.post.max_totalname_length = 65535
262 suhosin.post.max_vars = 2048
263 suhosin.post.max_value_length = 1000000
264 suhosin.post.max_name_length = 256
265 suhosin.post.max_array_depth = 1000
266 suhosin.request.max_array_index_length = 1024
267 suhosin.request.max_totalname_length = 65535
268 suhosin.request.max_vars = 2048
269 suhosin.request.max_value_length = 1000000
270 suhosin.request.max_varname_length = 256
271 suhosin.request.max_array_depth = 1000</code></pre>
272 </div>
273 <?php
274 // phpinfo();
275 }
276 }
277
278
279
280 /** Check if "Booking Calendar" installed/activated and return version number
281 *
282 * @return string - 0 if not installed, otherwise version num
283 */
284 function wpbm_get_wpbc_version() {
285
286 if ( ! defined( 'WP_BK_VERSION_NUM' ) )
287 return 0;
288 else
289 return WP_BK_VERSION_NUM;
290 }
291
292 /** Is activated Booking Calendar support WPBM
293 *
294 * @return boolean
295 */
296 function wpbm_is_wpbc_supported() {
297
298 // 7.2.1 - its start version of Booking Calendar which support integration with Booking Manager 2.0
299
300 if ( version_compare( wpbm_get_wpbc_version(), '7.2.1') >= 0 ) {
301 return true;
302 } else {
303 return false;
304 }
305 }
306
307 // </editor-fold>
308
309
310 // <editor-fold defaultstate="collapsed" desc=" F o r m a t t i n g " >
311 ////////////////////////////////////////////////////////////////////////////////
312 // F o r m a t t i n g
313 ////////////////////////////////////////////////////////////////////////////////
314 /**
315 * Sanitize term to Slug format (no spaces, lowercase).
316 * urldecode - reverse munging of UTF8 characters.
317 *
318 * @param mixed $value
319 * @return string
320 */
321 function wpbm_get_slug_format( $value ) {
322 return urldecode( sanitize_title( $value ) );
323 }
324
325 /**
326 * Get Slug Format Option Value for saving to the options table.
327 * Replacing - to _ and restrict length to 64 characters.
328 *
329 * @param string $value
330 * @return string
331 */
332 function wpbm_get_slug_format_4_option_name( $value ) {
333
334 $value = wpbm_get_slug_format( $value );
335 $value = str_replace('-', '_', $value);
336 $value = substr($value, 0, 64);
337 return $value;
338 }
339
340 /** Insert New Line symbols after <br> tags. Usefull for the settings pages to show in redable view
341 *
342 * @param type $param
343 * @return type
344 */
345 function wpbm_nl_after_br($param) {
346
347 $value = preg_replace( "@(&lt;|<)br\s*/?(&gt;|>)(\r\n)?@", "<br/>", $param );
348
349 return $value;
350 }
351
352 /**
353 * Replace ** to <strong> and * to <em>
354 *
355 * @param String $text
356 * @return string
357 */
358 if ( ! function_exists( 'wpbm_recheck_strong_symbols' ) ) {
359 function wpbm_recheck_strong_symbols( $text ){
360
361 $patterns = '/(\*\*)(\s*[^\*\*]*)(\*\*)/';
362 $replacement = '<strong>${2}</strong>';
363 $value_return = preg_replace($patterns, $replacement, $text);
364
365 $patterns = '/(\*)(\s*[^\*]*)(\*)/';
366 $replacement = '<em>${2}</em>';
367 $value_return = preg_replace($patterns, $replacement, $value_return);
368
369 return $value_return;
370 }
371 }
372
373
374 /** Esacpe and replace any HTML entities
375 *
376 * @param type $string
377 * @return string
378 */
379 function wpbm_esc_to_plain_text( $string ) {
380
381 // //Replace <a href="http://server.com">Link</a> to Link( http://server.com )
382 // $pattern = "/<a(.*)+href=[\"|']+([^\"']+)(?=(\"|'))[^>]*>(.*)<\/a>/" ; //"/(?<=href=(\"|'))[^\"']+(?=(\"|'))/i";
383 // $newurl = "$4 ($2)";
384 // $string = preg_replace($pattern,$newurl,$string);
385
386
387 // List of preg* regular expression patterns to search for replace in plain emails. More: https://raw.github.com/ushahidi/wp-silcc/master/class.html2text.inc
388 $plain_search_array = array(
389 "/\r/", // Non-legal carriage return
390 '/&(nbsp|#160);/i', // Non-breaking space
391 '/&(quot|rdquo|ldquo|#8220|#8221|#147|#148);/i', // Double quotes
392 '/&(apos|rsquo|lsquo|#8216|#8217);/i', // Single quotes
393 '/&gt;/i', // Greater-than
394 '/&lt;/i', // Less-than
395 '/&#38;/i', // Ampersand
396 '/&#038;/i', // Ampersand
397 '/&amp;/i', // Ampersand
398 '/&(copy|#169);/i', // Copyright
399 '/&(trade|#8482|#153);/i', // Trademark
400 '/&(reg|#174);/i', // Registered
401 '/&(mdash|#151|#8212);/i', // mdash
402 '/&(ndash|minus|#8211|#8722);/i', // ndash
403 '/&(bull|#149|#8226);/i', // Bullet
404 '/&(pound|#163);/i', // Pound sign
405 '/&(euro|#8364);/i', // Euro sign
406 '/&#36;/', // Dollar sign
407 '/&[^&;]+;/i', // Unknown/unhandled entities
408 '/[ ]{2,}/' // Runs of spaces, post-handling
409 );
410
411 // List of symbols for Replace
412 $get_plain_replace_array = array(
413 '', // Non-legal carriage return
414 ' ', // Non-breaking space
415 '"', // Double quotes
416 "'", // Single quotes
417 '>', // Greater-than
418 '<', // Less-than
419 '&', // Ampersand
420 '&', // Ampersand
421 '&', // Ampersand
422 '(c)', // Copyright
423 '(tm)', // Trademark
424 '(R)', // Registered
425 '--', // mdash
426 '-', // ndash
427 '*', // Bullet
428 '£', // Pound sign
429 'EUR', // Euro sign. € ?
430 '$', // Dollar sign
431 '', // Unknown/unhandled entities
432 ' ' // Runs of spaces, post-handling
433 );
434
435 $newstring = preg_replace( $plain_search_array, $get_plain_replace_array, strip_tags( $string ) );
436
437 return $newstring;
438 }
439 // </editor-fold>
440
441
442 // <editor-fold defaultstate="collapsed" desc=" S u p p o r t " >
443 ////////////////////////////////////////////////////////////////////////////////
444 // S u p p o r t Functions
445 ////////////////////////////////////////////////////////////////////////////////
446
447 /** Replace shortcodes in string
448 *
449 * @param string $subject - string to manipulate
450 * @param array $replace_array - array with values to replace // array( [wpbm_id] => 9, [id] => 9, [dates] => July 3, 2016 14:00 - July 4, 2016 16:00, .... )
451 * @param mixed $replace_unknown_shortcodes - replace unknown params, if false, then no replace unknown params
452 * @return string
453 */
454 function wpbm_replace_shortcodes( $subject, $replace_array , $replace_unknown_shortcodes = ' ' ) {
455
456 $defaults = array(
457 'ip' => apply_wpbm_filter( 'wpbm_get_user_ip' )
458 , 'blogname' => wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES )
459 , 'siteurl' => get_site_url()
460 );
461
462 $replace = wp_parse_args( $replace_array, $defaults );
463
464 foreach ( $replace as $replace_shortcode => $replace_value ) {
465
466 $subject = str_replace( array( '[' . $replace_shortcode . ']'
467 , '{' . $replace_shortcode . '}' )
468 , $replace_value
469 , $subject );
470 }
471
472 // Remove all shortcodes, which is not replaced early.
473 if ( $replace_unknown_shortcodes !== false )
474 $subject = preg_replace( '/[\s]{0,}[\[\{]{1}[a-zA-Z][0-9a-zA-Z:._-]{0,}[\]\}]{1}[\s]{0,}/', $replace_unknown_shortcodes, $subject );
475
476
477 return $subject;
478 }
479
480 /** Simple hack to make array strings lowercase
481 *
482 * @param type $array
483 * @return type
484 */
485 function wpbm_arraytolower( $array ){
486 return unserialize( strtolower( serialize( $array ) ) );
487 }
488
489 /** Support 'hash_equals' this function at older servers than PHP 5.6.0 */
490 if ( !function_exists( 'hash_equals' ) ) {
491 function hash_equals( $known_string, $user_string ) {
492 $ret = 0;
493
494 if ( strlen( $known_string ) !== strlen( $user_string ) ) {
495 $user_string = $known_string;
496 $ret = 1;
497 }
498
499 $res = $known_string ^ $user_string;
500
501 for ( $i = strlen( $res ) - 1; $i >= 0; --$i ) {
502 $ret |= ord( $res[$i] );
503 }
504
505 return !$ret;
506 }
507 }
508
509 /** Check if this valid timestamp
510 *
511 * @param string|int $timestamp
512 * @return bool
513 */
514 function wpbm_is_valid_timestamp( $timestamp ) {
515 return ( ( (string) (int) $timestamp === $timestamp)
516 && ($timestamp <= PHP_INT_MAX)
517 && ($timestamp >= ~PHP_INT_MAX)
518 );
519 }
520 // </editor-fold>
521
522
523 // <editor-fold defaultstate="collapsed" desc=" F i l e s && U R L s " >
524 ////////////////////////////////////////////////////////////////////////////////
525 // F i l e s && U R L s
526 ////////////////////////////////////////////////////////////////////////////////
527
528 /** Get absolute URL to relative plugin path.
529 * Depend from the WPBM_MIN contant can be load minified version of file, if its exist
530 * @param string $path - path
531 * @return string
532 */
533 function wpbm_plugin_url( $path ) {
534
535 if ( ( defined( 'WPBM_MIN' ) ) && ( WPBM_MIN ) ){
536 $path_min = $path;
537 if ( substr( $path_min , -3 ) === '.js' ) {
538 $path_min = substr( $path_min , 0, -3 ) . '.min.js';
539 }
540 if ( substr( $path_min , -4 ) === '.css' ) {
541 $path_min = substr( $path_min , 0, -4 ) . '.min.css';
542 }
543 if ( file_exists( trailingslashit( WPBM_PLUGIN_DIR ) . ltrim( $path_min, '/\\' ) ) ) // check if this file exist
544 return trailingslashit( WPBM_PLUGIN_URL ) . ltrim( $path_min, '/\\' );
545 }
546 return trailingslashit( WPBM_PLUGIN_URL ) . ltrim( $path, '/\\' );
547 }
548
549 /** Check if such file exist or not.
550 *
551 * @param string $path - relative path to file (relative to plugin folder).
552 * @return boolean true | false
553 */
554 function wpbm_is_file_exist( $path ) {
555
556 if ( file_exists( trailingslashit( WPBM_PLUGIN_DIR ) . ltrim( $path, '/\\' ) ) ) // check if this file exist
557 return true;
558 else
559 return false;
560 }
561
562 /** Set URL from absolute to relative (starting from /)
563 *
564 * @param type $url
565 * @return type
566 */
567 function wpbm_set_relative_url( $url ){
568
569 $url = esc_url_raw($url);
570
571 $url_path = parse_url($url, PHP_URL_PATH);
572 $url_path = ( empty($url_path) ? $url : $url_path );
573
574 $url = trim($url_path, '/');
575 return '/' . $url;
576 }
577
578 /** Get Correct Relative URL
579 *
580 * @param type $link
581 * @return string
582 */
583 function wpbm_make_link_relative( $link ){
584
585 if ( $link == get_option('siteurl') )
586 $link = '/';
587 $link = '/' . trim( wp_make_link_relative( $link ), '/' );
588
589 return $link;
590 }
591
592 /** Get Correct Absolute URL
593 *
594 * @param string $link
595 * @return type
596 */
597 function wpbm_make_link_absolute( $link ){
598
599 if ( ( $link != get_option('siteurl') ) && ( strpos($link, 'http') !== 0 ) )
600 $link = get_option('siteurl') . '/' . trim( wp_make_link_relative( $link ), '/' );
601 return esc_js( $link ) ;
602 }
603
604
605 if (!function_exists ('get_file_data_wpdev')) {
606
607 /** Get header info from this file, just for compatibility with WordPress 2.8 and older versions
608 *
609 * @param type $file
610 * @param type $default_headers
611 * @param type $context
612 * @return type
613 */
614 function get_file_data_wpdev( $file, $default_headers, $context = '' ) {
615 // We don't need to write to the file, so just open for reading.
616 $fp = fopen( $file, 'r' );
617
618 // Pull only the first 8kiB of the file in.
619 $file_data = fread( $fp, 8192 );
620
621 // PHP will close file handle, but we are good citizens.
622 fclose( $fp );
623
624 if( $context != '' ) {
625 $extra_headers = array(); //apply_filters( "extra_$context".'_headers', array() );
626
627 $extra_headers = array_flip( $extra_headers );
628 foreach( $extra_headers as $key=>$value ) {
629 $extra_headers[$key] = $key;
630 }
631 $all_headers = array_merge($extra_headers, $default_headers);
632 } else {
633 $all_headers = $default_headers;
634 }
635
636 foreach ( $all_headers as $field => $regex ) {
637 preg_match( '/' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, ${$field});
638 if ( !empty( ${$field} ) )
639 ${$field} = trim(preg_replace("/\s*(?:\*\/|\?>).*/", '', ${$field}[1] ));
640 else
641 ${$field} = '';
642 }
643
644 $file_data = compact( array_keys( $all_headers ) );
645
646 return $file_data;
647 }
648 }
649
650
651 /** Get content from specific URL
652 *
653 * @param string $url
654 * @return string|boolean (false on error)
655 */
656 function wpbm_get_ssl_page_content( $url ) {
657
658 $request = new WP_Http();
659
660 $result = $request->request( $url
661 , array( // Default Parameters
662 // 'method' => 'GET',
663 // 'timeout' => 5, // timeout value for an HTTP request.
664 // 'redirection' => 5, // number of redirects allowed during an HTTP request.
665 // 'httpversion' => '1.0',
666 // 'user-agent' => 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ),
667 // 'reject_unsafe_urls' => false,
668 // 'blocking' => true,
669 // 'headers' => array(),
670 // 'cookies' => array(),
671 // 'body' => null,
672 // 'compress' => false,
673 // 'decompress' => true,
674 // 'sslverify' => true,
675 // 'sslcertificates' => ABSPATH . WPINC . '/certificates/ca-bundle.crt',
676 // 'stream' => false,
677 // 'filename' => null,
678 // 'limit_response_size' => null
679 )
680 );
681
682 if (
683 ( ! is_wp_error( $result ) )
684 && ( $result[ 'response' ][ 'code' ] == '200' )
685 ) {
686
687 return $result[ 'body' ];
688
689 } else {
690 return false;
691 }
692 }
693
694
695
696 /** Count the number of bytes of a given string.
697 * Input string is expected to be ASCII or UTF-8 encoded.
698 * Warning: the function doesn't return the number of chars
699 * in the string, but the number of bytes.
700 * See http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
701 * for information on UTF-8.
702 *
703 * @param string $str The string to compute number of bytes
704 *
705 * @return The length in bytes of the given string.
706 */
707 function wpbm_get_bytes_from_str( $str ) {
708 // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
709 // Number of characters in string
710 $strlen_var = strlen( $str );
711
712 $d = 0; // string bytes counter
713
714 // Iterate over every character in the string, escaping with a slash or encoding to UTF-8 where necessary
715 for ( $c = 0; $c < $strlen_var; ++ $c ) {
716 $ord_var_c = ord( $str{$c} );
717 switch ( true ) {
718 case(($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): // characters U-00000000 - U-0000007F (same as ASCII)
719 $d ++;
720 break;
721 case(($ord_var_c & 0xE0) == 0xC0): // characters U-00000080 - U-000007FF, mask 110XXXXX
722 $d += 2;
723 break;
724 case(($ord_var_c & 0xF0) == 0xE0): // characters U-00000800 - U-0000FFFF, mask 1110XXXX
725 $d += 3;
726 break;
727 case(($ord_var_c & 0xF8) == 0xF0): // characters U-00010000 - U-001FFFFF, mask 11110XXX
728 $d += 4;
729 break;
730 case(($ord_var_c & 0xFC) == 0xF8): // characters U-00200000 - U-03FFFFFF, mask 111110XX
731 $d += 5;
732 break;
733 case(($ord_var_c & 0xFE) == 0xFC): // characters U-04000000 - U-7FFFFFFF, mask 1111110X
734 $d += 6;
735 break;
736 default:
737 $d ++;
738 }
739 }
740 return $d;
741 }
742
743
744 // </editor-fold>
745
746
747 // <editor-fold defaultstate="collapsed" desc=" A d m i n M e n u L i n k s " >
748 ////////////////////////////////////////////////////////////////////////////
749 // A d m i n M e n u L i n k s
750 ////////////////////////////////////////////////////////////////////////////
751
752 /** Get URL to specific Admin Menu page
753 *
754 * @param string $menu_type - { item | add | resources | settings }
755 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
756 * @return string - URL to menu
757 */
758 function wpbm_get_menu_url( $menu_type, $is_absolute_url = true ) {
759
760 switch ( $menu_type) {
761
762 case 'master': // Master
763 $link = 'oplugins&tab=wpbm';
764 break;
765
766 case 'add': // Add New
767 case 'new': // Add New
768 $link = 'oplugins&wpbm-new';
769 break;
770
771 case 'settings': // Settings
772 case 'options':
773 $link = 'oplugins&tab=wpbm-settings';
774 break;
775
776 default: // Master
777 $link = 'oplugins';
778 break;
779 }
780
781 if ( $is_absolute_url ) {
782 $link = admin_url( 'admin.php' ) . '?page=' . $link ;
783 }
784
785 return $link;
786 }
787
788 // // // // // // // // // // // // // // // // // // // // // // // // // /
789
790 /** Get URL of item Listing or Calendar Overview page
791 *
792 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
793 * @param boolean $is_old - { default: true }
794 * @return string - URL to menu
795 */
796 function wpbm_get_master_url( $is_absolute_url = true ) {
797 return wpbm_get_menu_url( 'master', $is_absolute_url );
798 }
799
800 /** Get URL of item > Add item page
801 *
802 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
803 * @param boolean $is_old - { default: true }
804 * @return string - URL to menu
805 */
806 function wpbm_get_new_wpbm_url( $is_absolute_url = true ) {
807 return wpbm_get_menu_url( 'add', $is_absolute_url );
808 }
809
810 /** Get URL of item > Settings page
811 *
812 * @param boolean $is_absolute_url - Absolute or relative url { default: true }
813 * @param boolean $is_old - { default: true }
814 * @return string - URL to menu
815 */
816 function wpbm_get_settings_url( $is_absolute_url = true ) {
817 return wpbm_get_menu_url( 'settings', $is_absolute_url );
818 }
819
820 // // // // // // // // // // // // // // // // // // // // // // // // // /
821
822 /** Check if this item Listing or Calendar Overview page
823 * @param string $server_param - 'REQUEST_URI' | 'HTTP_REFERER' Default: 'REQUEST_URI'
824 * @return boolean true | false
825 */
826 function wpbm_is_master_page( $server_param = 'REQUEST_URI' ) {
827
828 if ( ( is_admin() ) &&
829 ( strpos($_SERVER[ $server_param ],'page=oplugins') !== false ) &&
830 ( strpos($_SERVER[ $server_param ],'tab=wpbm-') === false ) && // not the settings
831 ( ( strpos($_SERVER[ $server_param ],'tab=wpbm') !== false ) // tab specified
832 || ( strpos($_SERVER[ $server_param ],'tab=') === false ) ) // or tab not specified at all
833 ) {
834 return true;
835 }
836 return false;
837 }
838
839 /** Check if this item > Add item page
840 * @param string $server_param - 'REQUEST_URI' | 'HTTP_REFERER' Default: 'REQUEST_URI'
841 * @return boolean true | false
842 */
843 function wpbm_is_new_wpbm_page( $server_param = 'REQUEST_URI' ) {
844
845 if ( ( is_admin() ) &&
846 ( strpos($_SERVER[ $server_param ],'page=oplugins') !== false ) &&
847 ( strpos($_SERVER[ $server_param ],'tab=wpbm-new') !== false )
848 ) {
849 return true;
850 }
851 return false;
852 }
853
854
855 /** Check if this item > Settings page
856 * @param string $server_param - 'REQUEST_URI' | 'HTTP_REFERER' Default: 'REQUEST_URI'
857 * @return boolean true | false
858 */
859 function wpbm_is_settings_page( $server_param = 'REQUEST_URI' ) {
860
861 if ( ( is_admin() ) &&
862 ( strpos($_SERVER[ $server_param ],'page=oplugins') !== false ) &&
863 ( strpos($_SERVER[ $server_param ],'tab=wpbm-settings') !== false )
864 ) {
865 return true;
866 }
867 return false;
868 }
869
870 // </editor-fold>
871
872
873 // <editor-fold defaultstate="collapsed" desc=" A d m i n U I E l e m e n t s " >
874 ////////////////////////////////////////////////////////////////////////////
875 // A d m i n U I E l e m e n t s
876 ////////////////////////////////////////////////////////////////////////////
877
878 /** Get Number of new items
879 *
880 * @return int
881 */
882 function wpbm_get_number_new_items(){
883 return 0;
884 }
885
886
887 /** Show Admin B A R .
888 *
889 * @global type $wp_admin_bar
890 * @return type
891 */
892 function wp_admin_bar_items_menu(){
893
894 global $wp_admin_bar;
895
896 $current_user = wp_get_current_user();
897
898 $curr_user_role = get_wpbm_option( 'wpbm_user_role_master' );
899 $level = 10;
900 if ($curr_user_role == 'administrator') $level = 10;
901 else if ($curr_user_role == 'editor') $level = 7;
902 else if ($curr_user_role == 'author') $level = 2;
903 else if ($curr_user_role == 'contributor') $level = 1;
904 else if ($curr_user_role == 'subscriber') $level = 0;
905
906 if ( ( $current_user->user_level < $level ) || ! is_admin_bar_showing() )
907 return;
908
909
910 $update_count = wpbm_get_number_new_items(); // 0
911
912 $title = 'Booking Manager';
913 $update_title = $title;
914
915
916 if ( $update_count > 0 ) {
917 $update_count_title = "&nbsp;<span id='ab-updates' class='wpbm-count bk-update-count' >" . number_format_i18n($update_count) . "</span>" ; //id='wpbm-count'
918 $update_title .= $update_count_title;
919 }
920
921 $link_items = wpbm_get_master_url();
922 $link_settings = wpbm_get_settings_url();
923
924
925 $wp_admin_bar->add_menu(
926 array(
927 'id' => 'bar_wpbm',
928 'title' => $update_title ,
929 'href' => wpbm_get_master_url()
930 )
931 );
932
933
934 $curr_user_role_settings = get_wpbm_option( 'wpbm_user_role_settings' );
935 $level = 10;
936 if ($curr_user_role_settings == 'administrator') $level = 10;
937 else if ($curr_user_role_settings == 'editor') $level = 7;
938 else if ($curr_user_role_settings == 'author') $level = 2;
939 else if ($curr_user_role_settings == 'contributor') $level = 1;
940 else if ($curr_user_role_settings == 'subscriber') $level = 0;
941
942 if ( ( ($current_user->user_level < $level) ) || !is_admin_bar_showing() ) return;
943
944 $wp_admin_bar->add_menu(
945 array(
946 'id' => 'bar_wpbm_new',
947 'title' => __( 'Add New', 'booking-manager'),
948 'href' => wpbm_get_new_wpbm_url(),
949 'parent' => 'bar_wpbm',
950 )
951 );
952
953
954
955 $wp_admin_bar->add_menu(
956 array(
957 'id' => 'bar_wpbm_settings',
958 'title' => __( 'Settings', 'booking-manager'),
959 'href' => wpbm_get_settings_url(),
960 'parent' => 'bar_wpbm',
961 )
962 );
963
964 $wp_admin_bar->add_menu(
965 array(
966 'id' => 'bar_wpbm_settings_email',
967 'title' => __( 'Emails', 'booking-manager'),
968 'href' => $link_settings . '&tab=email',
969 'parent' => 'bar_wpbm_settings'
970 )
971 );
972
973 }
974 // add_action( 'admin_bar_menu', 'wp_admin_bar_items_menu', 70 ); // Add Admin Bar
975
976
977 /** Show Rating link at footer */
978 function wpbm_show_wpbm_footer(){
979
980 if ( ! wpbm_is_this_demo() ) {
981
982 $message = sprintf( __( 'If you like %s please leave us a %s rating. A huge thank you in advance!', 'booking-manager')
983 , '<strong>Booking Manager</strong>' . ' ' . WPBM_VERSION_NUM
984 , '<a href="https://wordpress.org/support/plugin/booking-manager/reviews/#new-post" target="_blank" title="' . esc_attr__( 'Thanks :)', 'booking-manager') . '">'
985 . '&#9733;&#9733;&#9733;&#9733;&#9733;'
986 . '</a>'
987 );
988
989 echo '<div id="wpbm-footer" style="position:absolute;bottom:40px;text-align:left;width:95%;font-size:0.9em;text-shadow:0 1px 0 #fff;margin:0;color:#888;">' . $message . '</div>';
990 ?>
991 <script type="text/javascript">
992 jQuery(document).ready(function(){
993 jQuery('#wpfooter').append( jQuery('#wpbm-footer') );
994 });
995 </script>
996 <?php
997 }
998 }
999 // </editor-fold>
1000
1001
1002 // <editor-fold defaultstate="collapsed" desc=" DB - cheking if table, field or index exists " >
1003 ////////////////////////////////////////////////////////////////////////////
1004 // DB - cheking if table, field or index exists
1005 ////////////////////////////////////////////////////////////////////////////
1006
1007 /**
1008 * Check if table exist
1009 *
1010 * @global type $wpdb
1011 * @param string $tablename
1012 * @return 0|1
1013 */
1014 function wpbm_is_table_exists( $tablename ) {
1015
1016 global $wpdb;
1017
1018 if ( (! empty($wpdb->prefix) ) && ( strpos($tablename, $wpdb->prefix) === false ) )
1019 $tablename = $wpdb->prefix . $tablename ;
1020
1021 $sql_check_table = $wpdb->prepare("SHOW TABLES LIKE %s" , $tablename ); //FixIn 5.4.3
1022
1023 $res = $wpdb->get_results( $sql_check_table );
1024
1025 return count($res); //FixIn 5.4.3
1026 /*
1027 $sql_check_table = $wpdb->prepare("
1028 SELECT COUNT(*) AS count
1029 FROM information_schema.tables
1030 WHERE table_schema = '". DB_NAME ."'
1031 AND table_name = %s " , $tablename );
1032
1033 $res = $wpdb->get_results( $sql_check_table );
1034 return $res[0]->count;*/
1035 }
1036
1037
1038 /**
1039 * Check if table exist
1040 *
1041 * @global type $wpdb
1042 * @param string $tablename
1043 * @param type $fieldname
1044 * @return 0|1
1045 */
1046 function wpbm_is_field_in_table_exists( $tablename , $fieldname) {
1047 global $wpdb;
1048 if ( (! empty($wpdb->prefix) ) && ( strpos($tablename, $wpdb->prefix) === false ) ) $tablename = $wpdb->prefix . $tablename ;
1049 $sql_check_table = "SHOW COLUMNS FROM {$tablename}" ;
1050
1051 $res = $wpdb->get_results( $sql_check_table );
1052
1053 foreach ($res as $fld) {
1054 if ($fld->Field == $fieldname) return 1;
1055 }
1056
1057 return 0;
1058 }
1059
1060
1061 /**
1062 * Check if index exist
1063 *
1064 * @global type $wpdb
1065 * @param string $tablename
1066 * @param type $fieldindex
1067 * @return 0|1
1068 */
1069 function wpbm_is_index_in_table_exists( $tablename , $fieldindex) {
1070 global $wpdb;
1071 if ( (! empty($wpdb->prefix) ) && ( strpos($tablename, $wpdb->prefix) === false ) ) $tablename = $wpdb->prefix . $tablename ;
1072 $sql_check_table = $wpdb->prepare("SHOW INDEX FROM {$tablename} WHERE Key_name = %s", $fieldindex );
1073 $res = $wpdb->get_results( $sql_check_table );
1074 if (count($res)>0) return 1;
1075 else return 0;
1076 }
1077
1078 // </editor-fold>
1079
1080
1081 // <editor-fold defaultstate="collapsed" desc=" E s c a p i n g " >
1082 ////////////////////////////////////////////////////////////////////////////
1083 // E s c a p i n g
1084 ////////////////////////////////////////////////////////////////////////////
1085
1086 /** Transform the REQESTS parameters (GET and POST) into URL
1087 *
1088 * @param type $page_param
1089 * @param array $exclude_params
1090 * @param type $only_these_parameters
1091 * @return type
1092 */
1093 function wpbm_get_params_in_url( $page_param , $exclude_params = array(), $only_these_parameters = false, $is_escape_url = false, $only_get = false ){
1094
1095 $exclude_params[] = 'page';
1096
1097 if ( isset( $_GET['page'] ) )
1098 $page_param = $_GET['page'];
1099
1100 $get_paramaters = array( 'page' => $page_param );
1101
1102 if ( $only_get )
1103 $check_params = $_GET;
1104 else
1105 $check_params = $_REQUEST;
1106 //debuge($check_params);
1107 foreach ( $check_params as $prm_key => $prm_value ) {
1108
1109 // Skip parameters arrays, like $_GET['rvaluation_to'] = Array ( [0] => 6, [1] => 14, [2] => 14 )
1110 if (
1111 ( is_string( $prm_value ) )
1112 || ( is_numeric( $prm_value ) )
1113 ) {
1114
1115 if ( strlen( $prm_value ) > 1000 ) { // Check about TOOO long parameters, if it exist then reset it.
1116 $prm_value = '';
1117 }
1118
1119 if ( ! in_array( $prm_key, $exclude_params ) )
1120 if ( ( $only_these_parameters === false ) || ( in_array( $prm_key, $only_these_parameters ) ) )
1121 $get_paramaters[ $prm_key ] = $prm_value;
1122 }
1123 }
1124 //debuge($check_params, $get_paramaters, $exclude_params );
1125 $url = admin_url( add_query_arg( $get_paramaters , 'admin.php' ) );
1126
1127 if ( $is_escape_url )
1128 $url = esc_url( $url );
1129
1130 return $url;
1131
1132 /* // Old variant:
1133 if ( isset( $_GET['page'] ) ) $page_param = $_GET['page'];
1134
1135 $url_start = 'admin.php?page=' . $page_param . '&';
1136 $exclude_params[] = 'page';
1137 foreach ( $_REQUEST as $prm_key => $prm_value ) {
1138
1139 if ( !in_array( $prm_key, $exclude_params ) )
1140 if ( ($only_these_parameters === false) || ( in_array( $prm_key, $only_these_parameters ) ) )
1141
1142 $url_start .= $prm_key . '=' . $prm_value . '&';
1143
1144 }
1145 $url_start = substr( $url_start, 0, -1 );
1146
1147 return $url_start;
1148 */
1149 }
1150
1151
1152 /** Clean Request Parameters
1153 *
1154 */
1155 function wpbm_check_request_paramters() {
1156
1157 $clean_params = array();
1158
1159 $clean_params[ 'wh_wpbm_id' ] = 'digit_or_csd'; // '0' | '1' | ''
1160 $clean_params[ 'wh_wpbm_date' ] = 'digit_or_date'; // number | date 2016-07-20
1161 $clean_params[ 'wh_wpbm_datenext' ] = 'd'; // '1' | '2' ....
1162 $clean_params[ 'wh_pay_statuscustom' ] = 's'; //string !!! LIKE !!!
1163 $clean_params[ 'wh_pay_status' ] = array( 'all', 'group_ok', 'group_unknown', 'group_pending', 'group_failed' );
1164
1165 foreach ( $clean_params as $request_key => $clean_type ) {
1166
1167 // elements only listed in array::
1168 if ( is_array( $clean_type ) ) { // check only values from the list in this array
1169
1170 if ( ( isset( $_REQUEST[ $request_key ] ) ) && ( ! in_array( $_REQUEST[ $request_key ], $clean_type ) ) )
1171 $clean_type = 's';
1172 else
1173 $clean_type = 'checked_skip_it';
1174 }
1175
1176 switch ( $clean_type ) {
1177
1178 case 'checked_skip_it':
1179
1180 break;
1181
1182 case 'digit_or_date': // digit or comma separated digit
1183 if ( isset( $_REQUEST[ $request_key ] ) )
1184 $_REQUEST[ $request_key ] = wpbm_clean_digit_or_date( $_REQUEST[ $request_key ] ); // nums
1185
1186 break;
1187
1188 case 'digit_or_csd': // digit or comma separated digit
1189 if ( isset( $_REQUEST[ $request_key ] ) )
1190 $_REQUEST[ $request_key ] = wpbm_clean_digit_or_csd( $_REQUEST[ $request_key ] ); // nums
1191
1192 break;
1193
1194 case 's': // string
1195 if ( isset( $_REQUEST[ $request_key ] ) )
1196 $_REQUEST[ $request_key ] = wpbm_clean_like_string_for_db( $_REQUEST[ $request_key ] );
1197
1198 break;
1199
1200 case 'd': // digit
1201 if ( isset( $_REQUEST[ $request_key ] ) )
1202 if ( $_REQUEST[ $request_key ] !== '' )
1203 $_REQUEST[ $request_key ] = intval( $_REQUEST[ $request_key ] );
1204
1205 break;
1206
1207 default:
1208 if ( isset( $_REQUEST[ $request_key ] ) ) {
1209 $_REQUEST[ $request_key ] = intval( $_REQUEST[ $request_key ] );
1210 }
1211 break;
1212 }
1213
1214
1215 }
1216
1217 }
1218
1219
1220 /** Check paramter if it number or comma separated list of numbers
1221 *
1222 * @global type $wpdb
1223 * @param string $value
1224 * @return string
1225 *
1226 * Exmaple:
1227 wpbm_clean_digit_or_csd( '12,a,45,9' ) => '12,0,45,9'
1228 * or
1229 wpbm_clean_digit_or_csd( '10a' ) => '10
1230 * or
1231 wpbm_clean_digit_or_csd( array( '12,a,45,9', '10a' ) ) => array ( '12,0,45,9', '10' )
1232 */
1233 function wpbm_clean_digit_or_csd( $value ) { //FixIn:6.2.1.4
1234
1235 if ( $value === '' ) return $value;
1236
1237
1238 if ( is_array( $value ) ) {
1239 foreach ( $value as $key => $check_value ) {
1240 $value[ $key ] = wpbm_clean_digit_or_csd( $check_value );
1241 }
1242 return $value;
1243 }
1244
1245
1246 global $wpdb;
1247
1248 $value = str_replace( ';', ',', $value );
1249
1250 $array_of_nums = explode(',', $value);
1251
1252 $result = array();
1253 foreach ($array_of_nums as $check_element) {
1254 $result[] = $wpdb->prepare( "%d", $check_element );
1255 }
1256 $result = implode(',', $result );
1257 return $result;
1258 }
1259
1260
1261 /** Cehck about Valid date, like 2016-07-20 or digit
1262 *
1263 * @param string $value
1264 * @return string or int
1265 */
1266 function wpbm_clean_digit_or_date( $value ) { //FixIn:6.2.1.4
1267
1268 if ( $value === '' ) return $value;
1269
1270 if ( preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/", $value ) ) {
1271
1272 return $value; // Date is valid in format: 2016-07-20
1273 } else {
1274 return intval( $value );
1275 }
1276
1277 }
1278
1279
1280 /** Check $value for injection here
1281 *
1282 * @param type $value
1283 * @return type
1284 */
1285 function wpbm_clean_parameter( $value ) {
1286
1287 $value = preg_replace( '/<[^>]*>/', '', $value ); // clean any tags
1288 $value = str_replace( '<', ' ', $value );
1289 $value = str_replace( '>', ' ', $value );
1290 $value = strip_tags( $value );
1291
1292 // Clean SQL injection
1293 $value = esc_sql( $value );
1294
1295 return $value;
1296 }
1297
1298
1299 function wpbm_esc_like( $value_trimmed ) {
1300
1301 global $wpdb;
1302 if ( method_exists( $wpdb ,'esc_like' ) )
1303 return $wpdb->esc_like( $value_trimmed ); // Its require minimum WP 4.0.0
1304 else
1305 return addcslashes( $value_trimmed, '_%\\' ); // Direct implementation from $wpdb->esc_like(
1306 }
1307
1308
1309 /** Clean user string for using in SQL LIKE statement - append to LIKE sql
1310 *
1311 * @param string $value - to clean
1312 * @return string - escaped
1313 * Exmaple:
1314 * $search_escaped_like_title = wpbm_clean_like_string_for_append_in_sql_for_db( $input_var );
1315 *
1316 * $where_sql = " WHERE title LIKE ". $search_escaped_like_title ." ";
1317 */
1318 function wpbm_clean_like_string_for_append_in_sql_for_db( $value ) {
1319 global $wpdb;
1320
1321 $value_trimmed = trim( stripslashes( $value ) );
1322 $wild = '%';
1323 $like = $wild . wpbm_esc_like( $value_trimmed ) . $wild;
1324 $sql = $wpdb->prepare( "'%s'", $like );
1325
1326 return $sql;
1327
1328
1329 /* Help:
1330 * First half of escaping for LIKE special characters % and _ before preparing for MySQL.
1331 * Use this only before wpdb::prepare() or esc_sql(). Reversing the order is very bad for security.
1332 *
1333 * Example Prepared Statement:
1334 *
1335 * $wild = '%';
1336 * $find = 'only 43% of planets';
1337 * $like = $wild . wpbm_esc_like( $find ) . $wild;
1338 * $sql = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE '%s'", $like );
1339 *
1340 * Example Escape Chain:
1341 *
1342 * $sql = esc_sql( wpbm_esc_like( $input ) );
1343 */
1344
1345 }
1346
1347
1348 /** Clean string for using in SQL LIKE requests inside single quotes: WHERE title LIKE '%". $escaped_search_title ."%'
1349 * Replaced _ to \_ % to \% \ to \\
1350 * @param string $value - to clean
1351 * @return string - escaped
1352 * Exmaple:
1353 * $search_escaped_like_title = wpbm_clean_like_string_for_db( $input_var );
1354 *
1355 * $where_sql = " WHERE title LIKE '%". $search_escaped_like_title ."%' ";
1356 *
1357 * Important! Use SINGLE quotes after in SQL query: LIKE '%".$data."%'
1358 */
1359 function wpbm_clean_like_string_for_db( $value ){
1360
1361 global $wpdb;
1362
1363 $value_trimmed = trim( stripslashes( $value ) );
1364
1365 $value_trimmed = wpbm_esc_like( $value_trimmed );
1366
1367 $value = trim( $wpdb->prepare( "'%s'", $value_trimmed ) , "'" );
1368
1369 return $value;
1370
1371 /* Help:
1372 * First half of escaping for LIKE special characters % and _ before preparing for MySQL.
1373 * Use this only before wpdb::prepare() or esc_sql(). Reversing the order is very bad for security.
1374 *
1375 * Example Prepared Statement:
1376 *
1377 * $wild = '%';
1378 * $find = 'only 43% of planets';
1379 * $like = $wild . wpbm_esc_like( $find ) . $wild;
1380 * $sql = $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE post_content LIKE '%s'", $like );
1381 *
1382 * Example Escape Chain:
1383 *
1384 * $sql = esc_sql( wpbm_esc_like( $input ) );
1385 */
1386 }
1387
1388
1389 /** Escape string from SQL for the HTML form field
1390 *
1391 * @param string $value
1392 * @return string
1393 *
1394 * Used: esc_sql function.
1395 *
1396 * https://codex.wordpress.org/Function_Reference/esc_sql
1397 * Note: Be careful to use this function correctly. It will only escape values to be used in strings in the query.
1398 * That is, it only provides escaping for values that will be within quotes in the SQL (as in field = '{$escaped_value}').
1399 * If your value is not going to be within quotes, your code will still be vulnerable to SQL injection.
1400 * For example, this is vulnerable, because the escaped value is not surrounded by quotes in the SQL query:
1401 * ORDER BY {$escaped_value}. As such, this function does not escape unquoted numeric values, field names, or SQL keywords.
1402 *
1403 */
1404 function wpbm_clean_string_for_form( $value ){
1405
1406 global $wpdb;
1407
1408 $value_trimmed = trim( stripslashes( $value ) );
1409
1410 $esc_sql_value = esc_sql( $value_trimmed );
1411
1412 //$value = trim( $wpdb->prepare( "'%s'", $esc_sql_value ) , "'" );
1413
1414 $esc_sql_value = trim( stripslashes( $esc_sql_value ) );
1415
1416 return $esc_sql_value;
1417
1418 }
1419 // </editor-fold>
1420
1421
1422 // <editor-fold defaultstate="collapsed" desc=" U s e r s " >
1423 ////////////////////////////////////////////////////////////////////////////////
1424 // U s e r s
1425 ////////////////////////////////////////////////////////////////////////////////
1426
1427 /** Get ID of active user
1428 *
1429 * @return type
1430 */
1431 function get_wpbm_current_user_id() {
1432 $user = wp_get_current_user();
1433 return ( isset( $user->ID ) ? (int) $user->ID : 0 );
1434 }
1435
1436
1437 /** Check if Current User have specific Role
1438 *
1439 * @return bool Whether the current user has the given capability.
1440 */
1441 function wpbm_is_current_user_have_this_role( $user_role ) {
1442
1443 if ( $user_role == 'administrator' ) $user_role = 'activate_plugins';
1444 if ( $user_role == 'editor' ) $user_role = 'publish_pages';
1445 if ( $user_role == 'author' ) $user_role = 'publish_posts';
1446 if ( $user_role == 'contributor' ) $user_role = 'edit_posts';
1447 if ( $user_role == 'subscriber') $user_role = 'read';
1448
1449 return current_user_can( $user_role );
1450 }
1451
1452
1453 function wpbm_get_user_ip() {
1454 //return '84.243.195.114' ; // Test //90.36.89.174
1455 if (isset($_SERVER['HTTP_CLIENT_IP'])) {
1456 $userIP = $_SERVER['HTTP_CLIENT_IP'] ;
1457 } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
1458 $userIP = $_SERVER['HTTP_X_FORWARDED_FOR'] ;
1459 } elseif (isset($_SERVER['HTTP_X_FORWARDED'])) {
1460 $userIP = $_SERVER['HTTP_X_FORWARDED'] ;
1461 } elseif (isset($_SERVER['HTTP_FORWARDED_FOR'])) {
1462 $userIP = $_SERVER['HTTP_FORWARDED_FOR'] ;
1463 } elseif (isset($_SERVER['HTTP_FORWARDED'])) {
1464 $userIP = $_SERVER['HTTP_FORWARDED'] ;
1465 } elseif (isset($_SERVER['REMOTE_ADDR'])) {
1466 $userIP = $_SERVER['REMOTE_ADDR'] ;
1467 } else {
1468 $userIP = "" ;
1469 }
1470
1471 $userIP = explode( ',', $userIP );
1472 $userIP = array_map( 'trim', $userIP );
1473
1474 return $userIP[0] ;
1475 }
1476 add_wpbm_filter( 'wpbm_get_user_ip', 'wpbm_get_user_ip' );
1477 // </editor-fold>
1478
1479
1480 // <editor-fold defaultstate="collapsed" desc=" Mesages for Admin panel " >
1481 ////////////////////////////////////////////////////////////////////////////////
1482 // Mesages for Admin panel
1483 ////////////////////////////////////////////////////////////////////////////////
1484
1485 function wpbm_show_fixed_message( $message, $time_to_show , $message_type = 'updated' , $notice_id = 0, $is_dismissible = false ) {
1486
1487 // Generate unique HTML ID for the message
1488 if ( $notice_id == 0 )
1489 $notice_id = intval( time() * rand(10, 100) );
1490
1491 $notice_id = 'wpbm_system_notice_' . $notice_id;
1492
1493 $is_dismissible = false;
1494
1495 if (
1496 ( ( $is_dismissible ) && ( ! wpbm_section_is_dismissed( $notice_id ) ) )
1497 || ( ! $is_dismissible )
1498 // || true
1499 ){
1500
1501 ?><div id="<?php echo $notice_id; ?>"
1502 class="wpbm_system_notice wpbm_is_dismissible wpbm_is_hideable <?php echo $message_type; ?>"
1503 data-nonce="<?php echo wp_create_nonce( $nonce_name = $notice_id . '_wpbmnonce' ); ?>"
1504 data-user-id="<?php echo get_current_user_id(); ?>"
1505 ><?php
1506
1507 wpbm_x_dismiss_button();
1508
1509 echo $message;
1510
1511 ?></div><?php
1512
1513 // Get the time of message showing
1514 $time_to_show = intval( $time_to_show ) * 1000;
1515
1516 if ( $time_to_show > 0 ) {
1517 ?> <script type="text/javascript">
1518 jQuery('#<?php echo $notice_id; ?>').animate({opacity: 1},<?php echo $time_to_show; ?>).fadeOut( 2000 );
1519 </script> <?php
1520 }
1521 }
1522 }
1523
1524
1525 /** Show Ajax message at the top of page
1526 *
1527 * @param type $message
1528 * @param type $time_to_show
1529 * @param type $is_error
1530 */
1531 function wpbm_show_ajax_message( $message, $time_to_show = 3000, $is_error = false ) {
1532
1533 // Recheck for any "lang" shortcodes for replacing to correct language
1534 $message = apply_wpbm_filter('wpbm_check_for_active_language', $message );
1535
1536 // Escape any JavaScript from message
1537 $notice = html_entity_decode( esc_js( $message ) ,ENT_QUOTES) ;
1538
1539 ?><script type="text/javascript">
1540 var my_message = '<?php echo $notice; ?>';
1541 wpbm_admin_show_message( my_message, '<?php echo ( $is_error ? 'error' : 'success' ); ?>', <?php echo $time_to_show; ?> );
1542 </script><?php
1543 }
1544
1545
1546 /** Show "Saved Changes" message at the top of settings page.
1547 *
1548 */
1549 function wpbm_show_changes_saved_message() {
1550 wpbm_show_message ( __('Changes saved.', 'booking-manager'), 5 );
1551 }
1552
1553
1554 /** Show Message at Top of Admin Pages
1555 *
1556 * @param type $message - mesage to show
1557 * @param type $time_to_show - number of seconds to show, if 0 or skiped, then unlimited time.
1558 * @param type $message_type - Default: updated { updated | error | notice }
1559 */
1560 function wpbm_show_message ( $message, $time_to_show , $message_type = 'updated') {
1561
1562 // Generate unique HTML ID for the message
1563 $inner_message_id = intval( time() * rand(10, 100) );
1564
1565 // Get formated HTML message
1566 $notice = wpbm_get_formated_message( $message, $message_type, $inner_message_id );
1567
1568 // Get the time of message showing
1569 $time_to_show = intval( $time_to_show ) * 1000;
1570
1571 // Show this Message
1572 ?> <script type="text/javascript">
1573 if ( jQuery('.wpbm_admin_message').length ) {
1574 jQuery('.wpbm_admin_message').append( '<?php echo $notice; ?>' );
1575 <?php if ( $time_to_show > 0 ) { ?>
1576 jQuery('#wpbm_inner_message_<?php echo $inner_message_id; ?>').animate({opacity: 1},<?php echo $time_to_show; ?>).fadeOut( 2000 );
1577 <?php } ?>
1578 }
1579 </script> <?php
1580 }
1581
1582
1583 /** Escape and prepare message to show it
1584 *
1585 * @param type $message - message
1586 * @param type $message_type - Default: updated { updated | error | notice }
1587 * @param string $inner_message_id - ID of message DIV, can be skipped
1588 * @return string
1589 */
1590 function wpbm_get_formated_message ( $message, $message_type = 'updated', $inner_message_id = '') {
1591
1592
1593 // Recheck for any "lang" shortcodes for replacing to correct language
1594 $message = apply_wpbm_filter('wpbm_check_for_active_language', $message );
1595
1596 // Escape any JavaScript from message
1597 $notice = html_entity_decode( esc_js( $message ) ,ENT_QUOTES) ;
1598
1599 $notice .= '<a class="close tooltip_left" rel="tooltip" title="'. esc_js(__("Hide", 'booking-manager')). '" data-dismiss="alert" href="javascript:void(0)" onclick="javascript:jQuery(this).parent().hide();">&times;</a>';
1600
1601 if (! empty( $inner_message_id ))
1602 $inner_message_id = 'id="wpbm_inner_message_'. $inner_message_id .'"';
1603
1604 $notice = '<div '.$inner_message_id.' class="wpbm_inner_message '. $message_type . '">' . $notice . '</div>';
1605
1606 return $notice;
1607 }
1608
1609
1610 /** Show system info in settings page
1611 *
1612 * @param string $message ...
1613 * @param string $message_type 'info' | 'warning' | 'error'
1614 * @param string $title __('Important!' , 'booking-manager') | __('Note' , 'booking-manager')
1615 *
1616 * Exmaple: wpbm_show_message_in_settings( __( 'Nothing Found', 'booking-manager'), 'warning', __('Important!' , 'booking-manager') );
1617 */
1618 function wpbm_show_message_in_settings( $message, $message_type = 'info', $title = '' , $is_echo = true ) {
1619
1620 $message_content = '';
1621
1622 $message_content .= '<div class="clear"></div>';
1623
1624 $message_content .= '<div class="wpbm-settings-notice notice-' . $message_type . '" style="text-align:left;">';
1625
1626 if ( ! empty( $title ) )
1627 $message_content .= '<strong>' . esc_js( $title ) . '</strong> ';
1628
1629 $message_content .= html_entity_decode( esc_js( $message ) ,ENT_QUOTES) ;
1630
1631 $message_content .= '</div>';
1632
1633 $message_content .= '<div class="clear"></div>';
1634
1635 if ( $is_echo )
1636 echo $message_content;
1637 else
1638 return $message_content;
1639
1640 }
1641 // </editor-fold>
1642
1643
1644 // <editor-fold defaultstate="collapsed" desc=" Settings Meta Boxes " >
1645 ////////////////////////////////////////////////////////////////////////////////
1646 // Settings Meta Boxes
1647 ////////////////////////////////////////////////////////////////////////////////
1648 function wpbm_open_meta_box_section( $metabox_id, $title ) {
1649
1650 $my_close_open_win_id = $metabox_id . '_metabox';
1651 ?>
1652 <div class='meta-box'>
1653 <div
1654 id="<?php echo $my_close_open_win_id; ?>"
1655 class="postbox <?php if ( '1' == get_user_option( 'wpbm_win_' . $my_close_open_win_id ) ) echo 'closed'; ?>"
1656 > <div title="<?php _e('Click to toggle', 'booking-manager'); ?>"
1657 class="handlediv"
1658 onclick="javascript:wpbm_verify_window_opening(<?php echo get_wpbm_current_user_id(); ?>, '<?php echo $my_close_open_win_id; ?>');"
1659 ><br/></div>
1660 <h3 class='hndle'>
1661 <span><?php echo wp_kses_post( $title ); ?></span>
1662 </h3>
1663 <div class="inside">
1664 <?php
1665 }
1666
1667 function wpbm_close_meta_box_section() {
1668 ?>
1669 </div>
1670 </div>
1671 </div>
1672 <?php
1673 }
1674 // </editor-fold>
1675
1676
1677 // from Toolbar
1678 // <editor-fold defaultstate="collapsed" desc=" M o d a l s " >
1679 ////////////////////////////////////////////////////////////////////////////////
1680 // M o d a l s
1681 ////////////////////////////////////////////////////////////////////////////////
1682
1683 /** Start Loyouts - Modal Window structure */
1684 function wpbm_write_content_for_modals_start_here() {
1685
1686 ?><span id="wpbm_content_for_modals"></span><?php
1687 }
1688 add_wpbm_action( 'wpbm_write_content_for_modals', 'wpbm_write_content_for_modals_start_here');
1689 // </editor-fold>
1690
1691
1692 // <editor-fold defaultstate="collapsed" desc=" Inline JavaScript " >
1693 ////////////////////////////////////////////////////////////////////////////////
1694 // Inline J a v a S c r i p t to Footer page
1695 ////////////////////////////////////////////////////////////////////////////////
1696 /**
1697 * Queue JavaScript for later output at footer
1698 *
1699 * @param string $code
1700 */
1701 function wpbm_enqueue_js( $code ) {
1702 global $wpbm_queued_js;
1703
1704 if ( empty( $wpbm_queued_js ) ) {
1705 $wpbm_queued_js = '';
1706 }
1707
1708 $wpbm_queued_js .= "\n" . $code . "\n";
1709 }
1710
1711
1712 /**
1713 * Output any queued javascript code in the footer.
1714 */
1715 function wpbm_print_js() {
1716
1717 global $wpbm_queued_js;
1718
1719 if ( ! empty( $wpbm_queued_js ) ) {
1720
1721 echo "<!-- WPBM JavaScript -->\n<script type=\"text/javascript\">\njQuery(function($) {";
1722
1723 $wpbm_queued_js = wp_check_invalid_utf8( $wpbm_queued_js );
1724
1725 $wpbm_queued_js = wp_specialchars_decode( $wpbm_queued_js , ENT_COMPAT); // Converts double quotes '&quot;' => '"'
1726
1727 $wpbm_queued_js = preg_replace( '/&#(x)?0*(?(1)27|39);?/i', "'", $wpbm_queued_js );
1728 $wpbm_queued_js = str_replace( "\r", '', $wpbm_queued_js );
1729
1730 echo $wpbm_queued_js . "});\n</script>\n<!-- End WPBM JavaScript -->\n";
1731
1732 $wpbm_queued_js = '';
1733 unset( $wpbm_queued_js );
1734 }
1735 }
1736
1737 // </editor-fold>
1738
1739 // from Toolbar
1740 // <editor-fold defaultstate="collapsed" desc=" JS & CSS - Tooltips & Popover" >
1741 ////////////////////////////////////////////////////////////////////////////////
1742 // JS & CSS
1743 ////////////////////////////////////////////////////////////////////////////////
1744
1745 /** Load suport JavaScript for "Items" page*/
1746 function wpbm_js_for_items_page() {
1747
1748 $is_use_hints = get_wpbm_option( 'wpbm_is_use_hints_at_admin_panel' );
1749 if ( $is_use_hints == 'On' )
1750 wpbm_bs_javascript_tooltips(); // JS Tooltips
1751
1752 wpbm_bs_javascript_popover(); // JS Popover
1753
1754 //wpbm_datepicker_js(); // JS Datepicker
1755 wpbm_datepicker_css(); // CSS DatePicker
1756 }
1757
1758
1759 /** Datepicker activation JavaScript */
1760 function wpbm_datepicker_js() {
1761
1762 ?><script type="text/javascript">
1763 jQuery(document).ready( function(){
1764
1765 function applyCSStoDays( date ){
1766 return [true, 'date_available'];
1767 }
1768 jQuery('input.wpbm-filters-section-calendar').datepick(
1769 { beforeShowDay: applyCSStoDays,
1770 showOn: 'focus',
1771 multiSelect: 0,
1772 numberOfMonths: 1,
1773 stepMonths: 1,
1774 prevText: '&laquo;',
1775 nextText: '&raquo;',
1776 dateFormat: 'yy-mm-dd',
1777 changeMonth: false,
1778 changeYear: false,
1779 minDate: null,
1780 maxDate: null, //'1Y',
1781 showStatus: false,
1782 multiSeparator: ', ',
1783 closeAtTop: false,
1784 // firstDay:<?php //echo get_wpbm_option( 'wpbm_start_day_weeek' ); ?>,
1785 gotoCurrent: false,
1786 hideIfNoPrevNext:true,
1787 useThemeRoller :false,
1788 mandatory: true
1789 }
1790 );
1791 });
1792 </script><?php
1793 }
1794
1795
1796 /** Support CSS - datepick, etc... */
1797 function wpbm_datepicker_css(){
1798 ?>
1799 <style type="text/css">
1800 #datepick-div .datepick-header {
1801 width: 172px !important;
1802 }
1803 #datepick-div {
1804 -border-radius: 3px;
1805 -box-shadow: 0 0 2px #888888;
1806 -webkit-border-radius: 3px;
1807 -webkit-box-shadow: 0 0 2px #888888;
1808 -moz-border-radius: 3px;
1809 -moz-box-shadow: 0 0 2px #888888;
1810 width: 172px !important;
1811 }
1812 #datepick-div .datepick .datepick-days-cell a{
1813 font-size: 12px;
1814 }
1815 #datepick-div table.datepick tr td {
1816 border-top: 0 none !important;
1817 line-height: 24px;
1818 padding: 0 !important;
1819 width: 24px;
1820 }
1821 #datepick-div .datepick-control {
1822 font-size: 10px;
1823 text-align: center;
1824 }
1825 #datepick-div .datepick-one-month {
1826 height: auto;
1827 }
1828 </style>
1829 <?php
1830 }
1831
1832
1833 /** Sortable Table JavaScript */
1834 function wpbm_sortable_js() {
1835 ?>
1836 <script type="text/javascript">
1837 // Activate Sortable Functionality
1838 jQuery( document ).ready(function(){
1839
1840 jQuery('.wpbm_input_table tbody th').css('cursor','move');
1841
1842 jQuery('.wpbm_input_table tbody td.sort').css('cursor','move');
1843
1844 jQuery('.wpbm_input_table.sortable tbody').sortable({
1845 items:'tr',
1846 cursor:'move',
1847 axis:'y',
1848 scrollSensitivity:40,
1849 forcePlaceholderSize: true,
1850 helper: 'clone',
1851 opacity: 0.65,
1852 placeholder: '.wpbm_sortable_table .sort',
1853 start:function(event,ui){
1854 ui.item.css('background-color','#f6f6f6');
1855 },
1856 stop:function(event,ui){
1857 ui.item.removeAttr('style');
1858 }
1859 });
1860 });
1861 </script>
1862 <?php
1863
1864 }
1865 // </editor-fold>
1866
1867
1868 // <editor-fold defaultstate="collapsed" desc=" R e l o a d p a g e " >
1869 ////////////////////////////////////////////////////////////////////////////////
1870 // R e l o a d p a g e
1871 ////////////////////////////////////////////////////////////////////////////////
1872 /**
1873 * Reload page by using JavaScript
1874 *
1875 * @param string $url - URL of page to load
1876 */
1877 function wpbm_reload_page_by_js( $url ) {
1878
1879 $redir = html_entity_decode( esc_url( $url ) );
1880
1881 if ( ! empty( $redir ) ) {
1882 ?>
1883 <script type="text/javascript">
1884 window.location.href = '<?php echo $redir ?>';
1885 </script>
1886 <?php
1887 }
1888 }
1889
1890
1891 /** Redirect browser to a specific page
1892 *
1893 * @param string $url - URL of page to redirect
1894 */
1895 function wpbm_redirect( $url ) {
1896
1897 $url = wpbm_make_link_absolute( $url );
1898
1899 $url = html_entity_decode( esc_url( $url ) );
1900
1901 echo '<script type="text/javascript">';
1902 echo 'window.location.href="'.$url.'";';
1903 echo '</script>';
1904 echo '<noscript>';
1905 echo '<meta http-equiv="refresh" content="0;url='.$url.'" />';
1906 echo '</noscript>';
1907 }
1908 // </editor-fold>
1909
1910
1911 // <editor-fold defaultstate="collapsed" desc=" P a g i n a t i o n o f T a b l e L i s t i n g " >
1912 /** Show P a g i n a t i o n
1913 *
1914 * @param int $summ_number_of_items - total number of items
1915 * @param int $active_page_num - number of activated page
1916 * @param int $num_items_per_page - number of items per page
1917 * @param array $only_these_parameters - array of keys to exclude from links
1918 * @param string $url_sufix - usefule for anchor to HTML section with specific ID, Example: '#my_section'
1919 */
1920 function wpbm_show_pagination( $summ_number_of_items, $active_page_num, $num_items_per_page , $only_these_parameters = false, $url_sufix = '' ) {
1921
1922 if ( empty( $num_items_per_page ) ) {
1923 $num_items_per_page = '10';
1924 }
1925
1926 $pages_number = ceil( $summ_number_of_items / $num_items_per_page );
1927 if ( $pages_number < 2 )
1928 return;
1929
1930 //Fix: 5.1.4 - Just in case we are having tooo much resources, then we need to show all resources - and its empty string
1931 if ( ( isset($_REQUEST['wh_wpbm_type'] ) ) && ( strlen($_REQUEST['wh_wpbm_type']) > 1000 ) ) {
1932 $_REQUEST['wh_wpbm_type'] = '';
1933 }
1934
1935 // First parameter will overwriten by $_GET['page'] parameter
1936 $bk_admin_url = wpbm_get_params_in_url( wpbm_get_master_url( false ), array('page_num'), $only_these_parameters );
1937
1938
1939 ?>
1940 <span class="wpdevelop wpbm-pagination">
1941 <div class="container-fluid">
1942 <div class="row">
1943 <div class="col-sm-12 text-center control-group0">
1944 <nav class="btn-toolbar">
1945 <div class="btn-group wpbm-no-margin" style="float:none;">
1946
1947 <?php if ( $pages_number > 1 ) { ?>
1948 <a class="button button-secondary <?php echo ( $active_page_num == 1 ) ? ' disabled' : ''; ?>"
1949 href="<?php echo $bk_admin_url; ?>&page_num=<?php if ($active_page_num == 1) { echo $active_page_num; } else { echo ($active_page_num-1); } echo $url_sufix; ?>">
1950 <?php _e('Prev', 'booking-manager'); ?>
1951 </a>
1952 <?php }
1953
1954 /** Number visible pages (links) that linked to active page, other pages skipped by "..." */
1955 $num_closed_steps = 3;
1956
1957 for ( $pg_num = 1; $pg_num <= $pages_number; $pg_num++ ) {
1958
1959 if ( ! (
1960 ( $pages_number > ( $num_closed_steps * 4) )
1961 && ( $pg_num > $num_closed_steps )
1962 && ( ( $pages_number - $pg_num + 1 ) > $num_closed_steps )
1963 && ( abs( $active_page_num - $pg_num ) > $num_closed_steps )
1964 ) ) {
1965 ?> <a class="button button-secondary <?php if ($pg_num == $active_page_num ) echo ' active'; ?>"
1966 href="<?php echo $bk_admin_url; ?>&page_num=<?php echo $pg_num; echo $url_sufix; ?>">
1967 <?php echo $pg_num; ?>
1968 </a><?php
1969
1970 if ( ( $pages_number > ( $num_closed_steps * 4) )
1971 && ( ($pg_num+1) > $num_closed_steps )
1972 && ( ( $pages_number - ( $pg_num + 1 ) ) > $num_closed_steps )
1973 && ( abs($active_page_num - ( $pg_num + 1 ) ) > $num_closed_steps )
1974 ) {
1975 echo ' <a class="button button-secondary disabled" href="javascript:void(0);">...</a> ';
1976 }
1977 }
1978 }
1979
1980 if ( $pages_number > 1 ) { ?>
1981 <a class="button button-secondary <?php echo ( $active_page_num == $pages_number ) ? ' disabled' : ''; ?>"
1982 href="<?php echo $bk_admin_url; ?>&page_num=<?php if ($active_page_num == $pages_number) { echo $active_page_num; } else { echo ($active_page_num+1); } echo $url_sufix; ?>">
1983 <?php _e('Next', 'booking-manager'); ?>
1984 </a>
1985 <?php } ?>
1986
1987 </div>
1988 </nav>
1989 </div>
1990 </div>
1991 </div>
1992 </span>
1993 <?php
1994 }
1995 // </editor-fold>
1996
1997
1998 // <editor-fold defaultstate="collapsed" desc=" D a t e s " >
1999 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2000 // Dates Format
2001 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2002
2003
2004 /** Get Formated Date & time
2005 *
2006 * @param string $date_sql - 2017-07-31 00:00:00 || 2017-07-31
2007 * @param string $date_format - Optional. - "m / d / Y, D H:i:s"
2008 * @param string $seperator - Optional. - " "
2009 * @return string - July 29, 2014 12:00 am
2010 */
2011 function wpbm_get_date_time_formatted( $date_sql, $date_format = false, $seperator = ' ', $skip_midnight_time = false ) {
2012
2013 $return_date = wpbm_get_date_formatted( $date_sql, $date_format );
2014
2015 $return_time = wpbm_get_time_formatted( $date_sql, $date_format, $skip_midnight_time );
2016 if ( ! empty( $return_time ) )
2017 $return_date .= $seperator . $return_time;
2018
2019 return $return_date;
2020 }
2021
2022
2023 /** Get Formated Date
2024 *
2025 * @param string $date_sql - 2017-07-31 00:00:00 || 2017-07-31
2026 * @param string $date_format - Optional. - "m / d / Y, D"
2027 * @param bool $skip_midnight_time - Default false - if 00:00:00 then return '';
2028 * @return string - July 29, 2014
2029 */
2030 function wpbm_get_date_formatted( $date_sql, $date_format = false ) {
2031
2032 if ( $date_format === false ) $date_format = get_wpbm_option( 'wpbm_date_format' );
2033 if ( empty( $date_format ) ) $date_format = "m / d / Y, D";
2034
2035 $formated_date = date_i18n( $date_format, strtotime( $date_sql ) );
2036
2037 return $formated_date;
2038 }
2039
2040
2041 /** Get Formated Date & time
2042 *
2043 * @param string $date_sql - 2017-07-31 00:00:00 || 2017-07-31
2044 * @param string $time_format - Optional. - "H:i:s"
2045 * @return string - 12:00 am
2046 */
2047 function wpbm_get_time_formatted( $date_sql, $time_format = false , $skip_midnight_time = false ) {
2048
2049 if ( ( $skip_midnight_time ) && ( '00:00:00' == substr( $date_sql, -8 ) ) )
2050 return '';
2051
2052 if ( $time_format === false ) $time_format = get_wpbm_option( 'wpbm_time_format' );
2053 if ( empty( $time_format ) ) $time_format = 'h:i a';
2054
2055 $formated_date = date_i18n( $time_format, strtotime( $date_sql ) );
2056
2057 return $formated_date;
2058 }
2059
2060
2061 /** Check if "current_day" is tomorrow from "next_day"
2062 *
2063 * @param string $current_day_sql_check : 2015-02-29 00:00:00
2064 * @param string $next_day_sql_check : 2015-02-30 00:00:00
2065 * @return boolean : true | false
2066 */
2067 function wpbm_is_next_day( $current_day_sql_check, $next_day_sql_check ) {
2068
2069 // Current day
2070 $current_day_unix = strtotime( $current_day_sql_check );
2071
2072 $current_day_midnight_sql = date_i18n( 'Y-m-d', $current_day_unix );
2073 $current_day_midnight_unix = strtotime( $current_day_midnight_sql );
2074
2075 $calc_next_day_unix = strtotime( '+1 day', $current_day_midnight_unix );
2076
2077 // Next day
2078 $next_day_unix = strtotime( $next_day_sql_check );
2079 $next_day_midnight_sql = date_i18n( 'Y-m-d', $next_day_unix );
2080 $next_day_midnight_unix = strtotime( $next_day_midnight_sql );
2081
2082
2083 if ( $calc_next_day_unix == $next_day_midnight_unix )
2084 return true;
2085 else
2086 return false;
2087 }
2088
2089 /** Check if "current_day" is same day of "other_day"
2090 *
2091 * @param string $current_day_sql_check : 2015-02-29 00:00:00
2092 * @param string $other_day_sql_check : 2015-02-30 00:00:00
2093 * @return boolean : true | false
2094 */
2095 function wpbm_is_this_same_day( $current_day_sql_check, $other_day_sql_check ) {
2096
2097 // Current day
2098 $current_day_unix = strtotime( $current_day_sql_check );
2099
2100 $current_day_midnight_sql = date_i18n( 'Y-m-d', $current_day_unix );
2101 $current_day_midnight_unix = strtotime( $current_day_midnight_sql );
2102
2103 // Other day
2104 $other_day_unix = strtotime( $other_day_sql_check );
2105 $other_day_midnight_sql = date_i18n( 'Y-m-d', $other_day_unix );
2106 $other_day_midnight_unix = strtotime( $other_day_midnight_sql );
2107
2108
2109 if ( $current_day_midnight_unix == $other_day_midnight_unix )
2110 return true;
2111 else
2112 return false;
2113 }
2114
2115
2116 /** Get days in short format view
2117 *
2118 * @param string $days Dates: 15.05.2015, 16.05.2015, 17.05.2015
2119 * @return string Dates in format: 15.05.2015 - 17.05.2015
2120 */
2121 function wpbm_get_dates_short_format( $dates_sql_csv ) { // $days - string with comma seperated dates
2122
2123 if ( empty( $dates_sql_csv ) )
2124 return '';
2125
2126 $days = explode( ',', $dates_sql_csv );
2127
2128 $previosday = false;
2129 $result_string = '';
2130 $last_show_day = '';
2131
2132 foreach ( $days as $day ) {
2133
2134 $is_fin_at_end = false;
2135
2136 if ( $previosday === false ) { // First Day
2137
2138 $result_string = wpbm_get_date_time_formatted( $day, false, ' ', true ); // echo format for first day
2139 $last_show_day = $day;
2140 $previosday = $day; // Set previos day for next loop
2141
2142 } else { // Not first day
2143
2144 if (
2145 wpbm_is_next_day( $previosday, $day )
2146 || wpbm_is_this_same_day( $previosday, $day )
2147 ) { // Check if $day next day from previous
2148
2149 $previosday = $day; // Set previos day for next loop
2150 $is_fin_at_end = true;
2151 } else {
2152 if ( $last_show_day !== $previosday ) { // check if previos day was show or no
2153 $result_string .= ' - ' . wpbm_get_date_time_formatted( $previosday, false, ' ', true ); // assign in needed format this day
2154 }
2155 $result_string .= ', ' . wpbm_get_date_time_formatted( $day, false, ' ', true ); // assign in needed format this day
2156 $previosday = $day; // Set previos day for next loop
2157 $last_show_day = $day;
2158 }
2159 }
2160
2161 }
2162
2163 if ( $is_fin_at_end ) {
2164 $result_string .= ' - ' . wpbm_get_date_time_formatted( $day, false, ' ', true );
2165 }
2166
2167 return $result_string;
2168 }
2169
2170 // </editor-fold>