PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.7.2
Jetpack – WP Security, Backup, Speed, & Growth v13.7.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 / opentable / opentable.php
jetpack / extensions / blocks / opentable Last commit date
opentable.php 2 years ago
opentable.php
225 lines
1 <?php
2 /**
3 * OpenTable Block.
4 *
5 * @since 8.2
6 *
7 * @package automattic/jetpack
8 */
9
10 namespace Automattic\Jetpack\Extensions\OpenTable;
11
12 use Automattic\Jetpack\Blocks;
13 use Jetpack_Gutenberg;
14
15 /**
16 * Registers the block for use in Gutenberg
17 * This is done via an action so that we can disable
18 * registration if we need to.
19 */
20 function register_block() {
21 Blocks::jetpack_register_block(
22 __DIR__,
23 array(
24 'render_callback' => __NAMESPACE__ . '\load_assets',
25 'plan_check' => true,
26 )
27 );
28 }
29 add_action( 'init', __NAMESPACE__ . '\register_block' );
30
31 /**
32 * OpenTable block registration/dependency declaration.
33 *
34 * @param array $attributes Array containing the OpenTable block attributes.
35 *
36 * @return string
37 */
38 function load_assets( $attributes ) {
39
40 Jetpack_Gutenberg::load_assets_as_required( __DIR__ );
41
42 $classes = array();
43 $class_name = get_attribute( $attributes, 'className' );
44 $style = get_attribute( $attributes, 'style' );
45
46 if ( 'wide' === $style && jetpack_is_mobile() ) {
47 $attributes = array_merge( $attributes, array( 'style' => 'standard' ) );
48 $classes[] = 'is-style-mobile';
49 }
50
51 // Handles case of deprecated version using theme instead of block styles.
52 if ( ! $class_name || ! str_contains( $class_name, 'is-style-' ) ) {
53 $classes[] = sprintf( 'is-style-%s', $style );
54 }
55
56 if ( array_key_exists( 'rid', $attributes ) && is_array( $attributes['rid'] ) && count( $attributes['rid'] ) > 1 ) {
57 $classes[] = 'is-multi';
58 }
59 if ( array_key_exists( 'negativeMargin', $attributes ) && $attributes['negativeMargin'] ) {
60 $classes[] = 'has-no-margin';
61 }
62 $classes = Blocks::classes( Blocks::get_block_feature( __DIR__ ), $attributes, $classes );
63 $content = '<div class="' . esc_attr( $classes ) . '">';
64
65 $script_url = build_embed_url( $attributes );
66
67 if ( Blocks::is_amp_request() ) {
68 // Extract params from URL since it had jetpack_opentable_block_url filters applied.
69 $url_query = \wp_parse_url( $script_url, PHP_URL_QUERY ) . '&overlay=false&disablega=false';
70
71 $src = "https://www.opentable.com/widget/reservation/canvas?$url_query";
72
73 $params = array();
74 wp_parse_str( $url_query, $params );
75
76 // Note an iframe is similarly constructed in the block edit function.
77 $content .= sprintf(
78 '<amp-iframe src="%s" layout="fill" sandbox="allow-scripts allow-forms allow-same-origin allow-popups">%s</amp-iframe>',
79 esc_url( $src ),
80 sprintf(
81 '<a placeholder href="%s">%s</a>',
82 esc_url(
83 add_query_arg(
84 array(
85 'rid' => $params['rid'],
86 ),
87 'https://www.opentable.com/restref/client/'
88 )
89 ),
90 esc_html__( 'Make a reservation', 'jetpack' )
91 )
92 );
93 } else {
94 // The OpenTable script uses multiple `rid` paramters,
95 // so we can't use WordPress to output it, as WordPress attempts to validate it and removes them.
96 // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript
97 $content .= '<script src="' . esc_url( $script_url ) . '"></script>';
98 }
99
100 $content .= '</div>';
101
102 return $content;
103 }
104
105 /**
106 * Get the a block attribute
107 *
108 * @param array $attributes Array of block attributes.
109 * @param string $attribute_name The attribute to get.
110 *
111 * @return string The filtered attribute
112 */
113 function get_attribute( $attributes, $attribute_name ) {
114 if ( isset( $attributes[ $attribute_name ] ) ) {
115 if ( in_array( $attribute_name, array( 'iframe', 'newtab' ), true ) ) {
116 return $attributes[ $attribute_name ] ? 'true' : 'false';
117 }
118 return $attributes[ $attribute_name ];
119 }
120
121 $default_attributes = array(
122 'style' => 'standard',
123 'iframe' => 'true',
124 'domain' => 'com',
125 'lang' => 'en-US',
126 'newtab' => 'false',
127 );
128
129 return isset( $default_attributes[ $attribute_name ] ) ? $default_attributes[ $attribute_name ] : null;
130 }
131
132 /**
133 * Get the block type attribute
134 *
135 * @param array $attributes Array of block attributes.
136 *
137 * @return string The filtered attribute
138 */
139 function get_type_attribute( $attributes ) {
140 if ( ! empty( $attributes['rid'] ) && is_countable( $attributes['rid'] ) && count( $attributes['rid'] ) > 1 ) {
141 return 'multi';
142 }
143
144 if ( empty( $attributes['style'] ) || 'button' !== $attributes['style'] ) {
145 return 'standard';
146 }
147
148 return 'button';
149 }
150
151 /**
152 * Get the block theme attribute
153 *
154 * OpenTable has a confusing mix of themes and types for the widget. A type
155 * can have a theme, but the button style can not have a theme. The other two
156 * types (multi and standard) can have one of the three themes.
157 *
158 * We have combined these into a `style` attribute as really there are 4 styles
159 * standard, wide, tall, and button. Multi can be determined by the number of
160 * restaurant IDs we have.
161 *
162 * This function along with `jetpack_opentable_block_get_type_attribute`, translates
163 * the style attribute to a type and theme.
164 *
165 * Type Theme Style
166 * ==========|==========|==========
167 * Multi | |
168 * Standard | Standard | Standard
169 * | Wide | Wide
170 * | Tall | Tall
171 * Button | Standard | Button
172 *
173 * @param array $attributes Array of block attributes.
174 *
175 * @return string The filtered attribute
176 */
177 function get_theme_attribute( $attributes ) {
178 $valid_themes = array( 'standard', 'wide', 'tall' );
179
180 if ( empty( $attributes['style'] )
181 || ! in_array( $attributes['style'], $valid_themes, true )
182 || 'button' === $attributes['style'] ) {
183 return 'standard';
184 }
185
186 return $attributes['style'];
187 }
188
189 /**
190 * Build an embed URL from an array of block attributes.
191 *
192 * @param array $attributes Array of block attributess.
193 *
194 * @return string Embed URL
195 */
196 function build_embed_url( $attributes ) {
197 $url = add_query_arg(
198 array(
199 'type' => get_type_attribute( $attributes ),
200 'theme' => get_theme_attribute( $attributes ),
201 'iframe' => get_attribute( $attributes, 'iframe' ),
202 'domain' => get_attribute( $attributes, 'domain' ),
203 'lang' => get_attribute( $attributes, 'lang' ),
204 'newtab' => get_attribute( $attributes, 'newtab' ),
205 ),
206 '//www.opentable.com/widget/reservation/loader'
207 );
208
209 if ( ! empty( $attributes['rid'] ) ) {
210 foreach ( $attributes['rid'] as $rid ) {
211 $url .= '&rid=' . $rid;
212 }
213 }
214
215 /**
216 * Filter the OpenTable URL used to embed a widget.
217 *
218 * @since 8.2.0
219 *
220 * @param string $url OpenTable embed URL.
221 * @param array $attributes Array of block attributes.
222 */
223 return apply_filters( 'jetpack_opentable_block_url', $url, $attributes );
224 }
225