PluginProbe
Booking Calendar / 11.8.3
Booking Calendar v11.8.3
11.8.3 11.8.2 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 All 203 releases
← All changes | core/wpbc-js.php +50 -41 10.15.711.8.3 View file →
@@ -45,9 +45,9 @@
45 45
46 46 wpbc_js_load_libs( $where_to_load );
47 47 wpbc_js_load_files( $where_to_load );
48 48
49 - if ( wpbc_is_new_booking_page() || wpbc_is_settings_form_page() || wpbc_is_settings_color_themes_page() || wpbc_is_setup_wizard_page() ) {
49 + if ( wpbc_is_admin_page_with_frontend_booking_preview() ) {
50 50 $where_to_load = 'both';
51 51 }
52 52
53 53 // Load JavaScript files in all other versions
@@ -64,30 +64,22 @@
64 64 }
65 65
66 66
67 67 /**
68 - * Remove `async` and `defer` ( check more here https://javascript.info/script-async-defer )
69 - * for scripts registered or enqueued, that required for correct working of plugin, like
70 - * jquery and all Booking Calendar scripts
68 + * Preserve the required execution order for Booking Calendar scripts.
71 69 *
70 + * Removes asynchronous loading attributes and excludes the scripts from
71 + * Cloudflare Rocket Loader. The filter runs at a very late priority so these
72 + * protections remain present after other script-tag optimization filters.
73 + *
72 74 * @param string $tag The script tag.
73 - * @param string $handle The script handle.
75 + * @param string $handle The registered script handle.
76 + * @param string $src The script source URL.
74 77 *
75 - * @return string Script HTML string.
76 - *
78 + * @return string Filtered script HTML string.
77 79 */
78 80 public function filter_script_loader_tag( $tag, $handle, $src ) {
79 -
80 - $script_handles_prevent_defer = array(
81 - 'jquery-core' // exact value
82 - , 'jquery-migrate'
83 - //, 'wpbc-' //starting from 'wpbc-' it's not the exact value
84 - //, 'wpdevelop-'
85 - );
86 -
87 -
88 - // Remove defer and async attribute from the src.
89 - if (
81 + $is_required_script = (
90 82 ( 'jquery-core' === $handle )
91 83 || ( 'jquery-migrate' === $handle )
92 84 || ( false !== strpos( $handle, 'wpbc_' ) ) // Booking Calendar script wpbc_all.js // FixIn: 10.1.2.3.
93 85 || ( false !== strpos( $handle, 'wpbc-' ) ) // Booking Calendar scripts
@@ -92,28 +84,20 @@
92 84 || ( false !== strpos( $handle, 'wpbc_' ) ) // Booking Calendar script wpbc_all.js // FixIn: 10.1.2.3.
93 85 || ( false !== strpos( $handle, 'wpbc-' ) ) // Booking Calendar scripts
94 86 || ( false !== strpos( $handle, 'wpdevelop-' ) )
95 87 || ( false !== strpos( $handle, 'wpbm-' ) )
96 - ) {
88 + );
97 89
90 + if ( $is_required_script ) {
98 91 foreach ( array( 'async', 'defer' ) as $attr ) {
92 + // Match only a standalone attribute, not the "async" part of data-cfasync.
93 + $pattern = '/\s+' . $attr . '(?:\s*=\s*(?:"[^"]*"|\'[^\']*\'|[^\s>]+))?/i';
94 + $tag = preg_replace( $pattern, '', $tag );
95 + }
99 96
100 - if ( preg_match( ":\s$attr(=|>|\s):", $tag ) ) {
101 - $tag = str_replace($attr, '', $tag);
102 - $tag = str_replace('=""', '', $tag);
103 - $tag = str_replace("=''", '', $tag);
104 -
105 - /*
106 - * Test here https://regex101.com/
107 - *
108 - * Expression: \s+defer(\s*=\s*["']defer["'])?\s?
109 - * Test string: <script type='text/javascript' defer = 'defer' defer="defer" src='http://beta/wp-content/plugins/booking-manager/js/wpbm_vars.js?ver=1.1' id='wpbm-global-vars-js'></script>
110 - *
111 - */
112 - $pattern = ":\s+{$attr}(\s*=\s*[\"']{$attr}[\"'])?\s?:mi";
113 - $replacement = ' ';
114 - $tag = preg_replace($pattern, $replacement, $tag);
115 - }
97 + // Rocket Loader can otherwise execute dependent scripts before wpbc_all.js defines _wpbc.
98 + if ( false === strpos( $tag, 'data-cfasync=' ) ) {
99 + $tag = preg_replace( '/<script\b/i', '<script data-cfasync="false"', $tag, 1 );
116 100 }
117 101 }
118 102
119 103 return $tag;
@@ -121,13 +105,13 @@
121 105
122 106
123 107 /**
124 108 * Deregister some conflict scripts from other plugins.
125 - *
109 + *
126 110 * @param type $where_to_load
127 111 */
128 112 public function remove_conflicts( $where_to_load ) {
129 -
113 +
130 114 if ( wpbc_is_bookings_page() ) {
131 115 if (function_exists('wp_dequeue_script')) {
132 116 //wp_dequeue_script( 'jquery.cookie' );
133 117 //wp_dequeue_script( 'jquery-interdependencies' );
@@ -142,10 +126,10 @@
142 126
143 127
144 128 /** Define JavaScript Varibales */
145 129 function wpbc_js_load_vars( $where_to_load ) {
146 -
147 130
131 +
148 132 }
149 133
150 134
151 135 /** Default JavaScripts Libraries */
@@ -157,9 +141,9 @@
157 141 // $deps = '';
158 142 // $ver = false;
159 143 // wp_enqueue_script( 'jquery', $src, $deps, $ver, array( 'in_footer' => WPBC_JS_IN_FOOTER ) );
160 144
161 - // Default Admin Libs
145 + // Default Admin Libs
162 146 if ( 'admin' == $where_to_load ) {
163 147 if ( wpbc_is_settings_page() ) {
164 148 wp_enqueue_style( 'thickbox' ); // CSS Thickbox
165 149 wp_enqueue_script( 'thickbox' ); // JS Thickbox
@@ -165,9 +149,9 @@
165 149 wp_enqueue_script( 'thickbox' ); // JS Thickbox
166 150 wp_enqueue_media();
167 151 }
168 152 wp_enqueue_style( 'wp-color-picker' ); // Color Picker
169 - wp_enqueue_script( 'wp-color-picker' );
153 + wp_enqueue_script( 'wp-color-picker' );
170 154 wp_enqueue_script( 'jquery-ui-sortable' ); // UI Sortable
171 155 }
172 156
173 157 // WP Util, that support wp.template, based on underscore _.template system
@@ -203,9 +187,9 @@
203 187 if ( ! empty( $calendar_localization_url ) ) {
204 188 wp_enqueue_script( 'wpbc-datepick-localize', $calendar_localization_url, array( 'wpbc-datepick' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); //FixIn: 9.8.1
205 189 }
206 190
207 - if ( ( $where_to_load == 'client' ) || ( wpbc_is_new_booking_page() ) || ( wpbc_is_settings_form_page() || wpbc_is_settings_color_themes_page() || wpbc_is_setup_wizard_page() || wpbc_is_builder_booking_form_page() ) ) {
191 + if ( ( $where_to_load == 'client' ) || wpbc_is_admin_page_with_frontend_booking_preview() ) {
208 192
209 193 wp_enqueue_script( 'wpbc-main-client', wpbc_plugin_url( '/js/client.js' ), array( 'wpbc-datepick' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // Client
210 194 wp_enqueue_script( 'wpbc_capacity', wpbc_plugin_url( '/includes/_capacity/_out/create_booking.js' ), array( 'wpbc-main-client' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // Add new bookings // FixIn: 9.8.0.3.
211 195 wp_enqueue_script( 'wpbc-times', wpbc_plugin_url( '/js/wpbc_times.js' ), array( 'wpbc-main-client' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: TimeFree 2 //UnComment it for Booking Calendar Free version
@@ -352,8 +336,33 @@
352 336 wp_enqueue_style( 'wpbc-flex-toolbar', wpbc_plugin_url( '/includes/_toolbar_ui/_out/toolbar_ui.css' ), array(), WP_BK_VERSION_NUM );
353 337 wp_enqueue_style( 'wpbc-admin-modal-popups', wpbc_plugin_url( '/css/modal.css' ), array(), WP_BK_VERSION_NUM );
354 338 wp_enqueue_style( 'wpbc-admin-pages', wpbc_plugin_url( '/css/admin.css' ), array(), WP_BK_VERSION_NUM );
355 339 wp_enqueue_style( 'wpbc-admin-skin', wpbc_plugin_url( '/css/admin-skin.css' ), array( 'wpbc-admin-pages' ), WP_BK_VERSION_NUM ); // FixIn: 8.0.2.4.
340 +}
341 +
342 +/**
343 + * Load only the modal assets required by front-end popup shortcodes.
344 + *
345 + * This intentionally avoids the broader admin helper above, because front-end
346 + * pages should not receive admin page/menu styles when only a modal booking
347 + * form is needed.
348 + *
349 + * @return void
350 + */
351 +function wpbc_load_js__required_for_front_end_modals() {
352 +
353 + // JS for opening modals.
354 + wp_enqueue_script( 'wpbc-modal', wpbc_plugin_url( '/vendors/_custom/dropdown_modal/_out/dropdown_modal.js' ), array( 'jquery' ), WP_BK_VERSION_NUM, array( 'in_footer' => WPBC_JS_IN_FOOTER ) ); // FixIn: 9.8.1.
355 +
356 + // Base Bootstrap CSS is already loaded by Booking Calendar in normal front-end rendering.
357 + if ( ! wp_style_is( 'wpdevelop-bts', 'enqueued' ) && ! wp_style_is( 'wpdevelop-bts', 'done' ) ) {
358 + wp_enqueue_style( 'wpdevelop-bts', wpbc_plugin_url( '/vendors/_custom/bootstrap-css/css/bootstrap.css' ), array(), WP_BK_VERSION_NUM ); // FixIn: 9.8.1.
359 + }
360 + if ( ! wp_style_is( 'wpdevelop-bts-theme', 'enqueued' ) && ! wp_style_is( 'wpdevelop-bts-theme', 'done' ) ) {
361 + wp_enqueue_style( 'wpdevelop-bts-theme', wpbc_plugin_url( '/vendors/_custom/bootstrap-css/css/bootstrap-theme.css' ), array(), WP_BK_VERSION_NUM ); // FixIn: 9.8.1.
362 + }
363 +
364 + wp_enqueue_style( 'wpbc-admin-modal-popups', wpbc_plugin_url( '/css/modal.css' ), array(), WP_BK_VERSION_NUM );
356 365 }
357 366
358 367
359 368 /**