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