wp/wp-admin/includes/class-wp-site-icon.php
changeset 7 cf61fcea0001
child 9 177826044cd9
equal deleted inserted replaced
6:490d5cc509ed 7:cf61fcea0001
       
     1 <?php
       
     2 /**
       
     3  * Administration API: WP_Site_Icon class
       
     4  *
       
     5  * @package WordPress
       
     6  * @subpackage Administration
       
     7  * @since 4.3.0
       
     8  */
       
     9 
       
    10 /**
       
    11  * Core class used to implement site icon functionality.
       
    12  *
       
    13  * @since 4.3.0
       
    14  */
       
    15 class WP_Site_Icon {
       
    16 
       
    17 	/**
       
    18 	 * The minimum size of the site icon.
       
    19 	 *
       
    20 	 * @since 4.3.0
       
    21 	 * @var int
       
    22 	 */
       
    23 	public $min_size  = 512;
       
    24 
       
    25 	/**
       
    26 	 * The size to which to crop the image so that we can display it in the UI nicely.
       
    27 	 *
       
    28 	 * @since 4.3.0
       
    29 	 * @var int
       
    30 	 */
       
    31 	public $page_crop = 512;
       
    32 
       
    33 	/**
       
    34 	 * List of site icon sizes.
       
    35 	 *
       
    36 	 * @since 4.3.0
       
    37 	 * @var array
       
    38 	 */
       
    39 	public $site_icon_sizes = array(
       
    40 		/*
       
    41 		 * Square, medium sized tiles for IE11+.
       
    42 		 *
       
    43 		 * See https://msdn.microsoft.com/library/dn455106(v=vs.85).aspx
       
    44 		 */
       
    45 		270,
       
    46 
       
    47 		/*
       
    48 		 * App icon for Android/Chrome.
       
    49 		 *
       
    50 		 * @link https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android
       
    51 		 * @link https://developer.chrome.com/multidevice/android/installtohomescreen
       
    52 		 */
       
    53 		192,
       
    54 
       
    55 		/*
       
    56 		 * App icons up to iPhone 6 Plus.
       
    57 		 *
       
    58 		 * See https://developer.apple.com/library/prerelease/ios/documentation/UserExperience/Conceptual/MobileHIG/IconMatrix.html
       
    59 		 */
       
    60 		180,
       
    61 
       
    62 		// Our regular Favicon.
       
    63 		32,
       
    64 	);
       
    65 
       
    66 	/**
       
    67 	 * Registers actions and filters.
       
    68 	 *
       
    69 	 * @since 4.3.0
       
    70 	 */
       
    71 	public function __construct() {
       
    72 		add_action( 'delete_attachment', array( $this, 'delete_attachment_data' ) );
       
    73 		add_filter( 'get_post_metadata', array( $this, 'get_post_metadata' ), 10, 4 );
       
    74 	}
       
    75 
       
    76 	/**
       
    77 	 * Creates an attachment 'object'.
       
    78 	 *
       
    79 	 * @since 4.3.0
       
    80 	 *
       
    81 	 * @param string $cropped              Cropped image URL.
       
    82 	 * @param int    $parent_attachment_id Attachment ID of parent image.
       
    83 	 * @return array Attachment object.
       
    84 	 */
       
    85 	public function create_attachment_object( $cropped, $parent_attachment_id ) {
       
    86 		$parent     = get_post( $parent_attachment_id );
       
    87 		$parent_url = wp_get_attachment_url( $parent->ID );
       
    88 		$url        = str_replace( basename( $parent_url ), basename( $cropped ), $parent_url );
       
    89 
       
    90 		$size       = @getimagesize( $cropped );
       
    91 		$image_type = ( $size ) ? $size['mime'] : 'image/jpeg';
       
    92 
       
    93 		$object = array(
       
    94 			'ID'             => $parent_attachment_id,
       
    95 			'post_title'     => basename( $cropped ),
       
    96 			'post_content'   => $url,
       
    97 			'post_mime_type' => $image_type,
       
    98 			'guid'           => $url,
       
    99 			'context'        => 'site-icon'
       
   100 		);
       
   101 
       
   102 		return $object;
       
   103 	}
       
   104 
       
   105 	/**
       
   106 	 * Inserts an attachment.
       
   107 	 *
       
   108 	 * @since 4.3.0
       
   109 	 *
       
   110 	 * @param array  $object Attachment object.
       
   111 	 * @param string $file   File path of the attached image.
       
   112 	 * @return int           Attachment ID
       
   113 	 */
       
   114 	public function insert_attachment( $object, $file ) {
       
   115 		$attachment_id = wp_insert_attachment( $object, $file );
       
   116 		$metadata      = wp_generate_attachment_metadata( $attachment_id, $file );
       
   117 
       
   118 		/**
       
   119 		 * Filters the site icon attachment metadata.
       
   120 		 *
       
   121 		 * @since 4.3.0
       
   122 		 *
       
   123 		 * @see wp_generate_attachment_metadata()
       
   124 		 *
       
   125 		 * @param array $metadata Attachment metadata.
       
   126 		 */
       
   127 		$metadata = apply_filters( 'site_icon_attachment_metadata', $metadata );
       
   128 		wp_update_attachment_metadata( $attachment_id, $metadata );
       
   129 
       
   130 		return $attachment_id;
       
   131 	}
       
   132 
       
   133 	/**
       
   134 	 * Adds additional sizes to be made when creating the site_icon images.
       
   135 	 *
       
   136 	 * @since 4.3.0
       
   137 	 *
       
   138 	 * @param array $sizes List of additional sizes.
       
   139 	 * @return array Additional image sizes.
       
   140 	 */
       
   141 	public function additional_sizes( $sizes = array() ) {
       
   142 		$only_crop_sizes = array();
       
   143 
       
   144 		/**
       
   145 		 * Filters the different dimensions that a site icon is saved in.
       
   146 		 *
       
   147 		 * @since 4.3.0
       
   148 		 *
       
   149 		 * @param array $site_icon_sizes Sizes available for the Site Icon.
       
   150 		 */
       
   151 		$this->site_icon_sizes = apply_filters( 'site_icon_image_sizes', $this->site_icon_sizes );
       
   152 
       
   153 		// Use a natural sort of numbers.
       
   154 		natsort( $this->site_icon_sizes );
       
   155 		$this->site_icon_sizes = array_reverse( $this->site_icon_sizes );
       
   156 
       
   157 		// ensure that we only resize the image into
       
   158 		foreach ( $sizes as $name => $size_array ) {
       
   159 			if ( isset( $size_array['crop'] ) ) {
       
   160 				$only_crop_sizes[ $name ] = $size_array;
       
   161 			}
       
   162 		}
       
   163 
       
   164 		foreach ( $this->site_icon_sizes as $size ) {
       
   165 			if ( $size < $this->min_size ) {
       
   166 				$only_crop_sizes[ 'site_icon-' . $size ] = array(
       
   167 					'width ' => $size,
       
   168 					'height' => $size,
       
   169 					'crop'   => true,
       
   170 				);
       
   171 			}
       
   172 		}
       
   173 
       
   174 		return $only_crop_sizes;
       
   175 	}
       
   176 
       
   177 	/**
       
   178 	 * Adds Site Icon sizes to the array of image sizes on demand.
       
   179 	 *
       
   180 	 * @since 4.3.0
       
   181 	 *
       
   182 	 * @param array $sizes List of image sizes.
       
   183 	 * @return array List of intermediate image sizes.
       
   184 	 */
       
   185 	public function intermediate_image_sizes( $sizes = array() ) {
       
   186 		/** This filter is documented in wp-admin/includes/class-wp-site-icon.php */
       
   187 		$this->site_icon_sizes = apply_filters( 'site_icon_image_sizes', $this->site_icon_sizes );
       
   188 		foreach ( $this->site_icon_sizes as $size ) {
       
   189 			$sizes[] = 'site_icon-' . $size;
       
   190 		}
       
   191 
       
   192 		return $sizes;
       
   193 	}
       
   194 
       
   195 	/**
       
   196 	 * Deletes the Site Icon when the image file is deleted.
       
   197 	 *
       
   198 	 * @since 4.3.0
       
   199 	 *
       
   200 	 * @param int $post_id Attachment ID.
       
   201 	 */
       
   202 	public function delete_attachment_data( $post_id ) {
       
   203 		$site_icon_id = get_option( 'site_icon' );
       
   204 
       
   205 		if ( $site_icon_id && $post_id == $site_icon_id ) {
       
   206 			delete_option( 'site_icon' );
       
   207 		}
       
   208 	}
       
   209 
       
   210 	/**
       
   211 	 * Adds custom image sizes when meta data for an image is requested, that happens to be used as Site Icon.
       
   212 	 *
       
   213 	 * @since 4.3.0
       
   214 	 *
       
   215 	 * @param null|array|string $value    The value get_metadata() should return a single metadata value, or an
       
   216 	 *                                    array of values.
       
   217 	 * @param int               $post_id  Post ID.
       
   218 	 * @param string            $meta_key Meta key.
       
   219 	 * @param string|array      $single   Meta value, or an array of values.
       
   220 	 * @return array|null|string The attachment metadata value, array of values, or null.
       
   221 	 */
       
   222 	public function get_post_metadata( $value, $post_id, $meta_key, $single ) {
       
   223 		if ( $single && '_wp_attachment_backup_sizes' === $meta_key ) {
       
   224 			$site_icon_id = get_option( 'site_icon' );
       
   225 
       
   226 			if ( $post_id == $site_icon_id ) {
       
   227 				add_filter( 'intermediate_image_sizes', array( $this, 'intermediate_image_sizes' ) );
       
   228 			}
       
   229 		}
       
   230 
       
   231 		return $value;
       
   232 	}
       
   233 }