home *** CD-ROM | disk | FTP | other *** search
/ HTML Examples / WP.iso / wordpress / wp-admin / includes / class-wp-site-icon.php < prev    next >
Encoding:
PHP Script  |  2017-07-26  |  5.9 KB  |  234 lines

  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. }
  234.