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