PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 12.2.3
Jetpack – WP Security, Backup, Speed, & Growth v12.2.3
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 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 / eventbrite / eventbrite.php
jetpack / extensions / blocks / eventbrite Last commit date
eventbrite.php 5 years ago
eventbrite.php
263 lines
1 <?php
2 /**
3 * Eventbrite Block.
4 *
5 * @since 8.2.0
6 *
7 * @package automattic/jetpack
8 */
9
10 namespace Automattic\Jetpack\Extensions\Eventbrite;
11
12 use Automattic\Jetpack\Blocks;
13 use Jetpack_Gutenberg;
14
15 const FEATURE_NAME = 'eventbrite';
16 const BLOCK_NAME = 'jetpack/' . FEATURE_NAME;
17
18 /**
19 * Registers the block for use in Gutenberg
20 * This is done via an action so that we can disable
21 * registration if we need to.
22 */
23 function register_block() {
24 Blocks::jetpack_register_block(
25 BLOCK_NAME,
26 array( 'render_callback' => __NAMESPACE__ . '\render_block' )
27 );
28 }
29 add_action( 'init', __NAMESPACE__ . '\register_block' );
30
31 /**
32 * Get current URL.
33 *
34 * @return string Current URL.
35 */
36 function get_current_url() {
37 if ( isset( $_SERVER['HTTP_HOST'] ) ) {
38 $host = wp_unslash( $_SERVER['HTTP_HOST'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
39 } else {
40 $host = wp_parse_url( home_url(), PHP_URL_HOST );
41 }
42 if ( isset( $_SERVER['REQUEST_URI'] ) ) {
43 $path = wp_unslash( $_SERVER['REQUEST_URI'] ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
44 } else {
45 $path = '/';
46 }
47 return esc_url_raw( ( is_ssl() ? 'https' : 'http' ) . '://' . $host . $path );
48 }
49
50 /**
51 * Eventbrite block registration/dependency delclaration.
52 *
53 * @param array $attr Eventbrite block attributes.
54 * @param string $content Rendered embed element (without scripts) from the block editor.
55 *
56 * @return string Rendered block.
57 */
58 function render_block( $attr, $content ) {
59 if ( is_admin() || empty( $attr['eventId'] ) || empty( $attr['url'] ) ) {
60 return '';
61 }
62
63 $attr['url'] = Jetpack_Gutenberg::validate_block_embed_url(
64 $attr['url'],
65 array( '#^https?:\/\/(?:[0-9a-z]+\.)?eventbrite\.(?:com|co\.uk|com\.ar|com\.au|be|com\.br|ca|cl|co|dk|de|es|fi|fr|hk|ie|it|com\.mx|nl|co\.nz|at|com\.pe|pt|ch|sg|se)\/e\/[^\/]*?(?:\d+)\/?(?:\?[^\/]*)?$#' ),
66 true
67 );
68
69 $widget_id = wp_unique_id( 'eventbrite-widget-' );
70
71 // Show the embedded version.
72 if ( empty( $attr['useModal'] ) && ( empty( $attr['style'] ) || 'modal' !== $attr['style'] ) ) {
73 return render_embed_block( $widget_id, Blocks::is_amp_request(), $attr );
74 } else {
75 return render_modal_block( $widget_id, Blocks::is_amp_request(), $attr, $content );
76 }
77 }
78
79 /**
80 * Render block with embed style.
81 *
82 * @param string $widget_id Widget ID to use.
83 * @param bool $is_amp Whether AMP page.
84 * @param array $attr Eventbrite block attributes.
85 * @return string Rendered block.
86 */
87 function render_embed_block( $widget_id, $is_amp, $attr ) {
88
89 // $content contains a fallback link to the event that's saved in the post_content.
90 // Append a div that will hold the iframe embed created by the Eventbrite widget.js.
91 $classes = Blocks::classes( FEATURE_NAME, $attr );
92
93 $classes .= ' wp-block-jetpack-eventbrite--embed';
94
95 $direct_link = sprintf(
96 '<a href="%s" rel="noopener noreferrer" target="_blank" class="eventbrite__direct-link" %s>%s</a>',
97 esc_url( $attr['url'] ),
98 $is_amp ? 'placeholder fallback' : '',
99 esc_html__( 'Register on Eventbrite', 'jetpack' )
100 );
101
102 if ( $is_amp ) {
103 $embed = sprintf(
104 '<amp-iframe src="%s" layout="responsive" resizable width="1" height="1" sandbox="allow-scripts allow-same-origin allow-forms"><button overflow>%s</button>%s</amp-iframe>',
105 esc_url(
106 add_query_arg(
107 array(
108 'eid' => $attr['eventId'],
109 'parent' => rawurlencode( get_current_url() ),
110 ),
111 'https://www.eventbrite.com/checkout-external'
112 )
113 ),
114 esc_html__( 'Expand', 'jetpack' ),
115 $direct_link
116 );
117 } else {
118 $embed = $direct_link;
119
120 wp_enqueue_script( 'eventbrite-widget', 'https://www.eventbrite.com/static/widgets/eb_widgets.js', array(), JETPACK__VERSION, true );
121
122 // Add CSS to hide direct link.
123 Jetpack_Gutenberg::load_assets_as_required( FEATURE_NAME );
124
125 wp_add_inline_script(
126 'eventbrite-widget',
127 "window.EBWidgets.createWidget( {
128 widgetType: 'checkout',
129 eventId: " . absint( $attr['eventId'] ) . ",
130 iframeContainerId: '" . esc_js( $widget_id ) . "',
131 } );"
132 );
133 }
134
135 return sprintf(
136 '<div id="%1$s" class="%2$s">%3$s</div>',
137 esc_attr( $widget_id ),
138 esc_attr( $classes ),
139 $embed
140 );
141 }
142
143 /**
144 * Render block with modal style.
145 *
146 * @param string $widget_id Widget ID to use.
147 * @param bool $is_amp Whether AMP page.
148 * @param array $attr Eventbrite block attributes.
149 * @param string $content Rendered embed element (without scripts) from the block editor.
150 * @return string Rendered block.
151 */
152 function render_modal_block( $widget_id, $is_amp, $attr, $content ) {
153
154 if ( $is_amp ) {
155 $lightbox_id = "{$widget_id}-lightbox";
156
157 // Add CSS to for lightbox.
158 Jetpack_Gutenberg::load_assets_as_required( FEATURE_NAME );
159
160 $content = preg_replace(
161 '/\shref="#" target="_blank/',
162 sprintf( ' on="%s" ', esc_attr( "tap:{$lightbox_id}.open" ) ),
163 $content
164 );
165
166 $iframe_src = add_query_arg(
167 array(
168 // Note that modal=1 is intentionally omitted here since we need to put the close button inside the amp-lightbox.
169 'eid' => $attr['eventId'],
170 'parent' => rawurlencode( get_current_url() ),
171 ),
172 'https://www.eventbrite.com/checkout-external'
173 );
174
175 $lightbox = sprintf(
176 '<amp-lightbox id="%1$s" on="%2$s" class="eventbrite__lightbox" layout="nodisplay">%3$s</amp-lightbox>',
177 esc_attr( $lightbox_id ),
178 esc_attr( "tap:{$lightbox_id}.close" ),
179 sprintf(
180 '
181 <div class="eventbrite__lighbox-inside">
182 <div class="eventbrite__lighbox-iframe-wrapper">
183 <amp-iframe class="eventbrite__lighbox-iframe" src="%s" layout="fill" sandbox="allow-scripts allow-same-origin allow-forms">
184 <span placeholder=""></span>
185 </amp-iframe>
186 <span class="eventbrite__lighbox-close" on="%s" role="button" tabindex="0" aria-label="%s">
187 <svg viewBox="0 0 24 24">
188 <path d="M13.4 12l3.5-3.5-1.4-1.4-3.5 3.5-3.5-3.5-1.4 1.4 3.5 3.5-3.5 3.5 1.4 1.4 3.5-3.5 3.5 3.5 1.4-1.4z"></path>
189 </svg>
190 </span>
191 </div>
192 </div>
193 ',
194 esc_url( $iframe_src ),
195 esc_attr( "tap:{$lightbox_id}.close" ),
196 esc_attr__( 'Close', 'jetpack' )
197 )
198 );
199
200 $content = preg_replace(
201 ':(?=</div>\s*$):',
202 $lightbox,
203 $content
204 );
205
206 return $content;
207 }
208
209 wp_enqueue_script( 'eventbrite-widget', 'https://www.eventbrite.com/static/widgets/eb_widgets.js', array(), JETPACK__VERSION, true );
210
211 // Show the modal version.
212 wp_add_inline_script(
213 'eventbrite-widget',
214 "window.EBWidgets.createWidget( {
215 widgetType: 'checkout',
216 eventId: " . absint( $attr['eventId'] ) . ",
217 modal: true,
218 modalTriggerElementId: '" . esc_js( $widget_id ) . "',
219 } );"
220 );
221
222 // Modal button is saved as an `<a>` element with `role="button"` because `<button>` is not allowed
223 // by WordPress.com wp_kses. This javascript adds the necessary event handling for button-like behavior.
224 // @link https://www.w3.org/TR/wai-aria-practices/examples/button/button.html.
225 wp_add_inline_script(
226 'eventbrite-widget',
227 "( function() {
228 var widget = document.getElementById( '" . esc_js( $widget_id ) . "' );
229 if ( widget ) {
230 widget.addEventListener( 'click', function( event ) {
231 event.preventDefault();
232 } );
233
234 widget.addEventListener( 'keydown', function( event ) {
235 // Enter and space keys.
236 if ( event.keyCode === 13 || event.keyCode === 32 ) {
237 event.preventDefault();
238 event.target && event.target.click();
239 }
240 } );
241 }
242 } )();"
243 );
244
245 // Replace the placeholder id saved in the post_content with a unique id used by widget.js.
246 $content = str_replace( 'eventbrite-widget-id', esc_attr( $widget_id ), $content );
247
248 // Fallback for block version deprecated/v2.
249 $content = preg_replace( '/eventbrite-widget-\d+/', esc_attr( $widget_id ), $content );
250
251 // Inject URL to event in case the JS for the lightbox fails to load.
252 $content = preg_replace(
253 '/\shref="#"/',
254 sprintf(
255 ' href="%s" rel="noopener noreferrer" target="_blank"',
256 esc_url( $attr['url'] )
257 ),
258 $content
259 );
260
261 return $content;
262 }
263