[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-includes/blocks/ -> site-logo.php (source)

   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' );


Generated : Thu Nov 21 08:20:01 2024 Cross-referenced by PHPXref