| @@ -1,14 +1,16 @@ | ||
| 1 | -<?php | |
| 1 | +<?php // phpcs:ignore WordPress.Files.FileName.NotHyphenatedLowercase | |
| 2 | 2 | /** |
| 3 | 3 | * Generic functions using the Photon service. |
| 4 | 4 | * |
| 5 | 5 | * Some are used outside of the Photon module being active, so intentionally not within the module. |
| 6 | + * As photon has been moved to the image-cdn package, the functions are now also replaced by their counterparts in Image_CDN_Core in the package. | |
| 6 | 7 | * |
| 7 | 8 | * @package automattic/jetpack |
| 8 | 9 | */ |
| 9 | 10 | |
| 10 | -use Automattic\Jetpack\Status; | |
| 11 | +use Automattic\Jetpack\Image_CDN\Image_CDN; | |
| 12 | +use Automattic\Jetpack\Image_CDN\Image_CDN_Core; | |
| 11 | 13 | |
| 12 | 14 | /** |
| 13 | 15 | * Generates a Photon URL. |
| 14 | 16 | * |
| @@ -13,8 +15,9 @@ | ||
| 13 | 15 | * Generates a Photon URL. |
| 14 | 16 | * |
| 15 | 17 | * @see https://developer.wordpress.com/docs/photon/ |
| 16 | 18 | * |
| 19 | + * @deprecated 12.2 Use Automattic\Jetpack\Image_CDN\Image_CDN_Core::cdn_url instead. | |
| 17 | 20 | * @param string $image_url URL to the publicly accessible image you want to manipulate. |
| 18 | 21 | * @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). |
| 19 | 22 | * @param string|null $scheme URL protocol. |
| 20 | 23 | * @return string The raw final URL. You should run this through esc_url() before displaying it. |
| @@ -19,255 +22,27 @@ | ||
| 19 | 22 | * @param string|null $scheme URL protocol. |
| 20 | 23 | * @return string The raw final URL. You should run this through esc_url() before displaying it. |
| 21 | 24 | */ |
| 22 | 25 | function jetpack_photon_url( $image_url, $args = array(), $scheme = null ) { |
| 23 | - $image_url = trim( $image_url ); | |
| 24 | - | |
| 25 | - if ( ! defined( 'IS_WPCOM' ) || ! IS_WPCOM ) { | |
| 26 | - /** | |
| 27 | - * Disables Photon URL processing for local development | |
| 28 | - * | |
| 29 | - * @module photon | |
| 30 | - * | |
| 31 | - * @since 4.1.0 | |
| 32 | - * | |
| 33 | - * @param bool false Result of Automattic\Jetpack\Status->is_offline_mode(). | |
| 34 | - */ | |
| 35 | - if ( true === apply_filters( 'jetpack_photon_development_mode', ( new Status() )->is_offline_mode() ) ) { | |
| 36 | - return $image_url; | |
| 37 | - } | |
| 38 | - } | |
| 39 | - | |
| 40 | - /** | |
| 41 | - * Allow specific image URls to avoid going through Photon. | |
| 42 | - * | |
| 43 | - * @module photon | |
| 44 | - * | |
| 45 | - * @since 3.2.0 | |
| 46 | - * | |
| 47 | - * @param bool false Should the image be returned as is, without going through Photon. Default to false. | |
| 48 | - * @param string $image_url Image URL. | |
| 49 | - * @param array|string $args Array of Photon arguments. | |
| 50 | - * @param string|null $scheme Image scheme. Default to null. | |
| 51 | - */ | |
| 52 | - if ( false !== apply_filters( 'jetpack_photon_skip_for_url', false, $image_url, $args, $scheme ) ) { | |
| 53 | - return $image_url; | |
| 54 | - } | |
| 55 | - | |
| 56 | - /** | |
| 57 | - * Filter the original image URL before it goes through Photon. | |
| 58 | - * | |
| 59 | - * @module photon | |
| 60 | - * | |
| 61 | - * @since 1.9.0 | |
| 62 | - * | |
| 63 | - * @param string $image_url Image URL. | |
| 64 | - * @param array|string $args Array of Photon arguments. | |
| 65 | - * @param string|null $scheme Image scheme. Default to null. | |
| 66 | - */ | |
| 67 | - $image_url = apply_filters( 'jetpack_photon_pre_image_url', $image_url, $args, $scheme ); | |
| 68 | - /** | |
| 69 | - * Filter the original Photon image parameters before Photon is applied to an image. | |
| 70 | - * | |
| 71 | - * @module photon | |
| 72 | - * | |
| 73 | - * @since 1.9.0 | |
| 74 | - * | |
| 75 | - * @param array|string $args Array of Photon arguments. | |
| 76 | - * @param string $image_url Image URL. | |
| 77 | - * @param string|null $scheme Image scheme. Default to null. | |
| 78 | - */ | |
| 79 | - $args = apply_filters( 'jetpack_photon_pre_args', $args, $image_url, $scheme ); | |
| 80 | - | |
| 81 | - if ( empty( $image_url ) ) { | |
| 82 | - return $image_url; | |
| 83 | - } | |
| 84 | - | |
| 85 | - $image_url_parts = wp_parse_url( $image_url ); | |
| 86 | - | |
| 87 | - // Unable to parse. | |
| 88 | - if ( ! is_array( $image_url_parts ) || empty( $image_url_parts['host'] ) || empty( $image_url_parts['path'] ) ) { | |
| 89 | - return $image_url; | |
| 90 | - } | |
| 91 | - | |
| 92 | - if ( is_array( $args ) ) { | |
| 93 | - // Convert values that are arrays into strings. | |
| 94 | - foreach ( $args as $arg => $value ) { | |
| 95 | - if ( is_array( $value ) ) { | |
| 96 | - $args[ $arg ] = implode( ',', $value ); | |
| 97 | - } | |
| 98 | - } | |
| 99 | - | |
| 100 | - // Encode values. | |
| 101 | - // See https://core.trac.wordpress.org/ticket/17923 . | |
| 102 | - $args = rawurlencode_deep( $args ); | |
| 103 | - } | |
| 104 | - | |
| 105 | - // Don't photon-ize WPCOM hosted images -- we can serve them up from wpcom directly. | |
| 106 | - $is_wpcom_image = false; | |
| 107 | - if ( wp_endswith( strtolower( $image_url_parts['host'] ), '.files.wordpress.com' ) ) { | |
| 108 | - $is_wpcom_image = true; | |
| 109 | - if ( isset( $args['ssl'] ) ) { | |
| 110 | - // Do not send the ssl argument to prevent caching issues. | |
| 111 | - unset( $args['ssl'] ); | |
| 112 | - } | |
| 113 | - } | |
| 114 | - | |
| 115 | - /** This filter is documented below. */ | |
| 116 | - $custom_photon_url = apply_filters( 'jetpack_photon_domain', '', $image_url ); | |
| 117 | - $custom_photon_url = esc_url( $custom_photon_url ); | |
| 118 | - | |
| 119 | - // You can't run a Photon URL through Photon again because query strings are stripped. | |
| 120 | - // So if the image is already a Photon URL, append the new arguments to the existing URL. | |
| 121 | - // Alternately, if it's a *.files.wordpress.com url, then keep the domain as is. | |
| 122 | - if ( | |
| 123 | - in_array( $image_url_parts['host'], array( 'i0.wp.com', 'i1.wp.com', 'i2.wp.com' ), true ) | |
| 124 | - || wp_parse_url( $custom_photon_url, PHP_URL_HOST ) === $image_url_parts['host'] | |
| 125 | - || $is_wpcom_image | |
| 126 | - ) { | |
| 127 | - $photon_url = add_query_arg( $args, $image_url ); | |
| 128 | - return jetpack_photon_url_scheme( $photon_url, $scheme ); | |
| 129 | - } | |
| 130 | - | |
| 131 | - /** | |
| 132 | - * Allow Photon to use query strings as well. | |
| 133 | - * By default, Photon doesn't support query strings so we ignore them and look only at the path. | |
| 134 | - * This setting is Photon Server dependent. | |
| 135 | - * | |
| 136 | - * @module photon | |
| 137 | - * | |
| 138 | - * @since 1.9.0 | |
| 139 | - * | |
| 140 | - * @param bool false Should images using query strings go through Photon. Default is false. | |
| 141 | - * @param string $image_url_parts['host'] Image URL's host. | |
| 142 | - */ | |
| 143 | - if ( ! apply_filters( 'jetpack_photon_any_extension_for_domain', false, $image_url_parts['host'] ) ) { | |
| 144 | - // Photon doesn't support query strings so we ignore them and look only at the path. | |
| 145 | - // However some source images are served via PHP so check the no-query-string extension. | |
| 146 | - // For future proofing, this is an excluded list of common issues rather than an allow list. | |
| 147 | - $extension = pathinfo( $image_url_parts['path'], PATHINFO_EXTENSION ); | |
| 148 | - if ( empty( $extension ) || in_array( $extension, array( 'php', 'ashx' ), true ) ) { | |
| 149 | - return $image_url; | |
| 150 | - } | |
| 151 | - } | |
| 152 | - | |
| 153 | - $image_host_path = $image_url_parts['host'] . $image_url_parts['path']; | |
| 154 | - | |
| 155 | - /** | |
| 156 | - * Filters the domain used by the Photon module. | |
| 157 | - * | |
| 158 | - * @module photon | |
| 159 | - * | |
| 160 | - * @since 3.4.2 | |
| 161 | - * | |
| 162 | - * @param string https://i0.wp.com Domain used by Photon. | |
| 163 | - * @param string $image_url URL of the image to be photonized. | |
| 164 | - */ | |
| 165 | - $photon_domain = apply_filters( 'jetpack_photon_domain', 'https://i0.wp.com', $image_url ); | |
| 166 | - $photon_domain = trailingslashit( esc_url( $photon_domain ) ); | |
| 167 | - $photon_url = $photon_domain . $image_host_path; | |
| 168 | - | |
| 169 | - /** | |
| 170 | - * Add query strings to Photon URL. | |
| 171 | - * By default, Photon doesn't support query strings so we ignore them. | |
| 172 | - * This setting is Photon Server dependent. | |
| 173 | - * | |
| 174 | - * @module photon | |
| 175 | - * | |
| 176 | - * @since 1.9.0 | |
| 177 | - * | |
| 178 | - * @param bool false Should query strings be added to the image URL. Default is false. | |
| 179 | - * @param string $image_url_parts['host'] Image URL's host. | |
| 180 | - */ | |
| 181 | - if ( isset( $image_url_parts['query'] ) && apply_filters( 'jetpack_photon_add_query_string_to_domain', false, $image_url_parts['host'] ) ) { | |
| 182 | - $photon_url .= '?q=' . rawurlencode( $image_url_parts['query'] ); | |
| 183 | - } | |
| 184 | - | |
| 185 | - if ( $args ) { | |
| 186 | - if ( is_array( $args ) ) { | |
| 187 | - $photon_url = add_query_arg( $args, $photon_url ); | |
| 188 | - } else { | |
| 189 | - // You can pass a query string for complicated requests but where you still want CDN subdomain help, etc. | |
| 190 | - $photon_url .= '?' . $args; | |
| 191 | - } | |
| 192 | - } | |
| 193 | - | |
| 194 | - if ( isset( $image_url_parts['scheme'] ) && 'https' === $image_url_parts['scheme'] ) { | |
| 195 | - $photon_url = add_query_arg( array( 'ssl' => 1 ), $photon_url ); | |
| 196 | - } | |
| 197 | - | |
| 198 | - return jetpack_photon_url_scheme( $photon_url, $scheme ); | |
| 26 | + return Image_CDN_Core::cdn_url( $image_url, $args, $scheme ); | |
| 199 | 27 | } |
| 200 | 28 | |
| 201 | 29 | /** |
| 202 | - * Add an easy way to photon-ize a URL that is safe to call even if Jetpack isn't active. | |
| 203 | - * | |
| 204 | - * See: https://jetpack.com/2013/07/11/photon-and-themes/ | |
| 205 | - */ | |
| 206 | -add_filter( 'jetpack_photon_url', 'jetpack_photon_url', 10, 3 ); | |
| 207 | - | |
| 208 | -/** | |
| 209 | - * WordPress.com | |
| 210 | - * | |
| 211 | - * If a cropped WP.com-hosted image is the source image, have Photon replicate the crop. | |
| 212 | - */ | |
| 213 | -add_filter( 'jetpack_photon_pre_args', 'jetpack_photon_parse_wpcom_query_args', 10, 2 ); | |
| 214 | - | |
| 215 | -/** | |
| 216 | 30 | * Parses WP.com-hosted image args to replicate the crop. |
| 217 | 31 | * |
| 32 | + * @deprecated 12.2 Use Automattic\Jetpack\Image_CDN\Image_CDN_Core::parse_wpcom_query_args instead. | |
| 218 | 33 | * @param mixed $args Args set during Photon's processing. |
| 219 | 34 | * @param string $image_url URL of the image. |
| 220 | 35 | * @return array|string Args for Photon to use for the URL. |
| 221 | 36 | */ |
| 222 | 37 | function jetpack_photon_parse_wpcom_query_args( $args, $image_url ) { |
| 223 | - $parsed_url = wp_parse_url( $image_url ); | |
| 224 | - | |
| 225 | - if ( ! $parsed_url ) { | |
| 226 | - return $args; | |
| 227 | - } | |
| 228 | - | |
| 229 | - $image_url_parts = wp_parse_args( | |
| 230 | - $parsed_url, | |
| 231 | - array( | |
| 232 | - 'host' => '', | |
| 233 | - 'query' => '', | |
| 234 | - ) | |
| 235 | - ); | |
| 236 | - | |
| 237 | - if ( '.files.wordpress.com' !== substr( $image_url_parts['host'], -20 ) ) { | |
| 238 | - return $args; | |
| 239 | - } | |
| 240 | - | |
| 241 | - if ( empty( $image_url_parts['query'] ) ) { | |
| 242 | - return $args; | |
| 243 | - } | |
| 244 | - | |
| 245 | - $wpcom_args = wp_parse_args( $image_url_parts['query'] ); | |
| 246 | - | |
| 247 | - if ( empty( $wpcom_args['w'] ) || empty( $wpcom_args['h'] ) ) { | |
| 248 | - return $args; | |
| 249 | - } | |
| 250 | - | |
| 251 | - // Keep the crop by using "resize". | |
| 252 | - if ( ! empty( $wpcom_args['crop'] ) ) { | |
| 253 | - if ( is_array( $args ) ) { | |
| 254 | - $args = array_merge( array( 'resize' => array( $wpcom_args['w'], $wpcom_args['h'] ) ), $args ); | |
| 255 | - } else { | |
| 256 | - $args = 'resize=' . rawurlencode( absint( $wpcom_args['w'] ) . ',' . absint( $wpcom_args['h'] ) ) . '&' . $args; | |
| 257 | - } | |
| 258 | - } elseif ( is_array( $args ) ) { | |
| 259 | - $args = array_merge( array( 'fit' => array( $wpcom_args['w'], $wpcom_args['h'] ) ), $args ); | |
| 260 | - } else { | |
| 261 | - $args = 'fit=' . rawurlencode( absint( $wpcom_args['w'] ) . ',' . absint( $wpcom_args['h'] ) ) . '&' . $args; | |
| 262 | - } | |
| 263 | - | |
| 264 | - return $args; | |
| 38 | + return Image_CDN_Core::parse_wpcom_query_args( $args, $image_url ); | |
| 265 | 39 | } |
| 266 | 40 | |
| 267 | 41 | /** |
| 268 | 42 | * Sets the scheme for a URL |
| 269 | 43 | * |
| 44 | + * @deprecated 12.2 Use Automattic\Jetpack\Image_CDN\Image_CDN_Core::cdn_url_scheme instead. | |
| 270 | 45 | * @param string $url URL to set scheme. |
| 271 | 46 | * @param string $scheme Scheme to use. Accepts http, https, network_path. |
| 272 | 47 | * |
| 273 | 48 | * @return string URL. |
| @@ -272,30 +47,16 @@ | ||
| 272 | 47 | * |
| 273 | 48 | * @return string URL. |
| 274 | 49 | */ |
| 275 | 50 | function jetpack_photon_url_scheme( $url, $scheme ) { |
| 276 | - if ( ! in_array( $scheme, array( 'http', 'https', 'network_path' ), true ) ) { | |
| 277 | - if ( preg_match( '#^(https?:)?//#', $url ) ) { | |
| 278 | - return $url; | |
| 279 | - } | |
| 280 | - | |
| 281 | - $scheme = 'http'; | |
| 282 | - } | |
| 283 | - | |
| 284 | - if ( 'network_path' === $scheme ) { | |
| 285 | - $scheme_slashes = '//'; | |
| 286 | - } else { | |
| 287 | - $scheme_slashes = "$scheme://"; | |
| 288 | - } | |
| 289 | - | |
| 290 | - return preg_replace( '#^([a-z:]+)?//#i', $scheme_slashes, $url ); | |
| 51 | + _deprecated_function( __FUNCTION__, 'jetpack-12.2', 'Automattic\Jetpack\Image_CDN\Image_CDN_Core::cdn_url_scheme' ); | |
| 52 | + return Image_CDN_Core::cdn_url_scheme( $url, $scheme ); | |
| 291 | 53 | } |
| 292 | 54 | |
| 293 | -add_filter( 'jetpack_photon_skip_for_url', 'jetpack_photon_banned_domains', 9, 2 ); | |
| 294 | - | |
| 295 | 55 | /** |
| 296 | 56 | * Check to skip Photon for a known domain that shouldn't be Photonized. |
| 297 | 57 | * |
| 58 | + * @deprecated 12.2 Use Automattic\Jetpack\Image_CDN\Image_CDN_Core::banned_domains instead. | |
| 298 | 59 | * @param bool $skip If the image should be skipped by Photon. |
| 299 | 60 | * @param string $image_url URL of the image. |
| 300 | 61 | * |
| 301 | 62 | * @return bool Should the image be skipped by Photon. |
| @@ -300,42 +61,20 @@ | ||
| 300 | 61 | * |
| 301 | 62 | * @return bool Should the image be skipped by Photon. |
| 302 | 63 | */ |
| 303 | 64 | function jetpack_photon_banned_domains( $skip, $image_url ) { |
| 304 | - $banned_host_patterns = array( | |
| 305 | - '/^chart\.googleapis\.com$/', | |
| 306 | - '/^chart\.apis\.google\.com$/', | |
| 307 | - '/^graph\.facebook\.com$/', | |
| 308 | - '/\.fbcdn\.net$/', | |
| 309 | - '/\.paypalobjects\.com$/', | |
| 310 | - '/\.dropbox\.com$/', | |
| 311 | - '/\.cdninstagram\.com$/', | |
| 312 | - '/^(commons|upload)\.wikimedia\.org$/', | |
| 313 | - '/\.wikipedia\.org$/', | |
| 314 | - '/^live\.staticflickr\.com$/', | |
| 315 | - ); | |
| 316 | - | |
| 317 | - $host = wp_parse_url( $image_url, PHP_URL_HOST ); | |
| 318 | - | |
| 319 | - foreach ( $banned_host_patterns as $banned_host_pattern ) { | |
| 320 | - if ( 1 === preg_match( $banned_host_pattern, $host ) ) { | |
| 321 | - return true; | |
| 322 | - } | |
| 323 | - } | |
| 324 | - | |
| 325 | - return $skip; | |
| 65 | + _deprecated_function( __FUNCTION__, 'jetpack-12.2', 'Automattic\Jetpack\Image_CDN\Image_CDN_Core::banned_domains' ); | |
| 66 | + return Image_CDN_Core::banned_domains( $skip, $image_url ); | |
| 326 | 67 | } |
| 327 | 68 | |
| 328 | 69 | /** |
| 329 | 70 | * Jetpack Photon - Support Text Widgets. |
| 330 | 71 | * |
| 72 | + * @deprecated 12.2 | |
| 331 | 73 | * @access public |
| 332 | 74 | * @param string $content Content from text widget. |
| 333 | 75 | * @return string |
| 334 | 76 | */ |
| 335 | 77 | function jetpack_photon_support_text_widgets( $content ) { |
| 336 | - if ( class_exists( 'Jetpack_Photon' ) && Jetpack::is_module_active( 'photon' ) ) { | |
| 337 | - return Jetpack_Photon::filter_the_content( $content ); | |
| 338 | - } | |
| 339 | - return $content; | |
| 78 | + _deprecated_function( __FUNCTION__, 'jetpack-12.2' ); | |
| 79 | + return Image_CDN::filter_the_content( $content ); | |
| 340 | 80 | } |
| 341 | -add_filter( 'widget_text', 'jetpack_photon_support_text_widgets' ); | |