/**
 * Generates a Photon URL.
 *
 * @see http://developer.wordpress.com/docs/photon/
 *
 * @param string $image_url URL to the publicly accessible image you want to manipulate
 * @param array|string $args An array of arguments, i.e. array( 'w' => '300', 'resize' => array( 123, 456 ) ), or in string form (w=123&h=456)
 * @return string The raw final URL. You should run this through esc_url() before displaying it.
 */
function jetpack_photon_url($image_url, $args = array(), $scheme = null)
{
    $image_url = trim($image_url);
    $image_url = apply_filters('jetpack_photon_pre_image_url', $image_url, $args, $scheme);
    $args = apply_filters('jetpack_photon_pre_args', $args, $image_url, $scheme);
    if (empty($image_url)) {
        return $image_url;
    }
    $image_url_parts = @parse_url($image_url);
    // Unable to parse
    if (!is_array($image_url_parts) || empty($image_url_parts['host']) || empty($image_url_parts['path'])) {
        return $image_url;
    }
    if (is_array($args)) {
        // Convert values that are arrays into strings
        foreach ($args as $arg => $value) {
            if (is_array($value)) {
                $args[$arg] = implode(',', $value);
            }
        }
        // Encode values
        // See http://core.trac.wordpress.org/ticket/17923
        $args = rawurlencode_deep($args);
    }
    // You can't run a Photon URL through Photon again because query strings are stripped.
    // So if the image is already a Photon URL, append the new arguments to the existing URL.
    if (in_array($image_url_parts['host'], array('i0.wp.com', 'i1.wp.com', 'i2.wp.com'))) {
        $photon_url = add_query_arg($args, $image_url);
        return jetpack_photon_url_scheme($photon_url, $scheme);
    }
    // This setting is Photon Server dependent
    if (!apply_filters('jetpack_photon_any_extension_for_domain', false, $image_url_parts['host'])) {
        // Photon doesn't support query strings so we ignore them and look only at the path.
        // However some source images are served via PHP so check the no-query-string extension.
        // For future proofing, this is a blacklist of common issues rather than a whitelist.
        $extension = pathinfo($image_url_parts['path'], PATHINFO_EXTENSION);
        if (empty($extension) || in_array($extension, array('php'))) {
            return $image_url;
        }
    }
    $image_host_path = $image_url_parts['host'] . $image_url_parts['path'];
    // Figure out which CDN subdomain to use
    srand(crc32($image_host_path));
    $subdomain = rand(0, 2);
    srand();
    $photon_url = "http://i{$subdomain}.wp.com/{$image_host_path}";
    // This setting is Photon Server dependent
    if (isset($image_url_parts['query']) && apply_filters('jetpack_photon_add_query_string_to_domain', false, $image_url_parts['host'])) {
        $photon_url .= '?q=' . rawurlencode($image_url_parts['query']);
    }
    if ($args) {
        if (is_array($args)) {
            $photon_url = add_query_arg($args, $photon_url);
        } else {
            // You can pass a query string for complicated requests but where you still want CDN subdomain help, etc.
            $photon_url .= '?' . $args;
        }
    }
    return jetpack_photon_url_scheme($photon_url, $scheme);
}
Example #2
0
/**
 * Generates a Photon URL.
 *
 * @see http://developer.wordpress.com/docs/photon/
 *
 * @param string $image_url URL to the publicly accessible image you want to manipulate
 * @param array|string $args An array of arguments, i.e. array( 'w' => '300', 'resize' => array( 123, 456 ) ), or in string form (w=123&h=456)
 * @return string The raw final URL. You should run this through esc_url() before displaying it.
 */
function jetpack_photon_url($image_url, $args = array(), $scheme = null)
{
    $image_url = trim($image_url);
    if (class_exists('Jetpack')) {
        /**
         * Disables Photon URL processing for local development
         *
         * @module photon
         *
         * @since 4.1.0
         *
         * @param bool false Result of Jetpack::is_development_mode.
         */
        if (true === apply_filters('jetpack_photon_development_mode', Jetpack::is_development_mode())) {
            return $image_url;
        }
    }
    /**
     * Allow specific image URls to avoid going through Photon.
     *
     * @module photon
     *
     * @since 3.2.0
     *
     * @param bool false Should the image be returned as is, without going through Photon. Default to false.
     * @param string $image_url Image URL.
     * @param array|string $args Array of Photon arguments.
     * @param string|null $scheme Image scheme. Default to null.
     */
    if (false !== apply_filters('jetpack_photon_skip_for_url', false, $image_url, $args, $scheme)) {
        return $image_url;
    }
    /**
     * Filter the original image URL before it goes through Photon.
     *
     * @module photon
     *
     * @since 1.9.0
     *
     * @param string $image_url Image URL.
     * @param array|string $args Array of Photon arguments.
     * @param string|null $scheme Image scheme. Default to null.
     */
    $image_url = apply_filters('jetpack_photon_pre_image_url', $image_url, $args, $scheme);
    /**
     * Filter the original Photon image parameters before Photon is applied to an image.
     *
     * @module photon
     *
     * @since 1.9.0
     *
     * @param array|string $args Array of Photon arguments.
     * @param string $image_url Image URL.
     * @param string|null $scheme Image scheme. Default to null.
     */
    $args = apply_filters('jetpack_photon_pre_args', $args, $image_url, $scheme);
    if (empty($image_url)) {
        return $image_url;
    }
    $image_url_parts = @parse_url($image_url);
    // Unable to parse
    if (!is_array($image_url_parts) || empty($image_url_parts['host']) || empty($image_url_parts['path'])) {
        return $image_url;
    }
    if (is_array($args)) {
        // Convert values that are arrays into strings
        foreach ($args as $arg => $value) {
            if (is_array($value)) {
                $args[$arg] = implode(',', $value);
            }
        }
        // Encode values
        // See http://core.trac.wordpress.org/ticket/17923
        $args = rawurlencode_deep($args);
    }
    /** This filter is documented below. */
    $custom_photon_url = apply_filters('jetpack_photon_domain', '', $image_url);
    $custom_photon_url = esc_url($custom_photon_url);
    // You can't run a Photon URL through Photon again because query strings are stripped.
    // So if the image is already a Photon URL, append the new arguments to the existing URL.
    if (in_array($image_url_parts['host'], array('i0.wp.com', 'i1.wp.com', 'i2.wp.com')) || $image_url_parts['host'] === parse_url($custom_photon_url, PHP_URL_HOST)) {
        $photon_url = add_query_arg($args, $image_url);
        return jetpack_photon_url_scheme($photon_url, $scheme);
    }
    /**
     * Allow Photon to use query strings as well.
     * By default, Photon doesn't support query strings so we ignore them and look only at the path.
     * This setting is Photon Server dependent.
     *
     * @module photon
     *
     * @since 1.9.0
     *
     * @param bool false Should images using query strings go through Photon. Default is false.
     * @param string $image_url_parts['host'] Image URL's host.
     */
    if (!apply_filters('jetpack_photon_any_extension_for_domain', false, $image_url_parts['host'])) {
        // Photon doesn't support query strings so we ignore them and look only at the path.
        // However some source images are served via PHP so check the no-query-string extension.
        // For future proofing, this is a blacklist of common issues rather than a whitelist.
        $extension = pathinfo($image_url_parts['path'], PATHINFO_EXTENSION);
        if (empty($extension) || in_array($extension, array('php'))) {
            return $image_url;
        }
    }
    $image_host_path = $image_url_parts['host'] . $image_url_parts['path'];
    // Figure out which CDN subdomain to use
    srand(crc32($image_host_path));
    $subdomain = rand(0, 2);
    srand();
    /**
     * Filters the domain used by the Photon module.
     *
     * @module photon
     *
     * @since 3.4.2
     *
     * @param string https://i{$subdomain}.wp.com Domain used by Photon. $subdomain is a random number between 0 and 2.
     * @param string $image_url URL of the image to be photonized.
     */
    $photon_domain = apply_filters('jetpack_photon_domain', "https://i{$subdomain}.wp.com", $image_url);
    $photon_domain = trailingslashit(esc_url($photon_domain));
    $photon_url = $photon_domain . $image_host_path;
    /**
     * Add query strings to Photon URL.
     * By default, Photon doesn't support query strings so we ignore them.
     * This setting is Photon Server dependent.
     *
     * @module photon
     *
     * @since 1.9.0
     *
     * @param bool false Should query strings be added to the image URL. Default is false.
     * @param string $image_url_parts['host'] Image URL's host.
     */
    if (isset($image_url_parts['query']) && apply_filters('jetpack_photon_add_query_string_to_domain', false, $image_url_parts['host'])) {
        $photon_url .= '?q=' . rawurlencode($image_url_parts['query']);
    }
    if ($args) {
        if (is_array($args)) {
            $photon_url = add_query_arg($args, $photon_url);
        } else {
            // You can pass a query string for complicated requests but where you still want CDN subdomain help, etc.
            $photon_url .= '?' . $args;
        }
    }
    if (isset($image_url_parts['scheme']) && 'https' == $image_url_parts['scheme']) {
        $photon_url = add_query_arg(array('ssl' => 1), $photon_url);
    }
    return jetpack_photon_url_scheme($photon_url, $scheme);
}