diff options
Diffstat (limited to 'plugins/jetpack/modules/theme-tools/site-logo/inc/class-site-logo.php')
-rw-r--r-- | plugins/jetpack/modules/theme-tools/site-logo/inc/class-site-logo.php | 377 |
1 files changed, 377 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/theme-tools/site-logo/inc/class-site-logo.php b/plugins/jetpack/modules/theme-tools/site-logo/inc/class-site-logo.php new file mode 100644 index 00000000..75fe80b1 --- /dev/null +++ b/plugins/jetpack/modules/theme-tools/site-logo/inc/class-site-logo.php @@ -0,0 +1,377 @@ +<?php +/** + * Our Site Logo class for managing a theme-agnostic logo through the Customizer. + * + * @package Jetpack + */ +class Site_Logo { + /** + * Stores our single instance. + */ + private static $instance; + + /** + * Stores our current logo settings. + */ + public $logo; + + /** + * Return our instance, creating a new one if necessary. + * + * @uses Site_Logo::$instance + * @return object Site_Logo + */ + public static function instance() { + if ( ! isset( self::$instance ) ) { + self::$instance = new Site_Logo(); + self::$instance->register_hooks(); + } + + return self::$instance; + } + + /** + * Get our current logo settings stored in options. + * + * @uses get_option() + */ + private function __construct() { + $this->logo = get_option( 'site_logo', null ); + } + + /** + * Register our actions and filters. + * + * @uses Site_Logo::head_text_styles() + * @uses Site_Logo::customize_register() + * @uses Site_Logo::preview_enqueue() + * @uses Site_Logo::body_classes() + * @uses Site_Logo::media_manager_image_sizes() + * @uses add_action + * @uses add_filter + */ + public function register_hooks() { + // This would only happen if a theme supports BOTH site-logo and custom-logo for some reason + if ( current_theme_supports( 'custom-logo' ) ) { + return; + } + + add_action( 'wp_head', array( $this, 'head_text_styles' ) ); + add_action( 'customize_register', array( $this, 'customize_register' ) ); + add_action( 'customize_preview_init', array( $this, 'preview_enqueue' ) ); + add_action( 'delete_attachment', array( $this, 'reset_on_attachment_delete' ) ); + add_filter( 'body_class', array( $this, 'body_classes' ) ); + add_filter( 'image_size_names_choose', array( $this, 'media_manager_image_sizes' ) ); + add_filter( 'display_media_states', array( $this, 'add_media_state' ) ); + } + + /** + * Add our logo uploader to the Customizer. + * + * @param object $wp_customize Customizer object. + * @uses current_theme_supports() + * @uses current_theme_supports() + * @uses WP_Customize_Manager::add_setting() + * @uses WP_Customize_Manager::add_control() + * @uses Site_Logo::sanitize_checkbox() + */ + public function customize_register( $wp_customize ) { + // Include our custom control. + require dirname( __FILE__ ) . '/class-site-logo-control.php'; + + // Add a setting to hide header text if the theme isn't supporting the feature itself + if ( ! current_theme_supports( 'custom-header' ) ) { + $wp_customize->add_setting( + 'site_logo_header_text', + array( + 'default' => 1, + 'sanitize_callback' => array( $this, 'sanitize_checkbox' ), + 'transport' => 'postMessage', + ) + ); + + $wp_customize->add_control( + new WP_Customize_Control( + $wp_customize, + 'site_logo_header_text', + array( + 'label' => __( 'Display Header Text', 'jetpack' ), + 'section' => 'title_tagline', + 'settings' => 'site_logo_header_text', + 'type' => 'checkbox', + ) + ) + ); + } + + // Add the setting for our logo value. + $wp_customize->add_setting( + 'site_logo', + array( + 'capability' => 'manage_options', + 'default' => array( + 'id' => 0, + 'sizes' => array(), + 'url' => false, + ), + 'sanitize_callback' => array( $this, 'sanitize_logo_setting' ), + 'transport' => 'postMessage', + 'type' => 'option', + ) + ); + + // Add our image uploader. + $wp_customize->add_control( + new Site_Logo_Image_Control( + $wp_customize, + 'site_logo', + array( + 'label' => __( 'Logo', 'jetpack' ), + 'section' => 'title_tagline', + 'settings' => 'site_logo', + ) + ) + ); + } + + /** + * Enqueue scripts for the Customizer live preview. + * + * @uses wp_enqueue_script() + * @uses plugins_url() + * @uses current_theme_supports() + * @uses Site_Logo::header_text_classes() + * @uses wp_localize_script() + */ + public function preview_enqueue() { + wp_enqueue_script( 'site-logo-preview', plugins_url( '../js/site-logo.js', __FILE__ ), array( 'media-views' ), '', true ); + + // Don't bother passing in header text classes if the theme supports custom headers. + if ( ! current_theme_supports( 'custom-header' ) ) { + $classes = jetpack_sanitize_header_text_classes( $this->header_text_classes() ); + wp_enqueue_script( 'site-logo-header-text', plugins_url( '../js/site-logo-header-text.js', __FILE__ ), array( 'media-views' ), '', true ); + wp_localize_script( 'site-logo-header-text', 'site_logo_header_classes', $classes ); + } + } + + /** + * Get header text classes. If not defined in add_theme_support(), defaults from Underscores will be used. + * + * @uses get_theme_support + * @return string String of classes to hide + */ + public function header_text_classes() { + $args = get_theme_support( 'site-logo' ); + + if ( isset( $args[0]['header-text'] ) ) { + // Use any classes defined in add_theme_support(). + $classes = $args[0]['header-text']; + } else { + // Otherwise, use these defaults, which will work with any Underscores-based theme. + $classes = array( + 'site-title', + 'site-description', + ); + } + + // If we've got an array, reduce them to a string for output + if ( is_array( $classes ) ) { + $classes = (string) '.' . implode( ', .', $classes ); + } else { + $classes = (string) '.' . $classes; + } + + return $classes; + } + + /** + * Hide header text on front-end if necessary. + * + * @uses current_theme_supports() + * @uses get_theme_mod() + * @uses Site_Logo::header_text_classes() + * @uses esc_html() + */ + public function head_text_styles() { + // Bail if our theme supports custom headers. + if ( current_theme_supports( 'custom-header' ) ) { + return; + } + + // Is Display Header Text unchecked? If so, we need to hide our header text. + if ( ! get_theme_mod( 'site_logo_header_text', 1 ) ) { + $classes = $this->header_text_classes(); + ?> + <!-- Site Logo: hide header text --> + <style type="text/css"> + <?php echo jetpack_sanitize_header_text_classes( $classes ); ?> { + position: absolute; + clip: rect(1px, 1px, 1px, 1px); + } + </style> + <?php + } + } + + /** + * Determine image size to use for the logo. + * + * @uses get_theme_support() + * @return string Size specified in add_theme_support declaration, or 'thumbnail' default + */ + public function theme_size() { + $args = get_theme_support( 'site-logo' ); + $valid_sizes = get_intermediate_image_sizes(); + + // Add 'full' to the list of accepted values. + $valid_sizes[] = 'full'; + + // If the size declared in add_theme_support is valid, use it; otherwise, just go with 'thumbnail'. + $size = ( isset( $args[0]['size'] ) && in_array( $args[0]['size'], $valid_sizes ) ) ? $args[0]['size'] : 'thumbnail'; + + return $size; + } + + /** + * Make custom image sizes available to the media manager. + * + * @param array $sizes + * @uses get_intermediate_image_sizes() + * @return array All default and registered custom image sizes. + */ + public function media_manager_image_sizes( $sizes ) { + // Get an array of all registered image sizes. + $intermediate = get_intermediate_image_sizes(); + + // Have we got anything fun to work with? + if ( is_array( $intermediate ) && ! empty( $intermediate ) ) { + foreach ( $intermediate as $key => $size ) { + // If the size isn't already in the $sizes array, add it. + if ( ! array_key_exists( $size, $sizes ) ) { + $sizes[ $size ] = $size; + } + } + } + + return $sizes; + } + + /** + * Add site logos to media states in the Media Manager. + * + * @return array The current attachment's media states. + */ + public function add_media_state( $media_states ) { + // Only bother testing if we have a site logo set. + if ( $this->has_site_logo() ) { + global $post; + + // If our attachment ID and the site logo ID match, this image is the site logo. + if ( $post->ID == $this->logo['id'] ) { + $media_states[] = __( 'Site Logo', 'jetpack' ); + } + } + + return $media_states; + } + + /** + * Reset the site logo if the current logo is deleted in the media manager. + * + * @param int $site_id + * @uses Site_Logo::remove_site_logo() + */ + public function reset_on_attachment_delete( $post_id ) { + if ( $this->logo['id'] == $post_id ) { + $this->remove_site_logo(); + } + } + + /** + * Determine if a site logo is assigned or not. + * + * @uses Site_Logo::$logo + * @return boolean True if there is an active logo, false otherwise + */ + public function has_site_logo() { + return ( isset( $this->logo['id'] ) && 0 !== $this->logo['id'] ) ? true : false; + } + + /** + * Reset the site logo option to zero (empty). + * + * @uses update_option() + */ + public function remove_site_logo() { + update_option( + 'site_logo', + array( + 'id' => (int) 0, + 'sizes' => array(), + 'url' => '', + ) + ); + } + + /** + * Adds custom classes to the array of body classes. + * + * @uses Site_Logo::has_site_logo() + * @return array Array of <body> classes + */ + public function body_classes( $classes ) { + // Add a class if a Site Logo is active + if ( $this->has_site_logo() ) { + $classes[] = 'has-site-logo'; + } + + return $classes; + } + + /** + * Sanitize our header text Customizer setting. + * + * @param $input + * @return mixed 1 if checked, empty string if not checked. + */ + public function sanitize_checkbox( $input ) { + return ( 1 == $input ) ? 1 : ''; + } + + /** + * Validate and sanitize a new site logo setting. + * + * @param $input + * @return mixed 1 if checked, empty string if not checked. + */ + public function sanitize_logo_setting( $input ) { + $input['id'] = absint( $input['id'] ); + $input['url'] = esc_url_raw( $input['url'] ); + + // If the new setting doesn't point to a valid attachment, just reset the whole thing. + if ( false == wp_get_attachment_image_src( $input['id'] ) ) { + $input = array( + 'id' => (int) 0, + 'sizes' => array(), + 'url' => '', + ); + } + + return $input; + } +} + +/** + * Allow themes and plugins to access Site_Logo methods and properties. + * + * @uses Site_Logo::instance() + * @return object Site_Logo + */ +function site_logo() { + return Site_Logo::instance(); +} + +/** + * One site logo, please. + */ +site_logo(); |