PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 2.9.6
Jetpack – WP Security, Backup, Speed, & Growth v2.9.6
15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / functions.photon.php
jetpack Last commit date
3rd-party 10 years ago _inc 10 years ago languages 10 years ago modules 5 years ago views 10 years ago .svnignore 10 years ago class.jetpack-bbpress-json-api-compat.php 10 years ago class.jetpack-cli.php 10 years ago class.jetpack-client-server.php 10 years ago class.jetpack-client.php 10 years ago class.jetpack-data.php 10 years ago class.jetpack-debugger.php 10 years ago class.jetpack-error.php 10 years ago class.jetpack-heartbeat.php 10 years ago class.jetpack-ixr-client.php 10 years ago class.jetpack-network-sites-list-table.php 10 years ago class.jetpack-network.php 10 years ago class.jetpack-options.php 10 years ago class.jetpack-post-images.php 10 years ago class.jetpack-signature.php 10 years ago class.jetpack-sync.php 10 years ago class.jetpack-user-agent.php 10 years ago class.jetpack-xmlrpc-server.php 10 years ago class.jetpack.php 10 years ago class.json-api-endpoints.php 3 years ago class.json-api.php 10 years ago class.media-extractor.php 10 years ago class.media-summary.php 10 years ago class.photon.php 10 years ago composer.json 10 years ago functions.compat.php 10 years ago functions.gallery.php 10 years ago functions.opengraph.php 10 years ago functions.photon.php 10 years ago functions.twitter-cards.php 10 years ago jetpack.php 3 years ago locales.php 10 years ago readme.txt 3 years ago require-lib.php 10 years ago uninstall.php 10 years ago
functions.photon.php
161 lines
1 <?php
2
3 /**
4 * Generates a Photon URL.
5 *
6 * @see http://developer.wordpress.com/docs/photon/
7 *
8 * @param string $image_url URL to the publicly accessible image you want to manipulate
9 * @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)
10 * @return string The raw final URL. You should run this through esc_url() before displaying it.
11 */
12 function jetpack_photon_url( $image_url, $args = array(), $scheme = null ) {
13 $image_url = trim( $image_url );
14
15 $image_url = apply_filters( 'jetpack_photon_pre_image_url', $image_url, $args, $scheme );
16 $args = apply_filters( 'jetpack_photon_pre_args', $args, $image_url, $scheme );
17
18 if ( empty( $image_url ) )
19 return $image_url;
20
21 $image_url_parts = @parse_url( $image_url );
22
23 // Unable to parse
24 if ( ! is_array( $image_url_parts ) || empty( $image_url_parts['host'] ) || empty( $image_url_parts['path'] ) )
25 return $image_url;
26
27 if ( is_array( $args ) ){
28 // Convert values that are arrays into strings
29 foreach ( $args as $arg => $value ) {
30 if ( is_array( $value ) ) {
31 $args[$arg] = implode( ',', $value );
32 }
33 }
34
35 // Encode values
36 // See http://core.trac.wordpress.org/ticket/17923
37 $args = rawurlencode_deep( $args );
38 }
39
40 // You can't run a Photon URL through Photon again because query strings are stripped.
41 // So if the image is already a Photon URL, append the new arguments to the existing URL.
42 if ( in_array( $image_url_parts['host'], array( 'i0.wp.com', 'i1.wp.com', 'i2.wp.com' ) ) ) {
43 $photon_url = add_query_arg( $args, $image_url );
44
45 return jetpack_photon_url_scheme( $photon_url, $scheme );
46 }
47
48 // This setting is Photon Server dependent
49 if ( ! apply_filters( 'jetpack_photon_any_extension_for_domain', false, $image_url_parts['host'] ) ) {
50 // Photon doesn't support query strings so we ignore them and look only at the path.
51 // However some source images are served via PHP so check the no-query-string extension.
52 // For future proofing, this is a blacklist of common issues rather than a whitelist.
53 $extension = pathinfo( $image_url_parts['path'], PATHINFO_EXTENSION );
54 if ( empty( $extension ) || in_array( $extension, array( 'php' ) ) )
55 return $image_url;
56 }
57
58 $image_host_path = $image_url_parts['host'] . $image_url_parts['path'];
59
60 // Figure out which CDN subdomain to use
61 srand( crc32( $image_host_path ) );
62 $subdomain = rand( 0, 2 );
63 srand();
64
65 $photon_url = "http://i{$subdomain}.wp.com/$image_host_path";
66
67 // This setting is Photon Server dependent
68 if ( isset( $image_url_parts['query'] ) && apply_filters( 'jetpack_photon_add_query_string_to_domain', false, $image_url_parts['host'] ) ) {
69 $photon_url .= '?q=' . rawurlencode( $image_url_parts['query'] );
70 }
71
72 if ( $args ) {
73 if ( is_array( $args ) ) {
74 $photon_url = add_query_arg( $args, $photon_url );
75 } else {
76 // You can pass a query string for complicated requests but where you still want CDN subdomain help, etc.
77 $photon_url .= '?' . $args;
78 }
79 }
80
81 return jetpack_photon_url_scheme( $photon_url, $scheme );
82 }
83 add_filter( 'jetpack_photon_url', 'jetpack_photon_url', 10, 3 );
84
85 /**
86 * WordPress.com
87 *
88 * If a cropped WP.com-hosted image is the source image, have Photon replicate the crop.
89 */
90 add_filter( 'jetpack_photon_pre_args', 'jetpack_photon_parse_wpcom_query_args', 10, 2 );
91
92 function jetpack_photon_parse_wpcom_query_args( $args, $image_url ) {
93 $parsed_url = @parse_url( $image_url );
94
95 if ( ! $parsed_url )
96 return $args;
97
98 $image_url_parts = wp_parse_args( $parsed_url, array(
99 'host' => '',
100 'query' => ''
101 ) );
102
103 if ( '.files.wordpress.com' != substr( $image_url_parts['host'], -20 ) )
104 return $args;
105
106 if ( empty( $image_url_parts['query'] ) )
107 return $args;
108
109 $wpcom_args = wp_parse_args( $image_url_parts['query'] );
110
111 if ( empty( $wpcom_args['w'] ) || empty( $wpcom_args['h'] ) )
112 return $args;
113
114 // Keep the crop by using "resize"
115 if ( ! empty( $wpcom_args['crop'] ) ) {
116 if ( is_array( $args ) ) {
117 $args = array_merge( array( 'resize' => array( $wpcom_args['w'], $wpcom_args['h'] ) ), $args );
118 } else {
119 $args = 'resize=' . rawurlencode( absint( $wpcom_args['w'] ) . ',' . absint( $wpcom_args['h'] ) ) . '&' . $args;
120 }
121 } else {
122 if ( is_array( $args ) ) {
123 $args = array_merge( array( 'fit' => array( $wpcom_args['w'], $wpcom_args['h'] ) ), $args );
124 } else {
125 $args = 'fit=' . rawurlencode( absint( $wpcom_args['w'] ) . ',' . absint( $wpcom_args['h'] ) ) . '&' . $args;
126 }
127 }
128
129 return $args;
130 }
131
132
133 /**
134 * Facebook
135 */
136 add_filter( 'jetpack_photon_add_query_string_to_domain', 'jetpack_photon_allow_facebook_graph_domain', 10, 2 );
137 add_filter( 'jetpack_photon_any_extension_for_domain', 'jetpack_photon_allow_facebook_graph_domain', 10, 2 );
138
139 function jetpack_photon_url_scheme( $url, $scheme ) {
140 if ( ! in_array( $scheme, array( 'http', 'https', 'network_path' ) ) ) {
141 $scheme = is_ssl() ? 'https' : 'http';
142 }
143
144 if ( 'network_path' == $scheme ) {
145 $scheme_slashes = '//';
146 } else {
147 $scheme_slashes = "$scheme://";
148 }
149
150 return preg_replace( '#^[a-z:]+//#i', $scheme_slashes, $url );
151 }
152
153 function jetpack_photon_allow_facebook_graph_domain( $allow = false, $domain ) {
154 switch ( $domain ) {
155 case 'graph.facebook.com' :
156 return true;
157 }
158
159 return $allow;
160 }
161