PluginProbe
Gutenberg / 13.5.1
Gutenberg v13.5.1
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 / build / block-library / blocks / site-logo.php

site-logo.php in Gutenberg 13.5.1, at build/block-library/blocks/site-logo.php

202 lines 5.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Server-side rendering of the `core/site-logo` block.
4 *
5 * @package WordPress
6 */
7
8 /**
9 * Renders the `core/site-logo` block on the server.
10 *
11 * @param array $attributes The block attributes.
12 *
13 * @return string The render.
14 */
15 function gutenberg_render_block_core_site_logo( $attributes ) {
16 $adjust_width_height_filter = function ( $image ) use ( $attributes ) {
17 if ( empty( $attributes['width'] ) || empty( $image ) || ! $image[1] || ! $image[2] ) {
18 return $image;
19 }
20 $height = (float) $attributes['width'] / ( (float) $image[1] / (float) $image[2] );
21 return array( $image[0], (int) $attributes['width'], (int) $height );
22 };
23
24 add_filter( 'wp_get_attachment_image_src', $adjust_width_height_filter );
25
26 $custom_logo = get_custom_logo();
27
28 remove_filter( 'wp_get_attachment_image_src', $adjust_width_height_filter );
29
30 if ( empty( $custom_logo ) ) {
31 return ''; // Return early if no custom logo is set, avoiding extraneous wrapper div.
32 }
33
34 if ( ! $attributes['isLink'] ) {
35 // Remove the link.
36 $custom_logo = preg_replace( '#<a.*?>(.*?)</a>#i', '\1', $custom_logo );
37 }
38
39 if ( $attributes['isLink'] && '_blank' === $attributes['linkTarget'] ) {
40 // Add the link target after the rel="home".
41 // Add an aria-label for informing that the page opens in a new tab.
42 $aria_label = 'aria-label="' . esc_attr__( '(Home link, opens in a new tab)' ) . '"';
43 $custom_logo = str_replace( 'rel="home"', 'rel="home" target="' . esc_attr( $attributes['linkTarget'] ) . '"' . $aria_label, $custom_logo );
44 }
45
46 $classnames = array();
47 if ( empty( $attributes['width'] ) ) {
48 $classnames[] = 'is-default-size';
49 }
50
51 $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classnames ) ) );
52 $html = sprintf( '<div %s>%s</div>', $wrapper_attributes, $custom_logo );
53 return $html;
54 }
55
56 /**
57 * Register a core site setting for a site logo
58 */
59 function gutenberg_gutenberg_register_block_core_site_logo_setting() {
60 register_setting(
61 'general',
62 'site_logo',
63 array(
64 'show_in_rest' => array(
65 'name' => 'site_logo',
66 ),
67 'type' => 'integer',
68 'description' => __( 'Site logo.' ),
69 )
70 );
71 }
72
73 add_action( 'rest_api_init', 'gutenberg_gutenberg_register_block_core_site_logo_setting', 10 );
74
75 /**
76 * Register a core site setting for a site icon
77 */
78 function gutenberg_register_block_core_site_icon_setting() {
79 register_setting(
80 'general',
81 'site_icon',
82 array(
83 'show_in_rest' => true,
84 'type' => 'integer',
85 'description' => __( 'Site icon.' ),
86 )
87 );
88 }
89
90 add_action( 'rest_api_init', 'gutenberg_register_block_core_site_icon_setting', 10 );
91
92 /**
93 * Registers the `core/site-logo` block on the server.
94 */
95 function gutenberg_register_block_core_site_logo() {
96 register_block_type_from_metadata(
97 __DIR__ . '/site-logo',
98 array(
99 'render_callback' => 'gutenberg_render_block_core_site_logo',
100 )
101 );
102 }
103
104 add_action( 'init', 'gutenberg_register_block_core_site_logo', 20 );
105
106 /**
107 * Overrides the custom logo with a site logo, if the option is set.
108 *
109 * @param string $custom_logo The custom logo set by a theme.
110 *
111 * @return string The site logo if set.
112 */
113 function gutenberg__override_custom_logo_theme_mod( $custom_logo ) {
114 $site_logo = get_option( 'site_logo' );
115 return false === $site_logo ? $custom_logo : $site_logo;
116 }
117
118 add_filter( 'theme_mod_custom_logo', 'gutenberg__override_custom_logo_theme_mod' );
119
120 /**
121 * Updates the site_logo option when the custom_logo theme-mod gets updated.
122 *
123 * @param mixed $value Attachment ID of the custom logo or an empty value.
124 * @return mixed
125 */
126 function gutenberg__sync_custom_logo_to_site_logo( $value ) {
127 if ( empty( $value ) ) {
128 delete_option( 'site_logo' );
129 } else {
130 update_option( 'site_logo', $value );
131 }
132
133 return $value;
134 }
135
136 add_filter( 'pre_set_theme_mod_custom_logo', 'gutenberg__sync_custom_logo_to_site_logo' );
137
138 /**
139 * Deletes the site_logo when the custom_logo theme mod is removed.
140 *
141 * @param array $old_value Previous theme mod settings.
142 * @param array $value Updated theme mod settings.
143 */
144 function gutenberg__delete_site_logo_on_remove_custom_logo( $old_value, $value ) {
145 global $_ignore_site_logo_changes;
146
147 if ( $_ignore_site_logo_changes ) {
148 return;
149 }
150
151 // If the custom_logo is being unset, it's being removed from theme mods.
152 if ( isset( $old_value['custom_logo'] ) && ! isset( $value['custom_logo'] ) ) {
153 delete_option( 'site_logo' );
154 }
155 }
156
157 /**
158 * Deletes the site logo when all theme mods are being removed.
159 */
160 function gutenberg__delete_site_logo_on_remove_theme_mods() {
161 global $_ignore_site_logo_changes;
162
163 if ( $_ignore_site_logo_changes ) {
164 return;
165 }
166
167 if ( false !== get_theme_support( 'custom-logo' ) ) {
168 delete_option( 'site_logo' );
169 }
170 }
171
172 /**
173 * Hooks `gutenberg__delete_site_logo_on_remove_custom_logo` in `update_option_theme_mods_$theme`.
174 * Hooks `gutenberg__delete_site_logo_on_remove_theme_mods` in `delete_option_theme_mods_$theme`.
175 *
176 * Runs on `setup_theme` to account for dynamically-switched themes in the Customizer.
177 */
178 function gutenberg_gutenberg__delete_site_logo_on_remove_custom_logo_on_setup_theme() {
179 $theme = get_option( 'stylesheet' );
180 add_action( "update_option_theme_mods_$theme", 'gutenberg__delete_site_logo_on_remove_custom_logo', 10, 2 );
181 add_action( "delete_option_theme_mods_$theme", 'gutenberg__delete_site_logo_on_remove_theme_mods' );
182 }
183 add_action( 'setup_theme', 'gutenberg_gutenberg__delete_site_logo_on_remove_custom_logo_on_setup_theme', 11 );
184
185 /**
186 * Removes the custom_logo theme-mod when the site_logo option gets deleted.
187 */
188 function gutenberg__delete_custom_logo_on_remove_site_logo() {
189 global $_ignore_site_logo_changes;
190
191 // Prevent gutenberg__delete_site_logo_on_remove_custom_logo and
192 // gutenberg__delete_site_logo_on_remove_theme_mods from firing and causing an
193 // infinite loop.
194 $_ignore_site_logo_changes = true;
195
196 // Remove the custom logo.
197 remove_theme_mod( 'custom_logo' );
198
199 $_ignore_site_logo_changes = false;
200 }
201 add_action( 'delete_option_site_logo', 'gutenberg__delete_custom_logo_on_remove_site_logo' );
202