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