PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
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 7 months ago blog-display.php 1 month ago customizer.js 1 year ago customizer.php 7 months ago featured-images-fallback.php 2 weeks ago featured-images.php 1 month ago post-details.php 7 months ago
featured-images-fallback.php
253 lines
1 <?php
2 /**
3 * Theme Tools: functions for Featured Images fallback.
4 *
5 * @package automattic/jetpack
6 */
7
8 use Automattic\Jetpack\Post_Media\Images;
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit( 0 );
12 }
13
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'] ) {
35 return trim( $html );
36 }
37
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
48 global $_wp_additional_image_sizes;
49
50 $args = array(
51 'from_thumbnail' => false,
52 'from_slideshow' => true,
53 'from_gallery' => true,
54 'from_attachment' => false,
55 );
56
57 $image = Images::get_image( $post_id, $args );
58
59 if ( ! empty( $image ) ) {
60 $image['width'] = '';
61 $image['height'] = '';
62 $image['crop'] = '';
63
64 if ( array_key_exists( $size, $_wp_additional_image_sizes ) ) {
65 $image['width'] = $_wp_additional_image_sizes[ $size ]['width'];
66 $image['height'] = $_wp_additional_image_sizes[ $size ]['height'];
67 $image['crop'] = $_wp_additional_image_sizes[ $size ]['crop'];
68 }
69
70 // Force `crop` to be a simple boolean, to avoid dealing with WP crop positions.
71 $image['crop'] = boolval( $image['crop'] );
72
73 $image_sizes = '';
74
75 $width = isset( $image['width'] ) ? intval( $image['width'] ) : null;
76 $height = isset( $image['height'] ) ? intval( $image['height'] ) : null;
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
135 return trim( $html );
136 }
137
138 return trim( $html );
139 }
140 add_filter( 'post_thumbnail_html', 'jetpack_featured_images_fallback_get_image', 10, 5 );
141
142 }
143
144 if ( ! function_exists( 'jetpack_featured_images_fallback_get_image_src' ) ) {
145
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();
162
163 if ( ! empty( $image_src ) || (bool) 1 !== (bool) $opts['fallback-option'] ) {
164 return esc_url( $image_src );
165 }
166
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
174 global $_wp_additional_image_sizes;
175
176 $args = array(
177 'from_thumbnail' => false,
178 'from_slideshow' => true,
179 'from_gallery' => true,
180 'from_attachment' => false,
181 );
182
183 $image = Images::get_image( $post_id, $args );
184
185 if ( ! empty( $image ) ) {
186 $image['width'] = '';
187 $image['height'] = '';
188 $image['crop'] = '';
189
190 if ( array_key_exists( $size, $_wp_additional_image_sizes ) ) {
191 $image['width'] = $_wp_additional_image_sizes[ $size ]['width'];
192 $image['height'] = $_wp_additional_image_sizes[ $size ]['height'];
193 $image['crop'] = $_wp_additional_image_sizes[ $size ]['crop'];
194 }
195
196 $image_src = Images::fit_image_url( $image['src'], $image['width'], $image['height'] );
197
198 // Use the theme's crop setting rather than forcing to true.
199 $image_src = add_query_arg( 'crop', $image['crop'], $image_src );
200
201 return esc_url( $image_src );
202 }
203
204 return esc_url( $image_src );
205 }
206
207 }
208
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
224 }
225
226 if ( ! function_exists( 'jetpack_featured_images_post_class' ) ) {
227
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;
249 }
250 add_filter( 'post_class', 'jetpack_featured_images_post_class', 10, 3 );
251
252 }
253