Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 67
0.00% covered (danger)
0.00%
0 / 6
CRAP
n/a
0 / 0
jetpack_get_site_logo
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
jetpack_get_site_logo_dimensions
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
20
jetpack_has_site_logo
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
jetpack_the_site_logo
0.00% covered (danger)
0.00%
0 / 41
0.00% covered (danger)
0.00%
0 / 1
30
jetpack_is_customize_preview
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
6
jetpack_sanitize_header_text_classes
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Functions and template tags for Site Logo theme tool.
4 *
5 * @package automattic/jetpack
6 */
7
8/**
9 * Retrieve the site logo URL or ID (URL by default). Pass in the string 'id' for ID.
10 *
11 * @uses get_option()
12 * @uses esc_url_raw()
13 * @uses set_url_scheme()
14 * @param string $show 'url' or 'id' for site logo.
15 * @return mixed The URL or ID of our site logo, false if not set
16 * @since 1.0
17 */
18function jetpack_get_site_logo( $show = 'url' ) {
19    $logo_id = site_logo()->logo;
20
21    // Return false if no logo is set
22    if ( ! $logo_id ) {
23        return false;
24    }
25
26    // Return the ID if specified, otherwise return the URL by default
27    if ( 'id' === $show ) {
28        return $logo_id;
29    } else {
30        $logo_url = wp_get_attachment_url( $logo_id );
31        return esc_url_raw( set_url_scheme( $logo_url ) );
32    }
33}
34
35/**
36 * Retrieve an array of the dimensions of the Site Logo.
37 *
38 * @uses Site_Logo::theme_size()
39 * @uses get_option( 'thumbnail_size_w' )
40 * @uses get_option( 'thumbnail_size_h' )
41 * @uses global $_wp_additional_image_sizes;
42 *
43 * @since 3.6.0
44 *
45 * @return array $dimensions {
46 *      An array of dimensions of the Site Logo.
47 *
48 *      @type string $width Width of the logo in pixels.
49 *      @type string $height Height of the logo in pixels.
50 * }
51 */
52function jetpack_get_site_logo_dimensions() {
53    // Get the image size to use with the logo.
54    $size = site_logo()->theme_size();
55
56    // If the size is the default `thumbnail`, get its dimensions. Otherwise, get them from $_wp_additional_image_sizes
57    if ( empty( $size ) ) {
58        return false;
59    } elseif ( 'thumbnail' === $size ) {
60        $dimensions = array(
61            'width'  => get_option( 'thumbnail_size_w' ),
62            'height' => get_option( 'thumbnail_size_h' ),
63        );
64    } else {
65        global $_wp_additional_image_sizes;
66
67        if ( ! isset( $_wp_additional_image_sizes[ $size ] ) ) {
68            return false;
69        }
70
71        $dimensions = array(
72            'width'  => $_wp_additional_image_sizes[ $size ]['width'],
73            'height' => $_wp_additional_image_sizes[ $size ]['height'],
74        );
75    }
76
77    return $dimensions;
78}
79
80/**
81 * Determine if a site logo is assigned or not.
82 *
83 * @uses get_option
84 * @return boolean True if there is an active logo, false otherwise
85 */
86function jetpack_has_site_logo() {
87    return site_logo()->has_site_logo();
88}
89
90/**
91 * Output an <img> tag of the site logo, at the size specified
92 * in the theme's add_theme_support() declaration.
93 *
94 * @uses Site_Logo::logo
95 * @uses Site_Logo::theme_size()
96 * @uses jetpack_has_site_logo()
97 * @uses jetpack_is_customize_preview()
98 * @uses esc_url()
99 * @uses home_url()
100 * @uses esc_attr()
101 * @uses wp_get_attachment_image()
102 * @uses apply_filters()
103 * @since 1.0
104 */
105function jetpack_the_site_logo() {
106    $size = site_logo()->theme_size();
107
108    // If no logo is set, but we're in the Customizer, leave a placeholder (needed for the live preview).
109    if (
110        ! jetpack_has_site_logo()
111        && jetpack_is_customize_preview()
112    ) {
113        /*
114         * Reason: the output is escaped in the sprintf.
115         * phpcs:disable WordPress.Security.EscapeOutput
116         */
117        /** This filter is documented in modules/theme-tools/site-logo/inc/functions.php */
118        echo apply_filters(
119            'jetpack_the_site_logo',
120            sprintf(
121                '<a href="%1$s" class="site-logo-link" style="display:none;"><img class="site-logo" data-size="%2$s" /></a>',
122                esc_url( home_url( '/' ) ),
123                esc_attr( $size )
124            ),
125            array(),
126            $size
127        );
128        /* phpcs:enable WordPress.Security.EscapeOutput */
129        return;
130    }
131
132    // Check for WP 4.5 Site Logo and Jetpack logo.
133    $logo_id = get_theme_mod( 'custom_logo' );
134    // Get the option directly so the updated logo can be injected into customizer previews.
135    $jetpack_logo_id = get_option( 'site_logo' );
136
137    // Use WP Core logo if present and is an id (of an attachment), otherwise use Jetpack's.
138    if ( ! is_numeric( $logo_id ) && $jetpack_logo_id ) {
139        $logo_id = $jetpack_logo_id;
140    }
141
142    /*
143     * Reason: the output is escaped in the sprintf.
144     * phpcs:disable WordPress.Security.EscapeOutput
145     */
146    /**
147     * Filter the Site Logo output.
148     *
149     * @module theme-tools
150     *
151     * @since 3.2.0
152     *
153     * @param string $html Site Logo HTML output.
154     * @param array $jetpack_logo Array of Site Logo details.
155     * @param string $size Size specified in add_theme_support declaration, or 'thumbnail' default.
156     */
157    echo apply_filters(
158        'jetpack_the_site_logo',
159        sprintf(
160            '<a href="%1$s" class="site-logo-link" rel="home" itemprop="url">%2$s</a>',
161            esc_url( home_url( '/' ) ),
162            wp_get_attachment_image(
163                $logo_id,
164                $size,
165                false,
166                array(
167                    'class'     => "site-logo attachment-$size",
168                    'data-size' => $size,
169                    'itemprop'  => 'logo',
170                )
171            )
172        ),
173        // Return array format in filter for back compatibility.
174        array(
175            'id'    => $jetpack_logo_id,
176            'url'   => wp_get_attachment_url( $jetpack_logo_id ),
177            'sizes' => array(),
178        ),
179        $size
180    );
181    /* phpcs:enable WordPress.Security.EscapeOutput */
182}
183
184/**
185 * Whether the site is being previewed in the Customizer.
186 * Duplicate of core function until 4.0 is released.
187 *
188 * @global WP_Customize_Manager $wp_customize Customizer instance.
189 * @return bool True if the site is being previewed in the Customizer, false otherwise.
190 */
191function jetpack_is_customize_preview() {
192    global $wp_customize;
193    // @phan-suppress-next-line PhanTypeMismatchArgumentInternal -- this continues to work as expected, but given the feature deprecation no extra work is needed.
194    return is_a( $wp_customize, 'WP_Customize_Manager' ) && $wp_customize->is_preview();
195}
196
197/**
198 * Sanitize the string of classes used for header text.
199 * Limit to A-Z,a-z,0-9,(space),(comma),_,-
200 *
201 * @param string $classes Unsanitized string of CSS classes.
202 * @return string Sanitized string of CSS classes.
203 */
204function jetpack_sanitize_header_text_classes( $classes ) {
205    $classes = preg_replace( '/[^A-Za-z0-9\,\ ._-]/', '', $classes );
206
207    return $classes;
208}