PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 14.6.1
Jetpack – WP Security, Backup, Speed, & Growth v14.6.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
320 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 = 'input' === $element
91 ? '<' . $element . $button_attributes . ' />'
92 : '<' . $element . $button_attributes . '>' . $text . '</' . $element . '>';
93
94 // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
95 return '<div' . $wrapper_attributes . '>' . $button . '</div>';
96 }
97
98 /**
99 * Get the Button block classes.
100 *
101 * @param array $attributes Array containing the block attributes.
102 *
103 * @return string
104 */
105 function get_button_classes( $attributes ) {
106 $classes = array( 'wp-block-button__link' );
107 $has_class_name = array_key_exists( 'className', $attributes );
108 $has_named_text_color = array_key_exists( 'textColor', $attributes );
109 $has_custom_text_color = array_key_exists( 'customTextColor', $attributes );
110 $has_named_background_color = array_key_exists( 'backgroundColor', $attributes );
111 $has_custom_background_color = array_key_exists( 'customBackgroundColor', $attributes );
112 $has_named_gradient = array_key_exists( 'gradient', $attributes );
113 $has_custom_gradient = array_key_exists( 'customGradient', $attributes );
114 $has_border_radius = array_key_exists( 'borderRadius', $attributes );
115 $has_font_size = array_key_exists( 'fontSize', $attributes );
116 $has_named_border_color = array_key_exists( 'borderColor', $attributes );
117
118 if ( $has_font_size ) {
119 $classes[] = 'has-' . $attributes['fontSize'] . '-font-size';
120 $classes[] = 'has-custom-font-size';
121 }
122
123 if ( $has_class_name ) {
124 $classes[] = $attributes['className'];
125 }
126
127 if ( $has_named_text_color || $has_custom_text_color ) {
128 $classes[] = 'has-text-color';
129 }
130 if ( $has_named_text_color ) {
131 $classes[] = sprintf( 'has-%s-color', $attributes['textColor'] );
132 }
133
134 if ( $has_named_border_color ) {
135 $classes[] = sprintf( 'has-%s-border-color', $attributes['borderColor'] );
136 }
137
138 if (
139 $has_named_background_color ||
140 $has_custom_background_color ||
141 $has_named_gradient ||
142 $has_custom_gradient
143 ) {
144 $classes[] = 'has-background';
145 }
146 if ( $has_named_background_color && ! $has_custom_gradient ) {
147 $classes[] = sprintf( 'has-%s-background-color', $attributes['backgroundColor'] );
148 }
149 if ( $has_named_gradient ) {
150 $classes[] = sprintf( 'has-%s-gradient-background', $attributes['gradient'] );
151 }
152
153 // phpcs:ignore Universal.Operators.StrictComparisons.LooseEqual
154 if ( $has_border_radius && 0 == $attributes['borderRadius'] ) {
155 $classes[] = 'no-border-radius';
156 }
157
158 return implode( ' ', $classes );
159 }
160
161 /**
162 * Get the Button block styles.
163 *
164 * @param array $attributes Array containing the block attributes.
165 *
166 * @return string
167 */
168 function get_button_styles( $attributes ) {
169 $styles = array();
170 $has_named_text_color = array_key_exists( 'textColor', $attributes );
171 $has_custom_text_color = array_key_exists( 'customTextColor', $attributes );
172 $has_named_background_color = array_key_exists( 'backgroundColor', $attributes );
173 $has_custom_background_color = array_key_exists( 'customBackgroundColor', $attributes );
174 $has_named_gradient = array_key_exists( 'gradient', $attributes );
175 $has_custom_gradient = array_key_exists( 'customGradient', $attributes );
176 $has_border_radius = array_key_exists( 'borderRadius', $attributes );
177 $has_font_family = array_key_exists( 'fontFamily', $attributes );
178 $has_typography_styles = array_key_exists( 'style', $attributes ) && array_key_exists( 'typography', $attributes['style'] );
179 $has_custom_font_size = $has_typography_styles && array_key_exists( 'fontSize', $attributes['style']['typography'] );
180 $has_custom_text_transform = $has_typography_styles && array_key_exists( 'textTransform', $attributes['style']['typography'] );
181 $border_styles = array();
182 $border_attribute = $attributes['style']['border'] ?? null;
183 $is_border_style_array = is_array( $border_attribute );
184
185 $has_custom_border_color = $is_border_style_array && isset( $border_attribute['color'] );
186 $has_border_style = $is_border_style_array && isset( $border_attribute['style'] );
187 $has_border_width = $is_border_style_array && isset( $border_attribute['width'] );
188 $has_individual_borders = $is_border_style_array && (
189 isset( $border_attribute['top'] ) ||
190 isset( $border_attribute['right'] ) ||
191 isset( $border_attribute['bottom'] ) ||
192 isset( $border_attribute['left'] )
193 );
194
195 if ( $has_font_family ) {
196 $styles[] = sprintf( 'font-family: %s;', $attributes['fontFamily'] );
197 }
198
199 if ( $has_custom_font_size ) {
200 $styles[] = sprintf( 'font-size: %s;', $attributes['style']['typography']['fontSize'] );
201 }
202
203 if ( $has_custom_text_transform ) {
204 $styles[] = sprintf( 'text-transform: %s;', $attributes['style']['typography']['textTransform'] );
205 }
206
207 if ( ! $has_named_text_color && $has_custom_text_color ) {
208 $styles[] = sprintf( 'color: %s;', $attributes['customTextColor'] );
209 }
210
211 if ( ! $has_named_background_color && ! $has_named_gradient && $has_custom_gradient ) {
212 $styles[] = sprintf( 'background: %s;', $attributes['customGradient'] );
213 }
214
215 if (
216 $has_custom_background_color &&
217 ! $has_named_background_color &&
218 ! $has_named_gradient &&
219 ! $has_custom_gradient
220 ) {
221 $styles[] = sprintf( 'background-color: %s;', $attributes['customBackgroundColor'] );
222 }
223
224 // phpcs:ignore Universal.Operators.StrictComparisons.LooseNotEqual
225 if ( $has_border_radius && 0 != $attributes['borderRadius'] ) {
226 $styles[] = sprintf( 'border-radius: %spx;', $attributes['borderRadius'] );
227 }
228
229 if ( $has_custom_border_color ) {
230 $border_styles['color'] = $attributes['style']['border']['color'];
231 }
232
233 if ( $has_border_style ) {
234 $border_styles['style'] = $attributes['style']['border']['style'];
235 }
236
237 if ( $has_border_width ) {
238 $border_styles['width'] = $attributes['style']['border']['width'];
239 }
240
241 if ( $has_individual_borders ) {
242 foreach ( array( 'top', 'right', 'bottom', 'left' ) as $side ) {
243 $border = $attributes['style']['border'][ $side ] ?? null;
244 if ( is_array( $border ) ) {
245 $border_side_values = array(
246 'width' => $border['width'] ?? null,
247 'color' => $border['color'] ?? null,
248 'style' => $border['style'] ?? null,
249 );
250 $border_styles[ $side ] = $border_side_values;
251 }
252 }
253 }
254
255 $border_styles = wp_style_engine_get_styles( array( 'border' => $border_styles ) );
256 if ( isset( $border_styles['css'] ) ) {
257 $styles[] = $border_styles['css'];
258 }
259
260 return implode( ' ', $styles );
261 }
262
263 /**
264 * Get the Button wrapper block styles.
265 *
266 * @param array $attributes Array containing the block attributes.
267 *
268 * @return string
269 */
270 function get_button_wrapper_styles( $attributes ) {
271 $styles = array();
272 $has_width = array_key_exists( 'width', $attributes );
273
274 if ( $has_width ) {
275 $styles[] = sprintf( 'width: %s;', $attributes['width'] );
276 }
277
278 return implode( ' ', $styles );
279 }
280
281 /**
282 * Get filtered attributes.
283 *
284 * @param array $attributes Array containing the Button block attributes.
285 * @param string $attribute_name String containing the attribute name to get.
286 *
287 * @return string
288 */
289 function get_attribute( $attributes, $attribute_name ) {
290 if ( isset( $attributes[ $attribute_name ] ) ) {
291 return $attributes[ $attribute_name ];
292 }
293
294 $default_attributes = array(
295 'url' => '#',
296 'element' => 'a',
297 'saveInPostContent' => false,
298 );
299
300 if ( isset( $default_attributes[ $attribute_name ] ) ) {
301 return $default_attributes[ $attribute_name ];
302 }
303 }
304
305 /**
306 * Enqueue style for an existing block.
307 *
308 * The Jetpack Button block depends on styles from the core button block.
309 * In case that block is not already within the post content, we can use
310 * this function to ensure the block's style assets are enqueued.
311 *
312 * @param string $block_name Block type name including namespace.
313 */
314 function enqueue_existing_button_style_dependency( $block_name ) {
315 $existing_block = \WP_Block_Type_Registry::get_instance()->get_registered( $block_name );
316 if ( isset( $existing_block ) && ! empty( $existing_block->style ) ) {
317 wp_enqueue_style( $existing_block->style );
318 }
319 }
320