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