| @@ -1,8 +1,25 @@ | ||
| 1 | 1 | <?php |
| 2 | 2 | |
| 3 | 3 | if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly |
| 4 | 4 | |
| 5 | + | |
| 6 | +/** | |
| 7 | + * Convert a CSV of numeric date parts to an array of integers. | |
| 8 | + * Example: '2025,09,05,08,55' -> [2025, 9, 5, 8, 55] | |
| 9 | + * | |
| 10 | + * @param string $csv E.g. '2025,09,05,08,55'. | |
| 11 | + * @param string $separator Defaults to ','. | |
| 12 | + * | |
| 13 | + * @return int[] Numeric parts as integers. | |
| 14 | + */ | |
| 15 | +function wpbc_csv_numbers_to_int_array( $csv, $separator = ',' ) { | |
| 16 | + | |
| 17 | + $parts = array_map( 'trim', explode( $separator, (string) $csv ) ); | |
| 18 | + | |
| 19 | + return array_map( 'intval', $parts ); | |
| 20 | +} | |
| 21 | + | |
| 5 | 22 | // --------------------------------------------------------------------------------------------------------------------- |
| 6 | 23 | // Localize dates |
| 7 | 24 | // --------------------------------------------------------------------------------------------------------------------- |
| 8 | 25 | |
| @@ -16,9 +33,9 @@ | ||
| 16 | 33 | * |
| 17 | 34 | * @return string |
| 18 | 35 | */ |
| 19 | 36 | function wpbc_datetime_localized( $date_str_ymdhis, $format = '', $is_add_timezone_offset = false ) { |
| 20 | - | |
| 37 | + // FixIn: 10.15.5.3. | |
| 21 | 38 | if ( empty( $format ) ) { |
| 22 | 39 | $format = sprintf( '%s %s', get_option( 'booking_date_format' ), get_option( 'booking_time_format' ) ); |
| 23 | 40 | } |
| 24 | 41 | if ( empty( $format ) ) { |
| @@ -34,10 +51,23 @@ | ||
| 34 | 51 | if ( is_string( $date_str_ymdhis ) ) { |
| 35 | 52 | $date_str_ymdhis = strtotime( $date_str_ymdhis ); |
| 36 | 53 | } |
| 37 | 54 | |
| 55 | + if ( false === $date_str_ymdhis ) { | |
| 56 | + if ( 'UTC' !== $server_zone ) { | |
| 57 | + // phpcs:ignore WordPress.DateTime.RestrictedFunctions.timezone_change_date_default_timezone_set | |
| 58 | + @date_default_timezone_set( $server_zone ); | |
| 59 | + } | |
| 60 | + return ''; | |
| 61 | + } | |
| 62 | + | |
| 63 | + $date_str_ymdhis = (int) $date_str_ymdhis; | |
| 64 | + | |
| 38 | 65 | if ( $is_add_timezone_offset ) { |
| 39 | - $date_str_ymdhis += (int) ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ); | |
| 66 | + $gmt_offset = get_option( 'gmt_offset', 0 ); | |
| 67 | + $gmt_offset = is_numeric( $gmt_offset ) ? (float) $gmt_offset : 0.0; | |
| 68 | + | |
| 69 | + $date_str_ymdhis += (int) round( $gmt_offset * HOUR_IN_SECONDS ); | |
| 40 | 70 | } |
| 41 | 71 | |
| 42 | 72 | $local_date = date_i18n( $format, $date_str_ymdhis ); |
| 43 | 73 | |
| @@ -191,8 +221,13 @@ | ||
| 191 | 221 | } |
| 192 | 222 | |
| 193 | 223 | $dates_array_in_sql_format = explode( ',', $dates_str_in_sql_format ); |
| 194 | 224 | |
| 225 | + $is_no_date = apply_filters( 'wpbc_maybe_no_booking_date', false, $dates_array_in_sql_format ); | |
| 226 | + if ( $is_no_date ) { | |
| 227 | + return '---'; | |
| 228 | + } | |
| 229 | + | |
| 195 | 230 | $result_dates_arr = array(); |
| 196 | 231 | |
| 197 | 232 | foreach ( $dates_array_in_sql_format as $date_sql ) { |
| 198 | 233 | |
| @@ -458,8 +493,54 @@ | ||
| 458 | 493 | } |
| 459 | 494 | |
| 460 | 495 | |
| 461 | 496 | return $is_next_date; |
| 497 | + } | |
| 498 | + | |
| 499 | + | |
| 500 | + /** | |
| 501 | + * Check if $date_sql1 < $date_sql2 | |
| 502 | + * | |
| 503 | + * @param string $date_sql1 : '2015-02-29' | '2015-02-29 00:00:00' | |
| 504 | + * @param string $date_sql2 : '2015-02-30' | '2015-02-30 00:00:00' | |
| 505 | + * | |
| 506 | + * @return boolean : true | false | |
| 507 | + */ | |
| 508 | + function wpbc_is_date_less_than( $date_sql1, $date_sql2 ) { | |
| 509 | + | |
| 510 | + if ( empty( $date_sql2 ) ) { | |
| 511 | + return false; | |
| 512 | + } | |
| 513 | + | |
| 514 | + $date_sql1 = wpbc_date_sql__ymd_his__to__ymd_000( $date_sql1 ); | |
| 515 | + $date_sql2 = wpbc_date_sql__ymd_his__to__ymd_000( $date_sql2 ); | |
| 516 | + | |
| 517 | + $is_date_less = ( strtotime( $date_sql1 ) < strtotime( $date_sql2 ) ); | |
| 518 | + | |
| 519 | + return $is_date_less; | |
| 520 | + } | |
| 521 | + | |
| 522 | + | |
| 523 | + /** | |
| 524 | + * Check if $date_sql1 > $date_sql2 | |
| 525 | + * | |
| 526 | + * @param string $date_sql1 : '2015-02-29' | '2015-02-29 00:00:00' | |
| 527 | + * @param string $date_sql2 : '2015-02-30' | '2015-02-30 00:00:00' | |
| 528 | + * | |
| 529 | + * @return boolean : true | false | |
| 530 | + */ | |
| 531 | + function wpbc_is_date_higher_than( $date_sql1, $date_sql2 ) { | |
| 532 | + | |
| 533 | + if ( empty( $date_sql2 ) ) { | |
| 534 | + return false; | |
| 535 | + } | |
| 536 | + | |
| 537 | + $date_sql1 = wpbc_date_sql__ymd_his__to__ymd_000( $date_sql1 ); | |
| 538 | + $date_sql2 = wpbc_date_sql__ymd_his__to__ymd_000( $date_sql2 ); | |
| 539 | + | |
| 540 | + $is_date_less = ( strtotime( $date_sql1 ) > strtotime( $date_sql2 ) ); | |
| 541 | + | |
| 542 | + return $is_date_less; | |
| 462 | 543 | } |
| 463 | 544 | |
| 464 | 545 | |
| 465 | 546 | /** |