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