PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.5.1
Jetpack – WP Security, Backup, Speed, & Growth v15.5.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 9 months ago
button.php
438 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 'render_email_callback' => __NAMESPACE__ . '\render_email',
33 'uses_context' => array( 'jetpack/parentBlockWidth' ),
34 'selectors' => array(
35 'border' => '.wp-block-jetpack-button .wp-block-button__link',
36 ),
37 )
38 );
39 }
40 add_action( 'init', __NAMESPACE__ . '\register_block' );
41
42 /**
43 * Button block render callback.
44 *
45 * @param array $attributes Array containing the Button block attributes.
46 * @param string $content The Button block content.
47 *
48 * @return string
49 */
50 function render_block( $attributes, $content ) {
51 $save_in_post_content = get_attribute( $attributes, 'saveInPostContent' );
52
53 // The Jetpack Button block depends on the core button block styles.
54 // The following ensures that those styles are enqueued when rendering this block.
55 enqueue_existing_button_style_dependency( 'core/button' );
56 enqueue_existing_button_style_dependency( 'core/buttons' );
57
58 Jetpack_Gutenberg::load_styles_as_required( FEATURE_NAME );
59
60 if ( $save_in_post_content || ! class_exists( 'DOMDocument' ) ) {
61 return $content;
62 }
63
64 $element = get_attribute( $attributes, 'element' );
65 $text = wp_kses_post( get_attribute( $attributes, 'text' ) );
66 $unique_id = get_attribute( $attributes, 'uniqueId' );
67 $url = get_attribute( $attributes, 'url' );
68 $classes = Blocks::classes( FEATURE_NAME, $attributes, array( 'wp-block-button' ) );
69
70 $button_classes = get_button_classes( $attributes );
71 $button_styles = get_button_styles( $attributes );
72 $wrapper_styles = get_button_wrapper_styles( $attributes );
73
74 $wrapper_attributes = sprintf( ' class="%s" style="%s"', esc_attr( $classes ), esc_attr( $wrapper_styles ) );
75 $button_attributes = sprintf( ' class="%s" style="%s"', esc_attr( $button_classes ), esc_attr( $button_styles ) );
76
77 if ( empty( $unique_id ) ) {
78 $button_attributes .= ' data-id-attr="placeholder"';
79 } else {
80 $button_attributes .= sprintf( ' data-id-attr="%1$s" id="%1$s"', esc_attr( $unique_id ) );
81 }
82
83 if ( ! in_array( $element, array( 'a', 'button', 'input' ), true ) ) {
84 $element = 'a';
85 }
86
87 if ( 'a' === $element ) {
88 $button_attributes .= sprintf( ' href="%s" target="_blank" role="button" rel="noopener noreferrer"', esc_url( $url ) );
89 } elseif ( 'button' === $element ) {
90 $button_attributes .= ' type="submit"';
91 } elseif ( 'input' === $element ) {
92 $button_attributes .= sprintf( ' type="submit" value="%s"', esc_attr( wp_strip_all_tags( $text, true ) ) );
93 }
94
95 $button_attributes .= ' data-wp-class--is-submitting="state.isSubmitting" data-wp-bind--aria-disabled="state.isAriaDisabled"';
96
97 $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>';
98 $form_submitting_text = '<span class="is-visually-hidden">' . __( 'Submitting form', 'jetpack' ) . '</span>';
99 $spinner = '<span class="spinner" aria-hidden="true">' . $svg . $form_submitting_text . '</span>';
100
101 $button = 'input' === $element
102 ? '<' . $element . $button_attributes . ' />'
103 : '<' . $element . $button_attributes . '>' . $text . $spinner . '</' . $element . '>';
104
105 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
106 return '<div' . $wrapper_attributes . '>' . $button . '</div>';
107 }
108
109 /**
110 * WooCommerce Email Editor render callback for the button block.
111 *
112 * @param string $block_content The block content.
113 * @param array $parsed_block The parsed block data.
114 * @param object $rendering_context The email rendering context.
115 *
116 * @return string
117 */
118 function render_email( $block_content, array $parsed_block, $rendering_context ) {
119 // Validate input parameters and required dependencies
120 if ( ! isset( $parsed_block['attrs'] ) || ! is_array( $parsed_block['attrs'] ) ||
121 ! class_exists( '\Automattic\WooCommerce\EmailEditor\Integrations\Core\Renderer\Blocks\Button' ) ) {
122 return '';
123 }
124
125 $attributes = $parsed_block['attrs'];
126
127 // Create a mock innerHTML that WooCommerce's button renderer can parse
128 $button_text = ! empty( $attributes['text'] ) ? sanitize_text_field( $attributes['text'] ) : __( 'Click here', 'jetpack' );
129 $button_url = ! empty( $attributes['url'] ) ? $attributes['url'] : '#';
130
131 // Create the innerHTML that WooCommerce's button renderer expects
132 $inner_html = sprintf(
133 '<div class="wp-block-button"><a class="wp-block-button__link" href="%s">%s</a></div>',
134 esc_url( $button_url ),
135 esc_html( $button_text )
136 );
137
138 // Format attributes for WooCommerce's Styles_Helper
139 $formatted_attributes = format_attributes_for_woocommerce( $attributes );
140
141 // Create a mock parsed block that WooCommerce's button renderer can handle
142 $mock_parsed_block = array(
143 'innerHTML' => $inner_html,
144 'attrs' => $formatted_attributes,
145 );
146
147 // Use WooCommerce's core button renderer
148 $woo_button_renderer = new \Automattic\WooCommerce\EmailEditor\Integrations\Core\Renderer\Blocks\Button();
149
150 return $woo_button_renderer->render( $block_content, $mock_parsed_block, $rendering_context );
151 }
152
153 /**
154 * Format button attributes for WooCommerce's Styles_Helper.
155 *
156 * @param array $attributes The original attributes.
157 * @return array The formatted attributes.
158 */
159 function format_attributes_for_woocommerce( $attributes ) {
160 $formatted = array();
161
162 // Handle background colors (prioritize subscription attributes)
163 // Named colors go in backgroundColor, hex colors go in style.color.background
164 if ( ! empty( $attributes['buttonBackgroundColor'] ) ) {
165 $formatted['backgroundColor'] = $attributes['buttonBackgroundColor'];
166 } elseif ( ! empty( $attributes['backgroundColor'] ) ) {
167 $formatted['backgroundColor'] = $attributes['backgroundColor'];
168 }
169
170 if ( ! empty( $attributes['customButtonBackgroundColor'] ) ) {
171 $formatted['style']['color']['background'] = $attributes['customButtonBackgroundColor'];
172 } elseif ( ! empty( $attributes['customBackgroundColor'] ) ) {
173 $formatted['style']['color']['background'] = $attributes['customBackgroundColor'];
174 }
175
176 // Named colors go in textColor, hex colors go in style.color.text
177 if ( ! empty( $attributes['textColor'] ) ) {
178 $formatted['textColor'] = $attributes['textColor'];
179 }
180 if ( ! empty( $attributes['customTextColor'] ) ) {
181 $formatted['style']['color']['text'] = $attributes['customTextColor'];
182 }
183
184 // Handle typography (font size)
185 if ( ! empty( $attributes['fontSize'] ) ) {
186 $formatted['style']['typography']['fontSize'] = $attributes['fontSize'];
187 }
188 if ( ! empty( $attributes['customFontSize'] ) ) {
189 $formatted['style']['typography']['fontSize'] = $attributes['customFontSize'];
190 }
191
192 // Handle borders
193 if ( ! empty( $attributes['borderRadius'] ) ) {
194 $formatted['style']['border']['radius'] = $attributes['borderRadius'] . 'px';
195 }
196 // Named colors go in borderColor, hex colors go in style.color.border
197 if ( ! empty( $attributes['borderColor'] ) ) {
198 $formatted['borderColor'] = $attributes['borderColor'];
199 }
200 if ( ! empty( $attributes['customBorderColor'] ) ) {
201 $formatted['style']['border']['color'] = $attributes['customBorderColor'];
202 }
203 // Handle border weight (subscription block uses borderWeight, button block expects style.border.width)
204 if ( ! empty( $attributes['borderWeight'] ) ) {
205 $formatted['style']['border']['width'] = $attributes['borderWeight'] . 'px';
206 }
207
208 // Handle padding
209 if ( ! empty( $attributes['padding'] ) ) {
210 $formatted['style']['spacing']['padding'] = $attributes['padding'] . 'px';
211 }
212
213 return $formatted;
214 }
215
216 /**
217 * Get the Button block classes.
218 *
219 * @param array $attributes Array containing the block attributes.
220 *
221 * @return string
222 */
223 function get_button_classes( $attributes ) {
224 $classes = array( 'wp-block-button__link' );
225 $has_class_name = array_key_exists( 'className', $attributes );
226 $has_named_text_color = array_key_exists( 'textColor', $attributes );
227 $has_custom_text_color = array_key_exists( 'customTextColor', $attributes );
228 $has_named_background_color = array_key_exists( 'backgroundColor', $attributes );
229 $has_custom_background_color = array_key_exists( 'customBackgroundColor', $attributes );
230 $has_named_gradient = array_key_exists( 'gradient', $attributes );
231 $has_custom_gradient = array_key_exists( 'customGradient', $attributes );
232 $has_border_radius = array_key_exists( 'borderRadius', $attributes );
233 $has_font_size = array_key_exists( 'fontSize', $attributes );
234 $has_named_border_color = array_key_exists( 'borderColor', $attributes );
235
236 if ( $has_font_size ) {
237 $classes[] = 'has-' . $attributes['fontSize'] . '-font-size';
238 $classes[] = 'has-custom-font-size';
239 }
240
241 if ( $has_class_name ) {
242 $classes[] = $attributes['className'];
243 }
244
245 if ( $has_named_text_color || $has_custom_text_color ) {
246 $classes[] = 'has-text-color';
247 }
248 if ( $has_named_text_color ) {
249 $classes[] = sprintf( 'has-%s-color', $attributes['textColor'] );
250 }
251
252 if ( $has_named_border_color ) {
253 $classes[] = sprintf( 'has-%s-border-color', $attributes['borderColor'] );
254 }
255
256 if (
257 $has_named_background_color ||
258 $has_custom_background_color ||
259 $has_named_gradient ||
260 $has_custom_gradient
261 ) {
262 $classes[] = 'has-background';
263 }
264 if ( $has_named_background_color && ! $has_custom_gradient ) {
265 $classes[] = sprintf( 'has-%s-background-color', $attributes['backgroundColor'] );
266 }
267 if ( $has_named_gradient ) {
268 $classes[] = sprintf( 'has-%s-gradient-background', $attributes['gradient'] );
269 }
270
271 // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
272 if ( $has_border_radius && 0 == $attributes['borderRadius'] ) {
273 $classes[] = 'no-border-radius';
274 }
275
276 return implode( ' ', $classes );
277 }
278
279 /**
280 * Get the Button block styles.
281 *
282 * @param array $attributes Array containing the block attributes.
283 *
284 * @return string
285 */
286 function get_button_styles( $attributes ) {
287 $styles = array();
288 $has_named_text_color = array_key_exists( 'textColor', $attributes );
289 $has_custom_text_color = array_key_exists( 'customTextColor', $attributes );
290 $has_named_background_color = array_key_exists( 'backgroundColor', $attributes );
291 $has_custom_background_color = array_key_exists( 'customBackgroundColor', $attributes );
292 $has_named_gradient = array_key_exists( 'gradient', $attributes );
293 $has_custom_gradient = array_key_exists( 'customGradient', $attributes );
294 $has_border_radius = array_key_exists( 'borderRadius', $attributes );
295 $has_font_family = array_key_exists( 'fontFamily', $attributes );
296 $has_typography_styles = array_key_exists( 'style', $attributes ) && array_key_exists( 'typography', $attributes['style'] );
297 $has_custom_font_size = $has_typography_styles && array_key_exists( 'fontSize', $attributes['style']['typography'] );
298 $has_custom_text_transform = $has_typography_styles && array_key_exists( 'textTransform', $attributes['style']['typography'] );
299 $border_styles = array();
300 $border_attribute = $attributes['style']['border'] ?? null;
301 $is_border_style_array = is_array( $border_attribute );
302
303 $has_custom_border_color = $is_border_style_array && isset( $border_attribute['color'] );
304 $has_border_style = $is_border_style_array && isset( $border_attribute['style'] );
305 $has_border_width = $is_border_style_array && isset( $border_attribute['width'] );
306 $has_individual_borders = $is_border_style_array && (
307 isset( $border_attribute['top'] ) ||
308 isset( $border_attribute['right'] ) ||
309 isset( $border_attribute['bottom'] ) ||
310 isset( $border_attribute['left'] )
311 );
312
313 if ( $has_font_family ) {
314 $styles[] = sprintf( 'font-family: %s;', $attributes['fontFamily'] );
315 }
316
317 if ( $has_custom_font_size ) {
318 $styles[] = sprintf( 'font-size: %s;', $attributes['style']['typography']['fontSize'] );
319 }
320
321 if ( $has_custom_text_transform ) {
322 $styles[] = sprintf( 'text-transform: %s;', $attributes['style']['typography']['textTransform'] );
323 }
324
325 if ( ! $has_named_text_color && $has_custom_text_color ) {
326 $styles[] = sprintf( 'color: %s;', $attributes['customTextColor'] );
327 }
328
329 if ( ! $has_named_background_color && ! $has_named_gradient && $has_custom_gradient ) {
330 $styles[] = sprintf( 'background: %s;', $attributes['customGradient'] );
331 }
332
333 if (
334 $has_custom_background_color &&
335 ! $has_named_background_color &&
336 ! $has_named_gradient &&
337 ! $has_custom_gradient
338 ) {
339 $styles[] = sprintf( 'background-color: %s;', $attributes['customBackgroundColor'] );
340 }
341
342 // phpcs:ignore Universal.Operators.StrictComparisons.LooseNotEqual
343 if ( $has_border_radius && 0 != $attributes['borderRadius'] ) {
344 $styles[] = sprintf( 'border-radius: %spx;', $attributes['borderRadius'] );
345 }
346
347 if ( $has_custom_border_color ) {
348 $border_styles['color'] = $attributes['style']['border']['color'];
349 }
350
351 if ( $has_border_style ) {
352 $border_styles['style'] = $attributes['style']['border']['style'];
353 }
354
355 if ( $has_border_width ) {
356 $border_styles['width'] = $attributes['style']['border']['width'];
357 }
358
359 if ( $has_individual_borders ) {
360 foreach ( array( 'top', 'right', 'bottom', 'left' ) as $side ) {
361 $border = $attributes['style']['border'][ $side ] ?? null;
362 if ( is_array( $border ) ) {
363 $border_side_values = array(
364 'width' => $border['width'] ?? null,
365 'color' => $border['color'] ?? null,
366 'style' => $border['style'] ?? null,
367 );
368 $border_styles[ $side ] = $border_side_values;
369 }
370 }
371 }
372
373 $border_styles = wp_style_engine_get_styles( array( 'border' => $border_styles ) );
374 if ( isset( $border_styles['css'] ) ) {
375 $styles[] = $border_styles['css'];
376 }
377
378 return implode( ' ', $styles );
379 }
380
381 /**
382 * Get the Button wrapper block styles.
383 *
384 * @param array $attributes Array containing the block attributes.
385 *
386 * @return string
387 */
388 function get_button_wrapper_styles( $attributes ) {
389 $styles = array();
390 $has_width = array_key_exists( 'width', $attributes );
391
392 if ( $has_width && ! empty( $attributes['width'] ) ) {
393 $styles[] = sprintf( 'width: %s;', $attributes['width'] );
394 }
395
396 return implode( ' ', $styles );
397 }
398
399 /**
400 * Get filtered attributes.
401 *
402 * @param array $attributes Array containing the Button block attributes.
403 * @param string $attribute_name String containing the attribute name to get.
404 *
405 * @return string
406 */
407 function get_attribute( $attributes, $attribute_name ) {
408 if ( isset( $attributes[ $attribute_name ] ) ) {
409 return $attributes[ $attribute_name ];
410 }
411
412 $default_attributes = array(
413 'url' => '#',
414 'element' => 'a',
415 'saveInPostContent' => false,
416 );
417
418 if ( isset( $default_attributes[ $attribute_name ] ) ) {
419 return $default_attributes[ $attribute_name ];
420 }
421 }
422
423 /**
424 * Enqueue style for an existing block.
425 *
426 * The Jetpack Button block depends on styles from the core button block.
427 * In case that block is not already within the post content, we can use
428 * this function to ensure the block's style assets are enqueued.
429 *
430 * @param string $block_name Block type name including namespace.
431 */
432 function enqueue_existing_button_style_dependency( $block_name ) {
433 $existing_block = \WP_Block_Type_Registry::get_instance()->get_registered( $block_name );
434 if ( isset( $existing_block ) && ! empty( $existing_block->style ) ) {
435 wp_enqueue_style( $existing_block->style );
436 }
437 }
438