[ Index ] |
PHP Cross Reference of WordPress Trunk (Updated Daily) |
[Summary view] [Print] [Text view]
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 * @since 5.8.0 12 * 13 * @param array $attributes The block attributes. 14 * 15 * @return string The render. 16 */ 17 function render_block_core_site_logo( $attributes ) { 18 $adjust_width_height_filter = static function ( $image ) use ( $attributes ) { 19 if ( empty( $attributes['width'] ) || empty( $image ) || ! $image[1] || ! $image[2] ) { 20 return $image; 21 } 22 $height = (float) $attributes['width'] / ( (float) $image[1] / (float) $image[2] ); 23 return array( $image[0], (int) $attributes['width'], (int) $height ); 24 }; 25 26 add_filter( 'wp_get_attachment_image_src', $adjust_width_height_filter ); 27 28 $custom_logo = get_custom_logo(); 29 30 remove_filter( 'wp_get_attachment_image_src', $adjust_width_height_filter ); 31 32 if ( empty( $custom_logo ) ) { 33 return ''; // Return early if no custom logo is set, avoiding extraneous wrapper div. 34 } 35 36 if ( ! $attributes['isLink'] ) { 37 // Remove the link. 38 $custom_logo = preg_replace( '#<a.*?>(.*?)</a>#i', '\1', $custom_logo ); 39 } 40 41 if ( $attributes['isLink'] && '_blank' === $attributes['linkTarget'] ) { 42 // Add the link target after the rel="home". 43 // Add an aria-label for informing that the page opens in a new tab. 44 $processor = new WP_HTML_Tag_Processor( $custom_logo ); 45 $processor->next_tag( 'a' ); 46 if ( 'home' === $processor->get_attribute( 'rel' ) ) { 47 $processor->set_attribute( 'aria-label', __( '(Home link, opens in a new tab)' ) ); 48 $processor->set_attribute( 'target', $attributes['linkTarget'] ); 49 } 50 $custom_logo = $processor->get_updated_html(); 51 } 52 53 $classnames = array(); 54 if ( empty( $attributes['width'] ) ) { 55 $classnames[] = 'is-default-size'; 56 } 57 58 $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classnames ) ) ); 59 $html = sprintf( '<div %s>%s</div>', $wrapper_attributes, $custom_logo ); 60 return $html; 61 } 62 63 /** 64 * Register a core site setting for a site logo 65 * 66 * @since 5.8.0 67 */ 68 function register_block_core_site_logo_setting() { 69 register_setting( 70 'general', 71 'site_logo', 72 array( 73 'show_in_rest' => array( 74 'name' => 'site_logo', 75 ), 76 'type' => 'integer', 77 'label' => __( 'Logo' ), 78 'description' => __( 'Site logo.' ), 79 ) 80 ); 81 } 82 83 add_action( 'rest_api_init', 'register_block_core_site_logo_setting', 10 ); 84 85 /** 86 * Register a core site setting for a site icon 87 * 88 * @since 5.9.0 89 */ 90 function register_block_core_site_icon_setting() { 91 register_setting( 92 'general', 93 'site_icon', 94 array( 95 'show_in_rest' => true, 96 'type' => 'integer', 97 'label' => __( 'Icon' ), 98 'description' => __( 'Site icon.' ), 99 ) 100 ); 101 } 102 103 add_action( 'rest_api_init', 'register_block_core_site_icon_setting', 10 ); 104 105 /** 106 * Registers the `core/site-logo` block on the server. 107 * 108 * @since 5.8.0 109 */ 110 function register_block_core_site_logo() { 111 register_block_type_from_metadata( 112 __DIR__ . '/site-logo', 113 array( 114 'render_callback' => 'render_block_core_site_logo', 115 ) 116 ); 117 } 118 119 add_action( 'init', 'register_block_core_site_logo' ); 120 121 /** 122 * Overrides the custom logo with a site logo, if the option is set. 123 * 124 * @since 5.8.0 125 * 126 * @param string $custom_logo The custom logo set by a theme. 127 * 128 * @return string The site logo if set. 129 */ 130 function _override_custom_logo_theme_mod( $custom_logo ) { 131 $site_logo = get_option( 'site_logo' ); 132 return false === $site_logo ? $custom_logo : $site_logo; 133 } 134 135 add_filter( 'theme_mod_custom_logo', '_override_custom_logo_theme_mod' ); 136 137 /** 138 * Updates the site_logo option when the custom_logo theme-mod gets updated. 139 * 140 * @since 5.8.0 141 * 142 * @param mixed $value Attachment ID of the custom logo or an empty value. 143 * @return mixed 144 */ 145 function _sync_custom_logo_to_site_logo( $value ) { 146 if ( empty( $value ) ) { 147 delete_option( 'site_logo' ); 148 } else { 149 update_option( 'site_logo', $value ); 150 } 151 152 return $value; 153 } 154 155 add_filter( 'pre_set_theme_mod_custom_logo', '_sync_custom_logo_to_site_logo' ); 156 157 /** 158 * Deletes the site_logo when the custom_logo theme mod is removed. 159 * 160 * @since 5.8.0 161 * 162 * @global array $_ignore_site_logo_changes 163 * 164 * @param array $old_value Previous theme mod settings. 165 * @param array $value Updated theme mod settings. 166 */ 167 function _delete_site_logo_on_remove_custom_logo( $old_value, $value ) { 168 global $_ignore_site_logo_changes; 169 170 if ( $_ignore_site_logo_changes ) { 171 return; 172 } 173 174 // If the custom_logo is being unset, it's being removed from theme mods. 175 if ( isset( $old_value['custom_logo'] ) && ! isset( $value['custom_logo'] ) ) { 176 delete_option( 'site_logo' ); 177 } 178 } 179 180 /** 181 * Deletes the site logo when all theme mods are being removed. 182 * 183 * @since 5.8.0 184 * 185 * @global array $_ignore_site_logo_changes 186 */ 187 function _delete_site_logo_on_remove_theme_mods() { 188 global $_ignore_site_logo_changes; 189 190 if ( $_ignore_site_logo_changes ) { 191 return; 192 } 193 194 if ( false !== get_theme_support( 'custom-logo' ) ) { 195 delete_option( 'site_logo' ); 196 } 197 } 198 199 /** 200 * Hooks `_delete_site_logo_on_remove_custom_logo` in `update_option_theme_mods_$theme`. 201 * Hooks `_delete_site_logo_on_remove_theme_mods` in `delete_option_theme_mods_$theme`. 202 * 203 * Runs on `setup_theme` to account for dynamically-switched themes in the Customizer. 204 * 205 * @since 5.8.0 206 */ 207 function _delete_site_logo_on_remove_custom_logo_on_setup_theme() { 208 $theme = get_option( 'stylesheet' ); 209 add_action( "update_option_theme_mods_$theme", '_delete_site_logo_on_remove_custom_logo', 10, 2 ); 210 add_action( "delete_option_theme_mods_$theme", '_delete_site_logo_on_remove_theme_mods' ); 211 } 212 add_action( 'setup_theme', '_delete_site_logo_on_remove_custom_logo_on_setup_theme', 11 ); 213 214 /** 215 * Removes the custom_logo theme-mod when the site_logo option gets deleted. 216 * 217 * @since 5.9.0 218 * 219 * @global array $_ignore_site_logo_changes 220 */ 221 function _delete_custom_logo_on_remove_site_logo() { 222 global $_ignore_site_logo_changes; 223 224 // Prevent _delete_site_logo_on_remove_custom_logo and 225 // _delete_site_logo_on_remove_theme_mods from firing and causing an 226 // infinite loop. 227 $_ignore_site_logo_changes = true; 228 229 // Remove the custom logo. 230 remove_theme_mod( 'custom_logo' ); 231 232 $_ignore_site_logo_changes = false; 233 } 234 add_action( 'delete_option_site_logo', '_delete_custom_logo_on_remove_site_logo' );
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated : Thu Nov 21 08:20:01 2024 | Cross-referenced by PHPXref |