PluginProbe
Gutenberg / 16.2.0
Gutenberg v16.2.0
24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 12.6.0 All 403 releases
gutenberg / lib / block-supports / settings.php

settings.php in Gutenberg 16.2.0, at lib/block-supports/settings.php

142 lines 4.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Block level presets support.
4 *
5 * @package gutenberg
6 */
7
8 /**
9 * Get the class name used on block level presets.
10 *
11 * @access private
12 *
13 * @param array $block Block object.
14 * @return string The unique class name.
15 */
16 function _gutenberg_get_presets_class_name( $block ) {
17 return 'wp-settings-' . md5( serialize( $block ) );
18 }
19
20 /**
21 * Update the block content with block level presets class name.
22 *
23 * @access private
24 *
25 * @param string $block_content Rendered block content.
26 * @param array $block Block object.
27 * @return string Filtered block content.
28 */
29 function _gutenberg_add_block_level_presets_class( $block_content, $block ) {
30 if ( ! $block_content ) {
31 return $block_content;
32 }
33
34 // return early if the block doesn't have support for settings.
35 $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
36 if ( ! block_has_support( $block_type, array( '__experimentalSettings' ), false ) ) {
37 return $block_content;
38 }
39
40 // return early if no settings are found on the block attributes.
41 $block_settings = _wp_array_get( $block, array( 'attrs', 'settings' ), null );
42 if ( empty( $block_settings ) ) {
43 return $block_content;
44 }
45
46 // Like the layout hook this assumes the hook only applies to blocks with a single wrapper.
47 // Add the class name to the first element, presuming it's the wrapper, if it exists.
48 $tags = new WP_HTML_Tag_Processor( $block_content );
49 if ( $tags->next_tag() ) {
50 $tags->add_class( _gutenberg_get_presets_class_name( $block ) );
51 }
52
53 return $tags->get_updated_html();
54 }
55
56 /**
57 * Render the block level presets stylesheet.
58 *
59 * @access private
60 *
61 * @param string|null $pre_render The pre-rendered content. Default null.
62 * @param array $block The block being rendered.
63 *
64 * @return null
65 */
66 function _gutenberg_add_block_level_preset_styles( $pre_render, $block ) {
67 // Return early if the block has not support for descendent block styles.
68 $block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
69 if ( ! block_has_support( $block_type, array( '__experimentalSettings' ), false ) ) {
70 return null;
71 }
72
73 // return early if no settings are found on the block attributes.
74 $block_settings = _wp_array_get( $block, array( 'attrs', 'settings' ), null );
75 if ( empty( $block_settings ) ) {
76 return null;
77 }
78
79 $class_name = '.' . _gutenberg_get_presets_class_name( $block );
80
81 // the root selector for preset variables needs to target every possible block selector
82 // in order for the general setting to override any bock specific setting of a parent block or
83 // the site root.
84 $variables_root_selector = '*,[class*="wp-block"]';
85 $registry = WP_Block_Type_Registry::get_instance();
86 $blocks = $registry->get_all_registered();
87 foreach ( $blocks as $block_type ) {
88 // We only want to append selectors for block's using custom selectors
89 // i.e. not `wp-block-<name>`.
90 $has_custom_selector =
91 ( isset( $block_type->supports['__experimentalSelector'] ) && is_string( $block_type->supports['__experimentalSelector'] ) ) ||
92 ( isset( $block_type->selectors['root'] ) && is_string( $block_type->selectors['root'] ) );
93
94 if ( $has_custom_selector ) {
95 $variables_root_selector .= ',' . wp_get_block_css_selector( $block_type );
96 }
97 }
98 $variables_root_selector = WP_Theme_JSON_Gutenberg::scope_selector( $class_name, $variables_root_selector );
99
100 // Remove any potentially unsafe styles.
101 $theme_json_shape = WP_Theme_JSON_Gutenberg::remove_insecure_properties(
102 array(
103 'version' => WP_Theme_JSON_Gutenberg::LATEST_SCHEMA,
104 'settings' => $block_settings,
105 )
106 );
107 $theme_json_object = new WP_Theme_JSON_Gutenberg( $theme_json_shape );
108
109 $styles = '';
110
111 // include preset css variables declaration on the stylesheet.
112 $styles .= $theme_json_object->get_stylesheet(
113 array( 'variables' ),
114 null,
115 array(
116 'root_selector' => $variables_root_selector,
117 'scope' => $class_name,
118 )
119 );
120
121 // include preset css classes on the stylesheet.
122 $styles .= $theme_json_object->get_stylesheet(
123 array( 'presets' ),
124 null,
125 array(
126 'root_selector' => $class_name . ',' . $class_name . ' *',
127 'scope' => $class_name,
128 )
129 );
130
131 if ( ! empty( $styles ) ) {
132 gutenberg_enqueue_block_support_styles( $styles );
133 }
134
135 return null;
136 }
137 // Remove WordPress core filter to avoid rendering duplicate settings style blocks.
138 remove_filter( 'render_block', '_wp_add_block_level_presets_class', 10, 2 );
139 remove_filter( 'pre_render_block', '_wp_add_block_level_preset_styles', 10, 2 );
140 add_filter( 'render_block', '_gutenberg_add_block_level_presets_class', 10, 2 );
141 add_filter( 'pre_render_block', '_gutenberg_add_block_level_preset_styles', 10, 2 );
142