Add upstream
This commit is contained in:
		| @@ -0,0 +1,109 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Custom logo uploader control for the Customizer. | ||||
|  * | ||||
|  * @package Jetpack | ||||
|  */ | ||||
| class Site_Logo_Image_Control extends WP_Customize_Control { | ||||
| 	/** | ||||
| 	 * Constructor for our custom control. | ||||
| 	 * | ||||
| 	 * @param object $wp_customize | ||||
| 	 * @param string $control_id | ||||
| 	 * @param array  $args | ||||
| 	 * @uses Site_Logo_Image_Control::l10n() | ||||
| 	 */ | ||||
| 	public function __construct( $wp_customize, $control_id, $args = array() ) { | ||||
| 		// declare these first so they can be overridden | ||||
| 		$this->l10n = array( | ||||
| 			'upload'      => __( 'Add logo', 'jetpack' ), | ||||
| 			'set'         => __( 'Set as logo', 'jetpack' ), | ||||
| 			'choose'      => __( 'Choose logo', 'jetpack' ), | ||||
| 			'change'      => __( 'Change logo', 'jetpack' ), | ||||
| 			'remove'      => __( 'Remove logo', 'jetpack' ), | ||||
| 			'placeholder' => __( 'No logo set', 'jetpack' ), | ||||
| 		); | ||||
|  | ||||
| 		parent::__construct( $wp_customize, $control_id, $args ); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * This will be critical for our JS constructor. | ||||
| 	 */ | ||||
| 	public $type = 'site_logo'; | ||||
|  | ||||
| 	/** | ||||
| 	 * Allows overriding of global labels by a specific control. | ||||
| 	 */ | ||||
| 	public $l10n = array(); | ||||
|  | ||||
| 	/** | ||||
| 	 * The type of files that should be allowed by the media modal. | ||||
| 	 */ | ||||
| 	public $mime_type = 'image'; | ||||
|  | ||||
| 	/** | ||||
| 	 * Enqueue our media manager resources, scripts, and styles. | ||||
| 	 * | ||||
| 	 * @uses wp_enqueue_media() | ||||
| 	 * @uses wp_enqueue_style() | ||||
| 	 * @uses wp_enqueue_script() | ||||
| 	 * @uses plugins_url() | ||||
| 	 */ | ||||
| 	public function enqueue() { | ||||
| 		// Enqueues all needed media resources. | ||||
| 		wp_enqueue_media(); | ||||
|  | ||||
| 		// Enqueue our control script and styles. | ||||
| 		wp_enqueue_style( 'site-logo-control', plugins_url( '../css/site-logo-control.css', __FILE__ ) ); | ||||
| 		wp_enqueue_script( 'site-logo-control', plugins_url( '../js/site-logo-control.js', __FILE__ ), array( 'media-views', 'customize-controls', 'underscore' ), '', true ); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Check if we have an active site logo. | ||||
| 	 * | ||||
| 	 * @uses get_option() | ||||
| 	 * @return boolean | ||||
| 	 */ | ||||
| 	public function has_site_logo() { | ||||
| 		$logo = get_option( 'site_logo' ); | ||||
|  | ||||
| 		if ( empty( $logo['url'] ) ) { | ||||
| 			return false; | ||||
| 		} else { | ||||
| 			return true; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Display our custom control in the Customizer. | ||||
| 	 * | ||||
| 	 * @uses Site_Logo_Image_Control::l10n() | ||||
| 	 * @uses Site_Logo_Image_Control::mime_type() | ||||
| 	 * @uses Site_Logo_Image_Control::label() | ||||
| 	 * @uses Site_Logo_Image_Control::description() | ||||
| 	 * @uses esc_attr() | ||||
| 	 * @uses esc_html() | ||||
| 	 */ | ||||
| 	public function render_content() { | ||||
| 		// We do this to allow the upload control to specify certain labels | ||||
| 		$l10n = json_encode( $this->l10n ); | ||||
|  | ||||
| 		// Control title | ||||
| 		printf( | ||||
| 			'<span class="customize-control-title" data-l10n="%s" data-mime="%s">%s</span>', | ||||
| 			esc_attr( $l10n ), | ||||
| 			esc_attr( $this->mime_type ), | ||||
| 			esc_html( $this->label ) | ||||
| 		); | ||||
|  | ||||
| 		// Control description | ||||
| 		if ( ! empty( $this->description ) ) : ?> | ||||
| 			<span class="description customize-control-description"><?php echo $this->description; ?></span> | ||||
| 		<?php endif; ?> | ||||
|  | ||||
| 		<div class="current"></div> | ||||
| 		<div class="actions"></div> | ||||
| 		<?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(); | ||||
| @@ -0,0 +1,44 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Functions for maintaining backwards compatibility with unprefixed template tags from the original Site Logo plugin. | ||||
|  * These should never be used in themes; instead, use the template tags in functions.php. | ||||
|  * See: https://github.com/Automattic/jetpack/pull/956 | ||||
|  * | ||||
|  * @package Jetpack | ||||
|  */ | ||||
|  | ||||
| if ( ! function_exists( 'the_site_logo' ) ) : | ||||
| 	/** | ||||
| 	 * Unprefixed, backwards-compatible function for outputting the site logo. | ||||
| 	 * | ||||
| 	 * @uses jetpack_the_site_logo() | ||||
| 	 */ | ||||
| 	function the_site_logo() { | ||||
| 		jetpack_the_site_logo(); | ||||
| 	} | ||||
| endif; | ||||
|  | ||||
| if ( ! function_exists( 'has_site_logo' ) ) : | ||||
| 	/** | ||||
| 	 * Unprefixed, backwards-compatible function for determining if a site logo has been set. | ||||
| 	 * | ||||
| 	 * @uses   jetpack_has_site_logo() | ||||
| 	 * @return bool True if a site logo is set, false otherwise. | ||||
| 	 */ | ||||
| 	function has_site_logo() { | ||||
| 		return jetpack_has_site_logo(); | ||||
| 	} | ||||
| endif; | ||||
|  | ||||
| if ( ! function_exists( 'get_site_logo' ) ) : | ||||
| 	/** | ||||
| 	 * Unprefixed, backwards-compatible function for getting either the site logo's image URL or its ID. | ||||
| 	 * | ||||
| 	 * @param  string $show Return the site logo URL or ID. | ||||
| 	 * @uses   jetpack_get_site_logo() | ||||
| 	 * @return string Site logo ID or URL (the default). | ||||
| 	 */ | ||||
| 	function get_site_logo( $show = 'url' ) { | ||||
| 		return jetpack_get_site_logo( $show ); | ||||
| 	} | ||||
| endif; | ||||
| @@ -0,0 +1,176 @@ | ||||
| <?php | ||||
| /** | ||||
|  * Functions and template tags for using site logos. | ||||
|  * | ||||
|  * @package Jetpack | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * Retrieve the site logo URL or ID (URL by default). Pass in the string 'id' for ID. | ||||
|  * | ||||
|  * @uses get_option() | ||||
|  * @uses esc_url_raw() | ||||
|  * @uses set_url_scheme() | ||||
|  * @return mixed The URL or ID of our site logo, false if not set | ||||
|  * @since 1.0 | ||||
|  */ | ||||
| function jetpack_get_site_logo( $show = 'url' ) { | ||||
| 	$logo = site_logo()->logo; | ||||
|  | ||||
| 	// Return false if no logo is set | ||||
| 	if ( ! isset( $logo['id'] ) || 0 == $logo['id'] ) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	// Return the ID if specified, otherwise return the URL by default | ||||
| 	if ( 'id' == $show ) { | ||||
| 		return $logo['id']; | ||||
| 	} else { | ||||
| 		return esc_url_raw( set_url_scheme( $logo['url'] ) ); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Retrieve an array of the dimensions of the Site Logo. | ||||
|  * | ||||
|  * @uses Site_Logo::theme_size() | ||||
|  * @uses get_option( 'thumbnail_size_w' ) | ||||
|  * @uses get_option( 'thumbnail_size_h' ) | ||||
|  * @uses global $_wp_additional_image_sizes; | ||||
|  * | ||||
|  * @since 3.6.0 | ||||
|  * | ||||
|  * @return array $dimensions { | ||||
|  *      An array of dimensions of the Site Logo. | ||||
|  * | ||||
|  *      @type string $width Width of the logo in pixels. | ||||
|  *      @type string $height Height of the logo in pixels. | ||||
|  * } | ||||
|  */ | ||||
| function jetpack_get_site_logo_dimensions() { | ||||
| 	// Get the image size to use with the logo. | ||||
| 	$size = site_logo()->theme_size(); | ||||
|  | ||||
| 	// If the size is the default `thumbnail`, get its dimensions. Otherwise, get them from $_wp_additional_image_sizes | ||||
| 	if ( empty( $size ) ) { | ||||
| 		return false; | ||||
| 	} elseif ( 'thumbnail' == $size ) { | ||||
| 		$dimensions = array( | ||||
| 			'width'  => get_option( 'thumbnail_size_w' ), | ||||
| 			'height' => get_option( 'thumbnail_size_h' ), | ||||
| 		); | ||||
| 	} else { | ||||
| 		global $_wp_additional_image_sizes; | ||||
|  | ||||
| 		if ( ! isset( $_wp_additional_image_sizes[ $size ] ) ) { | ||||
| 			return false; | ||||
| 		} | ||||
|  | ||||
| 		$dimensions = array( | ||||
| 			'width'  => $_wp_additional_image_sizes[ $size ]['width'], | ||||
| 			'height' => $_wp_additional_image_sizes[ $size ]['height'], | ||||
| 		); | ||||
| 	} | ||||
|  | ||||
| 	return $dimensions; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Determine if a site logo is assigned or not. | ||||
|  * | ||||
|  * @uses get_option | ||||
|  * @return boolean True if there is an active logo, false otherwise | ||||
|  */ | ||||
| function jetpack_has_site_logo() { | ||||
| 	return site_logo()->has_site_logo(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Output an <img> tag of the site logo, at the size specified | ||||
|  * in the theme's add_theme_support() declaration. | ||||
|  * | ||||
|  * @uses Site_Logo::logo | ||||
|  * @uses Site_Logo::theme_size() | ||||
|  * @uses jetpack_has_site_logo() | ||||
|  * @uses jetpack_is_customize_preview() | ||||
|  * @uses esc_url() | ||||
|  * @uses home_url() | ||||
|  * @uses esc_attr() | ||||
|  * @uses wp_get_attachment_image() | ||||
|  * @uses apply_filters() | ||||
|  * @since 1.0 | ||||
|  */ | ||||
| function jetpack_the_site_logo() { | ||||
| 	$logo    = site_logo()->logo; | ||||
| 	$logo_id = get_theme_mod( 'custom_logo' ); // Check for WP 4.5 Site Logo | ||||
| 	$logo_id = $logo_id ? $logo_id : $logo['id']; // Use WP Core logo if present, otherwise use Jetpack's. | ||||
| 	$size    = site_logo()->theme_size(); | ||||
| 	$html    = ''; | ||||
|  | ||||
| 	// If no logo is set, but we're in the Customizer, leave a placeholder (needed for the live preview). | ||||
| 	if ( ! jetpack_has_site_logo() ) { | ||||
| 		if ( jetpack_is_customize_preview() ) { | ||||
| 			$html = sprintf( | ||||
| 				'<a href="%1$s" class="site-logo-link" style="display:none;"><img class="site-logo" data-size="%2$s" /></a>', | ||||
| 				esc_url( home_url( '/' ) ), | ||||
| 				esc_attr( $size ) | ||||
| 			); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// We have a logo. Logo is go. | ||||
| 	else { | ||||
| 		$html = sprintf( | ||||
| 			'<a href="%1$s" class="site-logo-link" rel="home" itemprop="url">%2$s</a>', | ||||
| 			esc_url( home_url( '/' ) ), | ||||
| 			wp_get_attachment_image( | ||||
| 				$logo_id, | ||||
| 				$size, | ||||
| 				false, | ||||
| 				array( | ||||
| 					'class'     => "site-logo attachment-$size", | ||||
| 					'data-size' => $size, | ||||
| 					'itemprop'  => 'logo', | ||||
| 				) | ||||
| 			) | ||||
| 		); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Filter the Site Logo output. | ||||
| 	 * | ||||
| 	 * @module theme-tools | ||||
| 	 * | ||||
| 	 * @since 3.2.0 | ||||
| 	 * | ||||
| 	 * @param string $html Site Logo HTML output. | ||||
| 	 * @param array $logo Array of Site Logo details. | ||||
| 	 * @param string $size Size specified in add_theme_support declaration, or 'thumbnail' default. | ||||
| 	 */ | ||||
| 	echo apply_filters( 'jetpack_the_site_logo', $html, $logo, $size ); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Whether the site is being previewed in the Customizer. | ||||
|  * Duplicate of core function until 4.0 is released. | ||||
|  * | ||||
|  * @global WP_Customize_Manager $wp_customize Customizer instance. | ||||
|  * @return bool True if the site is being previewed in the Customizer, false otherwise. | ||||
|  */ | ||||
| function jetpack_is_customize_preview() { | ||||
| 	global $wp_customize; | ||||
|  | ||||
| 	return is_a( $wp_customize, 'WP_Customize_Manager' ) && $wp_customize->is_preview(); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Sanitize the string of classes used for header text. | ||||
|  * Limit to A-Z,a-z,0-9,(space),(comma),_,- | ||||
|  * | ||||
|  * @return string Sanitized string of CSS classes. | ||||
|  */ | ||||
| function jetpack_sanitize_header_text_classes( $classes ) { | ||||
| 	$classes = preg_replace( '/[^A-Za-z0-9\,\ ._-]/', '', $classes ); | ||||
|  | ||||
| 	return $classes; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user