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