PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.0.3
Jetpack – WP Security, Backup, Speed, & Growth v15.0.3
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 / button / button.php
jetpack / extensions / blocks / button Last commit date
button.php 11 months ago
button.php
330 lines
1 <?php
2 /**
3 * Button Block.
4 *
5 * @since 8.5.0
6 *
7 * @package automattic/jetpack
8 */
9
10 namespace Automattic\Jetpack\Extensions\Button;
11
12 use Automattic\Jetpack\Blocks;
13 use Jetpack_Gutenberg;
14
15 if ( ! defined( 'ABSPATH' ) ) {
16 exit( 0 );
17 }
18
19 const FEATURE_NAME = 'button';
20 const BLOCK_NAME = 'jetpack/' . FEATURE_NAME;
21
22 /**
23 * Registers the block for use in Gutenberg
24 * This is done via an action so that we can disable
25 * registration if we need to.
26 */
27 function register_block() {
28 Blocks::jetpack_register_block(
29 BLOCK_NAME,
30 array(
31 'render_callback' => __NAMESPACE__ . '\render_block',
32 'uses_context' => array( 'jetpack/parentBlockWidth' ),
33 'selectors' => array(
34 'border' => '.wp-block-jetpack-button .wp-block-button__link',
35 ),
36 )
37 );
38 }
39 add_action( 'init', __NAMESPACE__ . '\register_block' );
40
41 /**
42 * Button block render callback.
43 *
44 * @param array $attributes Array containing the Button block attributes.
45 * @param string $content The Button block content.
46 *
47 * @return string
48 */
49 function render_block( $attributes, $content ) {
50 $save_in_post_content = get_attribute( $attributes, 'saveInPostContent' );
51
52 // The Jetpack Button block depends on the core button block styles.
53 // The following ensures that those styles are enqueued when rendering this block.
54 enqueue_existing_button_style_dependency( 'core/button' );
55 enqueue_existing_button_style_dependency( 'core/buttons' );
56
57 Jetpack_Gutenberg::load_styles_as_required( FEATURE_NAME );
58
59 if ( $save_in_post_content || ! class_exists( 'DOMDocument' ) ) {
60 return $content;
61 }
62
63 $element = get_attribute( $attributes, 'element' );
64 $text = wp_kses_post( get_attribute( $attributes, 'text' ) );
65 $unique_id = get_attribute( $attributes, 'uniqueId' );
66 $url = get_attribute( $attributes, 'url' );
67 $classes = Blocks::classes( FEATURE_NAME, $attributes, array( 'wp-block-button' ) );
68
69 $button_classes = get_button_classes( $attributes );
70 $button_styles = get_button_styles( $attributes );
71 $wrapper_styles = get_button_wrapper_styles( $attributes );
72
73 $wrapper_attributes = sprintf( ' class="%s" style="%s"', esc_attr( $classes ), esc_attr( $wrapper_styles ) );
74 $button_attributes = sprintf( ' class="%s" style="%s"', esc_attr( $button_classes ), esc_attr( $button_styles ) );
75
76 if ( empty( $unique_id ) ) {
77 $button_attributes .= ' data-id-attr="placeholder"';
78 } else {
79 $button_attributes .= sprintf( ' data-id-attr="%1$s" id="%1$s"', esc_attr( $unique_id ) );
80 }
81
82 if ( ! in_array( $element, array( 'a', 'button', 'input' ), true ) ) {
83 $element = 'a';
84 }
85
86 if ( 'a' === $element ) {
87 $button_attributes .= sprintf( ' href="%s" target="_blank" role="button" rel="noopener noreferrer"', esc_url( $url ) );
88 } elseif ( 'button' === $element ) {
89 $button_attributes .= ' type="submit"';
90 } elseif ( 'input' === $element ) {
91 $button_attributes .= sprintf( ' type="submit" value="%s"', esc_attr( wp_strip_all_tags( $text, true ) ) );
92 }
93
94 $button_attributes .= ' data-wp-class--is-submitting="state.isSubmitting" data-wp-bind--aria-disabled="state.isAriaDisabled"';
95
96 $svg = '<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z" opacity=".25"/><path d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"><animateTransform attributeName="transform" type="rotate" dur="0.75s" values="0 12 12;360 12 12" repeatCount="indefinite"/></path></svg>';
97 $form_submitting_text = '<span class="is-visually-hidden">' . __( 'Submitting form', 'jetpack' ) . '</span>';
98 $spinner = '<span class="spinner" aria-hidden="true">' . $svg . $form_submitting_text . '</span>';
99
100 $button = 'input' === $element
101 ? '<' . $element . $button_attributes . ' />'
102 : '<' . $element . $button_attributes . '>' . $text . $spinner . '</' . $element . '>';
103
104 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
105 return '<div' . $wrapper_attributes . '>' . $button . '</div>';
106 }
107
108 /**
109 * Get the Button block classes.
110 *
111 * @param array $attributes Array containing the block attributes.
112 *
113 * @return string
114 */
115 function get_button_classes( $attributes ) {
116 $classes = array( 'wp-block-button__link' );
117 $has_class_name = array_key_exists( 'className', $attributes );
118 $has_named_text_color = array_key_exists( 'textColor', $attributes );
119 $has_custom_text_color = array_key_exists( 'customTextColor', $attributes );
120 $has_named_background_color = array_key_exists( 'backgroundColor', $attributes );
121 $has_custom_background_color = array_key_exists( 'customBackgroundColor', $attributes );
122 $has_named_gradient = array_key_exists( 'gradient', $attributes );
123 $has_custom_gradient = array_key_exists( 'customGradient', $attributes );
124 $has_border_radius = array_key_exists( 'borderRadius', $attributes );
125 $has_font_size = array_key_exists( 'fontSize', $attributes );
126 $has_named_border_color = array_key_exists( 'borderColor', $attributes );
127
128 if ( $has_font_size ) {
129 $classes[] = 'has-' . $attributes['fontSize'] . '-font-size';
130 $classes[] = 'has-custom-font-size';
131 }
132
133 if ( $has_class_name ) {
134 $classes[] = $attributes['className'];
135 }
136
137 if ( $has_named_text_color || $has_custom_text_color ) {
138 $classes[] = 'has-text-color';
139 }
140 if ( $has_named_text_color ) {
141 $classes[] = sprintf( 'has-%s-color', $attributes['textColor'] );
142 }
143
144 if ( $has_named_border_color ) {
145 $classes[] = sprintf( 'has-%s-border-color', $attributes['borderColor'] );
146 }
147
148 if (
149 $has_named_background_color ||
150 $has_custom_background_color ||
151 $has_named_gradient ||
152 $has_custom_gradient
153 ) {
154 $classes[] = 'has-background';
155 }
156 if ( $has_named_background_color && ! $has_custom_gradient ) {
157 $classes[] = sprintf( 'has-%s-background-color', $attributes['backgroundColor'] );
158 }
159 if ( $has_named_gradient ) {
160 $classes[] = sprintf( 'has-%s-gradient-background', $attributes['gradient'] );
161 }
162
163 // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
164 if ( $has_border_radius && 0 == $attributes['borderRadius'] ) {
165 $classes[] = 'no-border-radius';
166 }
167
168 return implode( ' ', $classes );
169 }
170
171 /**
172 * Get the Button block styles.
173 *
174 * @param array $attributes Array containing the block attributes.
175 *
176 * @return string
177 */
178 function get_button_styles( $attributes ) {
179 $styles = array();
180 $has_named_text_color = array_key_exists( 'textColor', $attributes );
181 $has_custom_text_color = array_key_exists( 'customTextColor', $attributes );
182 $has_named_background_color = array_key_exists( 'backgroundColor', $attributes );
183 $has_custom_background_color = array_key_exists( 'customBackgroundColor', $attributes );
184 $has_named_gradient = array_key_exists( 'gradient', $attributes );
185 $has_custom_gradient = array_key_exists( 'customGradient', $attributes );
186 $has_border_radius = array_key_exists( 'borderRadius', $attributes );
187 $has_font_family = array_key_exists( 'fontFamily', $attributes );
188 $has_typography_styles = array_key_exists( 'style', $attributes ) && array_key_exists( 'typography', $attributes['style'] );
189 $has_custom_font_size = $has_typography_styles && array_key_exists( 'fontSize', $attributes['style']['typography'] );
190 $has_custom_text_transform = $has_typography_styles && array_key_exists( 'textTransform', $attributes['style']['typography'] );
191 $border_styles = array();
192 $border_attribute = $attributes['style']['border'] ?? null;
193 $is_border_style_array = is_array( $border_attribute );
194
195 $has_custom_border_color = $is_border_style_array && isset( $border_attribute['color'] );
196 $has_border_style = $is_border_style_array && isset( $border_attribute['style'] );
197 $has_border_width = $is_border_style_array && isset( $border_attribute['width'] );
198 $has_individual_borders = $is_border_style_array && (
199 isset( $border_attribute['top'] ) ||
200 isset( $border_attribute['right'] ) ||
201 isset( $border_attribute['bottom'] ) ||
202 isset( $border_attribute['left'] )
203 );
204
205 if ( $has_font_family ) {
206 $styles[] = sprintf( 'font-family: %s;', $attributes['fontFamily'] );
207 }
208
209 if ( $has_custom_font_size ) {
210 $styles[] = sprintf( 'font-size: %s;', $attributes['style']['typography']['fontSize'] );
211 }
212
213 if ( $has_custom_text_transform ) {
214 $styles[] = sprintf( 'text-transform: %s;', $attributes['style']['typography']['textTransform'] );
215 }
216
217 if ( ! $has_named_text_color && $has_custom_text_color ) {
218 $styles[] = sprintf( 'color: %s;', $attributes['customTextColor'] );
219 }
220
221 if ( ! $has_named_background_color && ! $has_named_gradient && $has_custom_gradient ) {
222 $styles[] = sprintf( 'background: %s;', $attributes['customGradient'] );
223 }
224
225 if (
226 $has_custom_background_color &&
227 ! $has_named_background_color &&
228 ! $has_named_gradient &&
229 ! $has_custom_gradient
230 ) {
231 $styles[] = sprintf( 'background-color: %s;', $attributes['customBackgroundColor'] );
232 }
233
234 // phpcs:ignore Universal.Operators.StrictComparisons.LooseNotEqual
235 if ( $has_border_radius && 0 != $attributes['borderRadius'] ) {
236 $styles[] = sprintf( 'border-radius: %spx;', $attributes['borderRadius'] );
237 }
238
239 if ( $has_custom_border_color ) {
240 $border_styles['color'] = $attributes['style']['border']['color'];
241 }
242
243 if ( $has_border_style ) {
244 $border_styles['style'] = $attributes['style']['border']['style'];
245 }
246
247 if ( $has_border_width ) {
248 $border_styles['width'] = $attributes['style']['border']['width'];
249 }
250
251 if ( $has_individual_borders ) {
252 foreach ( array( 'top', 'right', 'bottom', 'left' ) as $side ) {
253 $border = $attributes['style']['border'][ $side ] ?? null;
254 if ( is_array( $border ) ) {
255 $border_side_values = array(
256 'width' => $border['width'] ?? null,
257 'color' => $border['color'] ?? null,
258 'style' => $border['style'] ?? null,
259 );
260 $border_styles[ $side ] = $border_side_values;
261 }
262 }
263 }
264
265 $border_styles = wp_style_engine_get_styles( array( 'border' => $border_styles ) );
266 if ( isset( $border_styles['css'] ) ) {
267 $styles[] = $border_styles['css'];
268 }
269
270 return implode( ' ', $styles );
271 }
272
273 /**
274 * Get the Button wrapper block styles.
275 *
276 * @param array $attributes Array containing the block attributes.
277 *
278 * @return string
279 */
280 function get_button_wrapper_styles( $attributes ) {
281 $styles = array();
282 $has_width = array_key_exists( 'width', $attributes );
283
284 if ( $has_width && ! empty( $attributes['width'] ) ) {
285 $styles[] = sprintf( 'width: %s;', $attributes['width'] );
286 }
287
288 return implode( ' ', $styles );
289 }
290
291 /**
292 * Get filtered attributes.
293 *
294 * @param array $attributes Array containing the Button block attributes.
295 * @param string $attribute_name String containing the attribute name to get.
296 *
297 * @return string
298 */
299 function get_attribute( $attributes, $attribute_name ) {
300 if ( isset( $attributes[ $attribute_name ] ) ) {
301 return $attributes[ $attribute_name ];
302 }
303
304 $default_attributes = array(
305 'url' => '#',
306 'element' => 'a',
307 'saveInPostContent' => false,
308 );
309
310 if ( isset( $default_attributes[ $attribute_name ] ) ) {
311 return $default_attributes[ $attribute_name ];
312 }
313 }
314
315 /**
316 * Enqueue style for an existing block.
317 *
318 * The Jetpack Button block depends on styles from the core button block.
319 * In case that block is not already within the post content, we can use
320 * this function to ensure the block's style assets are enqueued.
321 *
322 * @param string $block_name Block type name including namespace.
323 */
324 function enqueue_existing_button_style_dependency( $block_name ) {
325 $existing_block = \WP_Block_Type_Registry::get_instance()->get_registered( $block_name );
326 if ( isset( $existing_block ) && ! empty( $existing_block->style ) ) {
327 wp_enqueue_style( $existing_block->style );
328 }
329 }
330