PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / extensions / blocks / calendly / render.php
jetpack / extensions / blocks / calendly Last commit date
calendly.php 2 weeks ago render.php 2 weeks ago
render.php
254 lines
1 <?php
2 /**
3 * Calendly block render implementation.
4 *
5 * Loaded lazily from calendly.php only when the block is rendered, to keep the
6 * render body out of the eager front-end PHP/opcache footprint.
7 *
8 * @package automattic/jetpack
9 */
10
11 namespace Automattic\Jetpack\Extensions\Calendly;
12
13 use Automattic\Jetpack\Blocks;
14 use Jetpack_Gutenberg;
15
16 if ( ! defined( 'ABSPATH' ) ) {
17 exit( 0 );
18 }
19
20 /**
21 * Calendly block registration/dependency declaration.
22 *
23 * @param array $attr Array containing the Calendly block attributes.
24 * @param string $content String containing the Calendly block content.
25 *
26 * @return string
27 */
28 function render( $attr, $content ) {
29
30 if ( is_admin() ) {
31 return;
32 }
33 $url = Jetpack_Gutenberg::validate_block_embed_url(
34 get_attribute( $attr, 'url' ),
35 array( 'calendly.com' )
36 );
37 if ( empty( $url ) ) {
38 return;
39 }
40
41 /*
42 * Enqueue necessary scripts and styles.
43 */
44 Jetpack_Gutenberg::load_assets_as_required( __DIR__ );
45
46 $style = get_attribute( $attr, 'style' );
47 $hide_event_type_details = get_attribute( $attr, 'hideEventTypeDetails' );
48 $background_color = get_attribute( $attr, 'backgroundColor' );
49 $text_color = get_attribute( $attr, 'textColor' );
50 $primary_color = get_attribute( $attr, 'primaryColor' );
51 $classes = Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attr, array( 'calendly-style-' . $style ) );
52 $block_id = wp_unique_id( 'calendly-block-' );
53 $is_amp_request = Blocks::is_amp_request();
54
55 if ( ! wp_script_is( 'jetpack-calendly-external-js' ) && ! $is_amp_request ) {
56 enqueue_calendly_js();
57 }
58
59 $base_url = $url;
60 $url = add_query_arg(
61 array(
62 'hide_event_type_details' => (int) $hide_event_type_details,
63 'background_color' => sanitize_hex_color_no_hash( $background_color ),
64 'text_color' => sanitize_hex_color_no_hash( $text_color ),
65 'primary_color' => sanitize_hex_color_no_hash( $primary_color ),
66 ),
67 $url
68 );
69
70 if ( 'link' === $style ) {
71 if ( ! wp_style_is( 'jetpack-calendly-external-css' ) ) {
72 wp_enqueue_style( 'jetpack-calendly-external-css', 'https://assets.calendly.com/assets/external/widget.css', null, JETPACK__VERSION );
73 }
74
75 // Render deprecated version of Calendly block if needed. New markup block button class before rendering here.
76 if ( ! str_contains( $content, 'wp-block-jetpack-button' ) ) {
77 $content = deprecated_render_button_v1( $attr, $block_id, $classes, $url );
78 } else {
79 $content = str_replace( 'calendly-widget-id', esc_attr( $block_id ), $content );
80 $content = str_replace( $base_url, $url, $content );
81 }
82
83 if ( ! $is_amp_request ) {
84 wp_add_inline_script(
85 'jetpack-calendly-external-js',
86 sprintf( 'calendly_attach_link_events( %s )', wp_json_encode( $block_id, JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP ) )
87 );
88 }
89 } elseif ( $is_amp_request ) { // Inline style.
90 $content = sprintf(
91 '<div class="%1$s" id="%2$s"><a href="%3$s" role="button" target="_blank">%4$s</a></div>',
92 esc_attr( Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attr ) ),
93 esc_attr( $block_id ),
94 esc_attr( $url ),
95 wp_kses_post( get_attribute( $attr, 'submitButtonText' ) )
96 );
97 } else {
98 $content = sprintf(
99 '<div class="%1$s" id="%2$s"></div>',
100 esc_attr( $classes ),
101 esc_attr( $block_id )
102 );
103 $script = <<<'JS_END'
104 jetpackInitCalendly( %s, %s );
105 JS_END;
106 $json_encode_flags = JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP;
107 if ( get_option( 'blog_charset' ) === 'UTF-8' ) {
108 $json_encode_flags |= JSON_UNESCAPED_UNICODE;
109 }
110 wp_add_inline_script(
111 'jetpack-calendly-external-js',
112 sprintf(
113 $script,
114 wp_json_encode( esc_url_raw( $url ), $json_encode_flags ),
115 wp_json_encode( $block_id, $json_encode_flags )
116 )
117 );
118 }
119
120 return $content;
121 }
122
123 /**
124 * Get filtered attributes.
125 *
126 * @param array $attributes Array containing the Calendly block attributes.
127 * @param string $attribute_name String containing the attribute name to get.
128 *
129 * @return string
130 */
131 function get_attribute( $attributes, $attribute_name ) {
132 if ( isset( $attributes[ $attribute_name ] ) ) {
133 return $attributes[ $attribute_name ];
134 }
135
136 $default_attributes = array(
137 'style' => 'inline',
138 'submitButtonText' => esc_html__( 'Schedule time with me', 'jetpack' ),
139 'backgroundColor' => 'ffffff',
140 'textColor' => '4D5055',
141 'primaryColor' => '00A2FF',
142 'hideEventTypeDetails' => false,
143 );
144
145 if ( isset( $default_attributes[ $attribute_name ] ) ) {
146 return $default_attributes[ $attribute_name ];
147 }
148 }
149
150 /**
151 * Enqueues the Calendly JS library and inline function to attach event
152 * handlers to the button.
153 *
154 * @return void
155 */
156 function enqueue_calendly_js() {
157 wp_enqueue_script(
158 'jetpack-calendly-external-js',
159 'https://assets.calendly.com/assets/external/widget.js',
160 null,
161 JETPACK__VERSION,
162 false
163 );
164
165 wp_add_inline_script(
166 'jetpack-calendly-external-js',
167 "function jetpackInitCalendly( url, elementId ) {
168 function initCalendlyWidget() {
169 if ( ! document.getElementById( elementId ) ) {
170 return;
171 }
172 Calendly.initInlineWidget({
173 url: url,
174 parentElement: document.getElementById( elementId ),
175 inlineStyles: false,
176 });
177 };
178 // For P2s only: wait until after o2 has
179 // replaced main#content to initialize widget.
180 if ( window.jQuery && window.o2 ) {
181 jQuery( 'body' ).on( 'ready_o2', function() { initCalendlyWidget() } );
182 // Else initialize widget without waiting.
183 } else {
184 document.addEventListener('DOMContentLoaded', function() {
185 initCalendlyWidget();
186 });
187 }
188 };
189
190 function calendly_attach_link_events( elementId ) {
191 var widget = document.getElementById( elementId );
192 if ( widget ) {
193 widget.addEventListener( 'click', function( event ) {
194 event.preventDefault();
195 Calendly.initPopupWidget( { url: event.target.href } );
196 } );
197 widget.addEventListener( 'keydown', function( event ) {
198 // Enter and space keys.
199 if ( event.keyCode === 13 || event.keyCode === 32 ) {
200 event.preventDefault();
201 event.target && event.target.click();
202 }
203 } );
204 }
205 }"
206 );
207 }
208
209 /**
210 * Renders a deprecated legacy version of the button HTML.
211 *
212 * @param array $attributes Array containing the Calendly block attributes.
213 * @param string $block_id The value for the ID attribute of the link.
214 * @param string $classes The CSS classes for the wrapper div.
215 * @param string $url Calendly URL for the link HREF.
216 *
217 * @return string
218 */
219 function deprecated_render_button_v1( $attributes, $block_id, $classes, $url ) {
220 // This is the legacy version, so create the full link content.
221 $submit_button_text = get_attribute( $attributes, 'submitButtonText' );
222 $submit_button_classes = get_attribute( $attributes, 'submitButtonClasses' );
223 $submit_button_text_color = get_attribute( $attributes, 'customTextButtonColor' );
224 $submit_button_background_color = get_attribute( $attributes, 'customBackgroundButtonColor' );
225
226 /*
227 * If we have some additional styles from the editor
228 * (a custom text color, custom bg color, or both )
229 * Let's add that CSS inline.
230 */
231 if ( ! empty( $submit_button_text_color ) || ! empty( $submit_button_background_color ) ) {
232 $inline_styles = sprintf(
233 '#%1$s{%2$s%3$s}',
234 esc_attr( $block_id ),
235 ! empty( $submit_button_text_color )
236 ? 'color:#' . sanitize_hex_color_no_hash( $submit_button_text_color ) . ';'
237 : '',
238 ! empty( $submit_button_background_color )
239 ? 'background-color:#' . sanitize_hex_color_no_hash( $submit_button_background_color ) . ';'
240 : ''
241 );
242 wp_add_inline_style( 'jetpack-calendly-external-css', $inline_styles );
243 }
244
245 return sprintf(
246 '<div class="wp-block-button %1$s"><a id="%2$s" class="%3$s" href="%4$s" role="button">%5$s</a></div>',
247 esc_attr( $classes ),
248 esc_attr( $block_id ),
249 ! empty( $submit_button_classes ) ? esc_attr( $submit_button_classes ) : 'wp-block-button__link',
250 esc_attr( $url ),
251 wp_kses_post( $submit_button_text )
252 );
253 }
254