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