*
* BUG CHECK:
* - The pattern is "tempered" to find the class attribute containing both tokens.
* - It does not require order (wpbc_container can appear before/after wpbc_form).
* - It matches the opening
tag only.
*/
$pattern = '/
]*\bclass\s*=\s*(["\'])(?:(?!\1).)*\bwpbc_container\b(?:(?!\1).)*\bwpbc_form\b(?:(?!\1).)*\1[^>]*>/i';
return preg_replace_callback( $pattern, function ( $m ) use ( $theme_class_arr ) {
$tag = $m[0];
if ( preg_match( '/\bclass\s*=\s*(["\'])(.*?)\1/i', $tag, $cm ) ) {
$quote = $cm[1];
$classes = (string) $cm[2];
// Optional but recommended: remove any existing wpbc_theme_* to avoid conflicts.
$classes = preg_replace( '/\bwpbc_theme_[A-Za-z0-9_-]+\b/', '', $classes );
$classes = trim( preg_replace( '/\s+/', ' ', $classes ) );
// Add missing theme tokens.
foreach ( $theme_class_arr as $tok ) {
if ( false === strpos( ' ' . $classes . ' ', ' ' . $tok . ' ' ) ) {
$classes = trim( $classes . ' ' . $tok );
}
}
$tag = preg_replace( '/\bclass\s*=\s*(["\'])(.*?)\1/i', 'class=' . $quote . esc_attr( $classes ) . $quote, $tag, 1 );
}
return $tag;
}, $wrapped_html, 1 );
}
add_filter( 'wpbc_booking_form__wrapped_html__before_inline_scripts', 'wpbc_booking_form__wrapped_html__before_inline_scripts__apply_theme_class', 10, 4 );
/**
* ['options']['booking_type_of_day_selections'] -> Set per-form day selection mode for calendar init.
*
* Uses shared calendar mode helpers for: single | multiple | range.
*
* @param string $wrapped_html
* @param array $bfb_settings
* @param int $resource_id
* @param string $custom_booking_form_name
*
* @return string
*/
function wpbc_booking_form__wrapped_html__before_inline_scripts__apply_day_selection_mode( $wrapped_html, $bfb_settings, $resource_id, $custom_booking_form_name ) {
$wrapped_html = (string) $wrapped_html;
$bfb_settings = is_array( $bfb_settings ) ? $bfb_settings : array();
$mode = '';
if ( ! empty( $bfb_settings['options'] ) && is_array( $bfb_settings['options'] ) ) {
if ( isset( $bfb_settings['options']['booking_type_of_day_selections'] ) ) {
$mode = (string) $bfb_settings['options']['booking_type_of_day_selections'];
}
}
if ( ! in_array( $mode, array( 'single', 'multiple', 'range' ), true ) ) {
return $wrapped_html;
}
$rid = (int) $resource_id;
$mode_functions = array(
'single' => 'wpbc_cal_ready_days_select__single',
'multiple' => 'wpbc_cal_ready_days_select__multiple',
'range' => 'wpbc_cal_ready_days_select__range_mode',
);
$fn = $mode_functions[ $mode ];
$js_body = '(function(){';
$js_body .= 'var rid=' . $rid . ';';
$js_body .= 'var tries=0;';
$js_body .= 'function run(){';
$js_body .= ' if (typeof window.' . $fn . ' === "function") { window.' . $fn . '(rid); return; }';
$js_body .= ' if (tries++ < 40) { setTimeout(run,50); }';
$js_body .= '}';
$js_body .= 'run();';
$js_body .= '}());';
$can_use_wp_inline = ( ! wp_doing_ajax() );
// Elementor safe adding inline scripts after loaded of 'wpbc_all' script.
if ( $can_use_wp_inline && class_exists( 'WPBC_FE_Assets' ) && function_exists( 'wp_script_is' ) ) {
$assets_key = 'wpbc:day-select:' . $rid . ':' . md5( (string) $custom_booking_form_name . ':' . $mode );
$added = WPBC_FE_Assets::add_jq_ready_js_to_wp_script( 'wpbc_all', $js_body, $assets_key );
if ( $added ) {
return $wrapped_html; // no ' . "\n";
return $wrapped_html;
}
add_filter( 'wpbc_booking_form__wrapped_html__before_inline_scripts', 'wpbc_booking_form__wrapped_html__before_inline_scripts__apply_day_selection_mode', 9, 4 );