PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.1
16.3-a.3 16.3-a.1 16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 All 504 releases
← All changes | modules/theme-tools/content-options/featured-images-fallback.php +169 -84 12.2.3 → 16.3-a.1 View file →
@@ -4,39 +4,48 @@
4 4 *
5 5 * @package automattic/jetpack
6 6 */
7 7
8 -/**
9 - * Get one image from a specified post in the following order:
10 - * Featured Image then first image from the_content HTML
11 - * and filter the post_thumbnail_html
12 - *
13 - * @param string $html The HTML for the image markup.
14 - * @param int $post_id The post ID to check.
15 - * @param int $post_thumbnail_id The ID of the featured image.
16 - * @param string $size The image size to return, defaults to 'post-thumbnail'.
17 - * @param string|array $attr Optional. Query string or array of attributes.
18 - *
19 - * @return string $html Thumbnail image with markup.
20 - */
21 -function jetpack_featured_images_fallback_get_image( $html, $post_id, $post_thumbnail_id, $size, $attr ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
22 - $opts = jetpack_featured_images_get_settings();
8 +use Automattic\Jetpack\Post_Media\Images;
23 9
24 - if ( ! empty( $html ) || (bool) 1 !== (bool) $opts['fallback-option'] ) {
25 - return trim( $html );
26 - }
10 +if ( ! defined( 'ABSPATH' ) ) {
11 + exit( 0 );
12 +}
27 13
28 - if ( jetpack_featured_images_should_load() ) {
29 - if (
30 - ( true === $opts['archive'] && ( is_home() || is_archive() || is_search() ) && ! $opts['archive-option'] )
31 - || ( true === $opts['post'] && is_single() && ! $opts['post-option'] )
32 - || ! $opts['fallback-option']
33 - ) {
14 +if ( ! function_exists( 'jetpack_featured_images_fallback_get_image' ) ) {
15 +
16 + /**
17 + * Get one image from a specified post in the following order:
18 + * Featured Image then first image from the_content HTML
19 + * and filter the post_thumbnail_html
20 + *
21 + * @deprecated 13.9 Moved to Classic Theme Helper package.
22 + * @param string $html The HTML for the image markup.
23 + * @param int $post_id The post ID to check.
24 + * @param int $post_thumbnail_id The ID of the featured image.
25 + * @param string $size The image size to return, defaults to 'post-thumbnail'.
26 + * @param string|array $attr Optional. Query string or array of attributes.
27 + *
28 + * @return string $html Thumbnail image with markup.
29 + */
30 + function jetpack_featured_images_fallback_get_image( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
31 + _deprecated_function( __FUNCTION__, 'jetpack-13.9' );
32 + $opts = jetpack_featured_images_get_settings();
33 +
34 + if ( ! empty( $html ) || (bool) 1 !== (bool) $opts['fallback-option'] ) {
34 35 return trim( $html );
35 36 }
36 - }
37 37
38 - if ( class_exists( 'Jetpack_PostImages' ) ) {
38 + if ( jetpack_featured_images_should_load() ) {
39 + if (
40 + ( true === $opts['archive'] && ( is_home() || is_archive() || is_search() ) && ! $opts['archive-option'] )
41 + || ( true === $opts['post'] && is_single() && ! $opts['post-option'] )
42 + || ! $opts['fallback-option']
43 + ) {
44 + return trim( $html );
45 + }
46 + }
47 +
39 48 global $_wp_additional_image_sizes;
40 49
41 50 $args = array(
42 51 'from_thumbnail' => false,
@@ -44,9 +53,9 @@
44 53 'from_gallery' => true,
45 54 'from_attachment' => false,
46 55 );
47 56
48 - $image = Jetpack_PostImages::get_image( $post_id, $args );
57 + $image = Images::get_image( $post_id, $args );
49 58
50 59 if ( ! empty( $image ) ) {
51 60 $image['width'] = '';
52 61 $image['height'] = '';
@@ -57,50 +66,112 @@
57 66 $image['height'] = $_wp_additional_image_sizes[ $size ]['height'];
58 67 $image['crop'] = $_wp_additional_image_sizes[ $size ]['crop'];
59 68 }
60 69
61 - $image_src = Jetpack_PostImages::fit_image_url( $image['src'], $image['width'], $image['height'] );
70 + // Force `crop` to be a simple boolean, to avoid dealing with WP crop positions.
71 + $image['crop'] = boolval( $image['crop'] );
62 72
63 - // Use the theme's crop setting rather than forcing to true.
64 - $image_src = add_query_arg( 'crop', $image['crop'], $image_src );
73 + $image_sizes = '';
65 74
66 - $html = '<img src="' . esc_url( $image_src ) . '" title="' . esc_attr( wp_strip_all_tags( get_the_title() ) ) . '" class="attachment-' . esc_attr( $size ) . ' wp-post-image" />';
75 + $width = isset( $image['width'] ) ? intval( $image['width'] ) : null;
76 + $height = isset( $image['height'] ) ? intval( $image['height'] ) : null;
67 77
78 + if ( ! empty( $image['src_width'] ) && ! empty( $image['src_height'] ) && ! empty( $image['width'] ) && ! empty( $image['height'] ) ) {
79 + $src_width = intval( $image['src_width'] );
80 + $src_height = intval( $image['src_height'] );
81 +
82 + // If we're aware of the source dimensions, calculate the final image height and width.
83 + // This allows us to provide them as attributes in the `<img>` tag, to avoid layout shifts.
84 + // It also allows us to calculate a `srcset`.
85 + if ( $image['crop'] ) {
86 + // If we're cropping, the final dimensions are calculated independently of each other.
87 + $width = min( $width, $src_width );
88 + $height = min( $height, $src_height );
89 + } else {
90 + // If we're not cropping, we need to preserve aspect ratio.
91 + $dims = wp_constrain_dimensions( $src_width, $src_height, $width, $height );
92 + $width = $dims[0];
93 + $height = $dims[1];
94 + }
95 +
96 + $image_src = Images::fit_image_url( $image['src'], $width, $height );
97 + $image_srcset = Images::generate_cropped_srcset( $image, $width, $height, true );
98 + $image_sizes = 'min(' . $width . 'px, 100vw)';
99 + } else {
100 + // If we're not aware of the source dimensions, leave the size calculations to the CDN, and
101 + // fall back to a simpler `<img>` tag without `width`/`height` or `srcset`.
102 + $image_src = Images::fit_image_url( $image['src'], $image['width'], $image['height'] );
103 +
104 + // Use the theme's crop setting rather than forcing to true.
105 + $image_src = add_query_arg( 'crop', $image['crop'], $image_src );
106 +
107 + $image_srcset = null;
108 + $image_sizes = null;
109 + }
110 +
111 + $default_attr = array(
112 + 'srcset' => $image_srcset,
113 + 'sizes' => $image_sizes,
114 + 'loading' => is_singular() ? 'eager' : 'lazy',
115 + 'decoding' => 'async',
116 + 'title' => wp_strip_all_tags( get_the_title() ),
117 + 'alt' => '',
118 + 'class' => "attachment-$size wp-post-image",
119 + );
120 +
121 + $image_attr = wp_parse_args( $attr, $default_attr );
122 + $hwstring = image_hwstring( $width, $height );
123 +
124 + $html = rtrim( "<img $hwstring" );
125 + $html .= ' src="' . esc_url( $image_src ) . '"';
126 +
127 + foreach ( $image_attr as $name => $value ) {
128 + if ( $value ) {
129 + $html .= " $name=" . '"' . esc_attr( $value ) . '"';
130 + }
131 + }
132 +
133 + $html .= ' />';
134 +
68 135 return trim( $html );
69 136 }
137 +
138 + return trim( $html );
70 139 }
140 + add_filter( 'post_thumbnail_html', 'jetpack_featured_images_fallback_get_image', 10, 5 );
71 141
72 - return trim( $html );
73 142 }
74 -add_filter( 'post_thumbnail_html', 'jetpack_featured_images_fallback_get_image', 10, 5 );
75 143
76 -/**
77 - * Get URL of one image from a specified post in the following order:
78 - * Featured Image then first image from the_content HTML
79 - *
80 - * @param int $post_id The post ID to check.
81 - * @param int $post_thumbnail_id The ID of the featured image.
82 - * @param string $size The image size to return, defaults to 'post-thumbnail'.
83 - *
84 - * @return string|null $image_src The URL of the thumbnail image.
85 - */
86 -function jetpack_featured_images_fallback_get_image_src( $post_id, $post_thumbnail_id, $size ) {
87 - $image_src = wp_get_attachment_image_src( $post_thumbnail_id, $size );
88 - $image_src = ( ! empty( $image_src[0] ) ) ? $image_src[0] : null;
89 - $opts = jetpack_featured_images_get_settings();
144 +if ( ! function_exists( 'jetpack_featured_images_fallback_get_image_src' ) ) {
90 145
91 - if ( ! empty( $image_src ) || (bool) 1 !== (bool) $opts['fallback-option'] ) {
92 - return esc_url( $image_src );
93 - }
146 + /**
147 + * Get URL of one image from a specified post in the following order:
148 + * Featured Image then first image from the_content HTML
149 + *
150 + * @deprecated 13.9 Moved to Classic Theme Helper package.
151 + * @param int $post_id The post ID to check.
152 + * @param int $post_thumbnail_id The ID of the featured image.
153 + * @param string $size The image size to return, defaults to 'post-thumbnail'.
154 + *
155 + * @return string|null $image_src The URL of the thumbnail image.
156 + */
157 + function jetpack_featured_images_fallback_get_image_src( $post_id, $post_thumbnail_id, $size ) {
158 + _deprecated_function( __FUNCTION__, 'jetpack-13.9' );
159 + $image_src = wp_get_attachment_image_src( $post_thumbnail_id, $size );
160 + $image_src = ( ! empty( $image_src[0] ) ) ? $image_src[0] : null;
161 + $opts = jetpack_featured_images_get_settings();
94 162
95 - if ( jetpack_featured_images_should_load() ) {
96 - if ( ( true === $opts['archive'] && ( is_home() || is_archive() || is_search() ) && ! $opts['archive-option'] )
97 - || ( true === $opts['post'] && is_single() && ! $opts['post-option'] ) ) {
98 - return esc_url( $image_src );
163 + if ( ! empty( $image_src ) || (bool) 1 !== (bool) $opts['fallback-option'] ) {
164 + return esc_url( $image_src );
99 165 }
100 - }
101 166
102 - if ( class_exists( 'Jetpack_PostImages' ) ) {
167 + if ( jetpack_featured_images_should_load() ) {
168 + if ( ( true === $opts['archive'] && ( is_home() || is_archive() || is_search() ) && ! $opts['archive-option'] )
169 + || ( true === $opts['post'] && is_single() && ! $opts['post-option'] ) ) {
170 + return esc_url( $image_src );
171 + }
172 + }
173 +
103 174 global $_wp_additional_image_sizes;
104 175
105 176 $args = array(
106 177 'from_thumbnail' => false,
@@ -108,9 +179,9 @@
108 179 'from_gallery' => true,
109 180 'from_attachment' => false,
110 181 );
111 182
112 - $image = Jetpack_PostImages::get_image( $post_id, $args );
183 + $image = Images::get_image( $post_id, $args );
113 184
114 185 if ( ! empty( $image ) ) {
115 186 $image['width'] = '';
116 187 $image['height'] = '';
@@ -121,9 +192,9 @@
121 192 $image['height'] = $_wp_additional_image_sizes[ $size ]['height'];
122 193 $image['crop'] = $_wp_additional_image_sizes[ $size ]['crop'];
123 194 }
124 195
125 - $image_src = Jetpack_PostImages::fit_image_url( $image['src'], $image['width'], $image['height'] );
196 + $image_src = Images::fit_image_url( $image['src'], $image['width'], $image['height'] );
126 197
127 198 // Use the theme's crop setting rather than forcing to true.
128 199 $image_src = add_query_arg( 'crop', $image['crop'], $image_src );
129 200
@@ -128,40 +199,54 @@
128 199 $image_src = add_query_arg( 'crop', $image['crop'], $image_src );
129 200
130 201 return esc_url( $image_src );
131 202 }
203 +
204 + return esc_url( $image_src );
132 205 }
133 206
134 - return esc_url( $image_src );
135 207 }
136 208
137 -/**
138 - * Check if post has an image attached, including a fallback.
139 - *
140 - * @param int $post The post ID to check.
141 - *
142 - * @return bool
143 - */
144 -function jetpack_has_featured_image( $post = null ) {
145 - return (bool) get_the_post_thumbnail( $post );
209 +if ( ! function_exists( 'jetpack_has_featured_image' ) ) {
210 +
211 + /**
212 + * Check if post has an image attached, including a fallback.
213 + *
214 + * @deprecated 13.9 Moved to Classic Theme Helper package.
215 + * @param int $post The post ID to check.
216 + *
217 + * @return bool
218 + */
219 + function jetpack_has_featured_image( $post = null ) {
220 + _deprecated_function( __FUNCTION__, 'jetpack-13.9' );
221 + return (bool) get_the_post_thumbnail( $post );
222 + }
223 +
146 224 }
147 225
148 -/**
149 - * Adds custom class to the array of post classes.
150 - *
151 - * @param array $classes Classes for the post element.
152 - * @param array $class Optional. Comma separated list of additional classes.
153 - * @param array $post_id Unique The post ID to check.
154 - *
155 - * @return array $classes
156 - */
157 -function jetpack_featured_images_post_class( $classes, $class, $post_id ) {
158 - $post_password_required = post_password_required( $post_id );
159 - $opts = jetpack_featured_images_get_settings();
226 +if ( ! function_exists( 'jetpack_featured_images_post_class' ) ) {
160 227
161 - if ( jetpack_has_featured_image( $post_id ) && (bool) 1 === (bool) $opts['fallback-option'] && ! is_attachment() && ! $post_password_required && 'post' === get_post_type() ) {
162 - $classes[] = 'has-post-thumbnail';
228 + /**
229 + * Adds custom class to the array of post classes.
230 + *
231 + * @deprecated 13.9 Moved to Classic Theme Helper package.
232 + * @param array $classes Classes for the post element.
233 + * @param array $class Optional. Comma-separated list of additional classes.
234 + * @param array $post_id Unique The post ID to check.
235 + *
236 + * @return array $classes
237 + */
238 + function jetpack_featured_images_post_class( $classes, $class, $post_id ) {
239 + _deprecated_function( __FUNCTION__, 'jetpack-13.9' );
240 + $post_password_required = post_password_required( $post_id );
241 + $opts = jetpack_featured_images_get_settings();
242 +
243 + if ( jetpack_has_featured_image( $post_id ) && (bool) 1 === (bool) $opts['fallback-option'] && ! is_attachment() && ! $post_password_required && 'post' === get_post_type() ) {
244 + $classes[] = 'has-post-thumbnail';
245 + $classes[] = 'fallback-thumbnail';
246 + }
247 +
248 + return $classes;
163 249 }
250 + add_filter( 'post_class', 'jetpack_featured_images_post_class', 10, 3 );
164 251
165 - return $classes;
166 252 }
167 -add_filter( 'post_class', 'jetpack_featured_images_post_class', 10, 3 );