PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.3.3
Jetpack – WP Security, Backup, Speed, & Growth v13.3.3
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 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 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 / modules / theme-tools / content-options / featured-images-fallback.php
jetpack / modules / theme-tools / content-options Last commit date
author-bio.php 2 years ago blog-display.php 4 years ago customizer.js 6 years ago customizer.php 3 years ago featured-images-fallback.php 2 years ago featured-images.php 2 years ago post-details.php 4 years ago
featured-images-fallback.php
227 lines
1 <?php
2 /**
3 * Theme Tools: functions for Featured Images fallback.
4 *
5 * @package automattic/jetpack
6 */
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();
23
24 if ( ! empty( $html ) || (bool) 1 !== (bool) $opts['fallback-option'] ) {
25 return trim( $html );
26 }
27
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 ) {
34 return trim( $html );
35 }
36 }
37
38 if ( class_exists( 'Jetpack_PostImages' ) ) {
39 global $_wp_additional_image_sizes;
40
41 $args = array(
42 'from_thumbnail' => false,
43 'from_slideshow' => true,
44 'from_gallery' => true,
45 'from_attachment' => false,
46 );
47
48 $image = Jetpack_PostImages::get_image( $post_id, $args );
49
50 if ( ! empty( $image ) ) {
51 $image['width'] = '';
52 $image['height'] = '';
53 $image['crop'] = '';
54
55 if ( array_key_exists( $size, $_wp_additional_image_sizes ) ) {
56 $image['width'] = $_wp_additional_image_sizes[ $size ]['width'];
57 $image['height'] = $_wp_additional_image_sizes[ $size ]['height'];
58 $image['crop'] = $_wp_additional_image_sizes[ $size ]['crop'];
59 }
60
61 // Force `crop` to be a simple boolean, to avoid dealing with WP crop positions.
62 $image['crop'] = boolval( $image['crop'] );
63
64 $image_sizes = '';
65
66 $width = isset( $image['width'] ) ? intval( $image['width'] ) : null;
67 $height = isset( $image['height'] ) ? intval( $image['height'] ) : null;
68
69 if ( ! empty( $image['src_width'] ) && ! empty( $image['src_height'] ) && ! empty( $image['width'] ) && ! empty( $image['height'] ) ) {
70 $src_width = intval( $image['src_width'] );
71 $src_height = intval( $image['src_height'] );
72
73 // If we're aware of the source dimensions, calculate the final image height and width.
74 // This allows us to provide them as attributes in the `<img>` tag, to avoid layout shifts.
75 // It also allows us to calculate a `srcset`.
76 if ( $image['crop'] ) {
77 // If we're cropping, the final dimensions are calculated independently of each other.
78 $width = min( $width, $src_width );
79 $height = min( $height, $src_height );
80 } else {
81 // If we're not cropping, we need to preserve aspect ratio.
82 $dims = wp_constrain_dimensions( $src_width, $src_height, $width, $height );
83 $width = $dims[0];
84 $height = $dims[1];
85 }
86
87 $image_src = Jetpack_PostImages::fit_image_url( $image['src'], $width, $height );
88 $image_srcset = Jetpack_PostImages::generate_cropped_srcset( $image, $width, $height, true );
89 $image_sizes = 'min(' . $width . 'px, 100vw)';
90 } else {
91 // If we're not aware of the source dimensions, leave the size calculations to the CDN, and
92 // fall back to a simpler `<img>` tag without `width`/`height` or `srcset`.
93 $image_src = Jetpack_PostImages::fit_image_url( $image['src'], $image['width'], $image['height'] );
94
95 // Use the theme's crop setting rather than forcing to true.
96 $image_src = add_query_arg( 'crop', $image['crop'], $image_src );
97
98 $image_srcset = null;
99 $image_sizes = null;
100 }
101
102 $default_attr = array(
103 'srcset' => $image_srcset,
104 'sizes' => $image_sizes,
105 'loading' => is_singular() ? 'eager' : 'lazy',
106 'decoding' => 'async',
107 'title' => wp_strip_all_tags( get_the_title() ),
108 'alt' => '',
109 'class' => "attachment-$size wp-post-image",
110 );
111
112 $image_attr = wp_parse_args( $attr, $default_attr );
113 $hwstring = image_hwstring( $width, $height );
114
115 $html = rtrim( "<img $hwstring" );
116 $html .= ' src="' . esc_url( $image_src ) . '"';
117
118 foreach ( $image_attr as $name => $value ) {
119 if ( $value ) {
120 $html .= " $name=" . '"' . esc_attr( $value ) . '"';
121 }
122 }
123
124 $html .= ' />';
125
126 return trim( $html );
127 }
128 }
129
130 return trim( $html );
131 }
132 add_filter( 'post_thumbnail_html', 'jetpack_featured_images_fallback_get_image', 10, 5 );
133
134 /**
135 * Get URL of one image from a specified post in the following order:
136 * Featured Image then first image from the_content HTML
137 *
138 * @param int $post_id The post ID to check.
139 * @param int $post_thumbnail_id The ID of the featured image.
140 * @param string $size The image size to return, defaults to 'post-thumbnail'.
141 *
142 * @return string|null $image_src The URL of the thumbnail image.
143 */
144 function jetpack_featured_images_fallback_get_image_src( $post_id, $post_thumbnail_id, $size ) {
145 $image_src = wp_get_attachment_image_src( $post_thumbnail_id, $size );
146 $image_src = ( ! empty( $image_src[0] ) ) ? $image_src[0] : null;
147 $opts = jetpack_featured_images_get_settings();
148
149 if ( ! empty( $image_src ) || (bool) 1 !== (bool) $opts['fallback-option'] ) {
150 return esc_url( $image_src );
151 }
152
153 if ( jetpack_featured_images_should_load() ) {
154 if ( ( true === $opts['archive'] && ( is_home() || is_archive() || is_search() ) && ! $opts['archive-option'] )
155 || ( true === $opts['post'] && is_single() && ! $opts['post-option'] ) ) {
156 return esc_url( $image_src );
157 }
158 }
159
160 if ( class_exists( 'Jetpack_PostImages' ) ) {
161 global $_wp_additional_image_sizes;
162
163 $args = array(
164 'from_thumbnail' => false,
165 'from_slideshow' => true,
166 'from_gallery' => true,
167 'from_attachment' => false,
168 );
169
170 $image = Jetpack_PostImages::get_image( $post_id, $args );
171
172 if ( ! empty( $image ) ) {
173 $image['width'] = '';
174 $image['height'] = '';
175 $image['crop'] = '';
176
177 if ( array_key_exists( $size, $_wp_additional_image_sizes ) ) {
178 $image['width'] = $_wp_additional_image_sizes[ $size ]['width'];
179 $image['height'] = $_wp_additional_image_sizes[ $size ]['height'];
180 $image['crop'] = $_wp_additional_image_sizes[ $size ]['crop'];
181 }
182
183 $image_src = Jetpack_PostImages::fit_image_url( $image['src'], $image['width'], $image['height'] );
184
185 // Use the theme's crop setting rather than forcing to true.
186 $image_src = add_query_arg( 'crop', $image['crop'], $image_src );
187
188 return esc_url( $image_src );
189 }
190 }
191
192 return esc_url( $image_src );
193 }
194
195 /**
196 * Check if post has an image attached, including a fallback.
197 *
198 * @param int $post The post ID to check.
199 *
200 * @return bool
201 */
202 function jetpack_has_featured_image( $post = null ) {
203 return (bool) get_the_post_thumbnail( $post );
204 }
205
206 /**
207 * Adds custom class to the array of post classes.
208 *
209 * @param array $classes Classes for the post element.
210 * @param array $class Optional. Comma separated list of additional classes.
211 * @param array $post_id Unique The post ID to check.
212 *
213 * @return array $classes
214 */
215 function jetpack_featured_images_post_class( $classes, $class, $post_id ) {
216 $post_password_required = post_password_required( $post_id );
217 $opts = jetpack_featured_images_get_settings();
218
219 if ( jetpack_has_featured_image( $post_id ) && (bool) 1 === (bool) $opts['fallback-option'] && ! is_attachment() && ! $post_password_required && 'post' === get_post_type() ) {
220 $classes[] = 'has-post-thumbnail';
221 $classes[] = 'fallback-thumbnail';
222 }
223
224 return $classes;
225 }
226 add_filter( 'post_class', 'jetpack_featured_images_post_class', 10, 3 );
227