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