PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 8.0.3
Jetpack – WP Security, Backup, Speed, & Growth v8.0.3
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.opengraph.php
jetpack Last commit date
3rd-party 6 years ago _inc 6 years ago bin 6 years ago css 6 years ago extensions 1 year ago images 6 years ago json-endpoints 3 years ago languages 6 years ago modules 1 year ago sal 6 years ago src 6 years ago vendor 6 years ago views 7 years ago .svnignore 12 years ago CODE-OF-CONDUCT.md 9 years ago changelog.txt 6 years ago class.frame-nonce-preview.php 6 years ago class.jetpack-admin.php 6 years ago class.jetpack-affiliate.php 6 years ago class.jetpack-autoupdate.php 6 years ago class.jetpack-bbpress-json-api-compat.php 6 years ago class.jetpack-cli.php 6 years ago class.jetpack-client-server.php 6 years ago class.jetpack-connection-banner.php 6 years ago class.jetpack-data.php 6 years ago class.jetpack-debugger.php 7 years ago class.jetpack-error.php 10 years ago class.jetpack-gutenberg.php 6 years ago class.jetpack-heartbeat.php 6 years ago class.jetpack-idc.php 6 years ago class.jetpack-ixr-client.php 6 years ago class.jetpack-modules-list-table.php 6 years ago class.jetpack-network-sites-list-table.php 6 years ago class.jetpack-network.php 6 years ago class.jetpack-plan.php 6 years ago class.jetpack-post-images.php 6 years ago class.jetpack-twitter-cards.php 6 years ago class.jetpack-user-agent.php 6 years ago class.jetpack-xmlrpc-server.php 6 years ago class.jetpack.php 6 years ago class.json-api-endpoints.php 3 years ago class.json-api.php 6 years ago class.photon.php 6 years ago composer.json 6 years ago functions.compat.php 6 years ago functions.gallery.php 6 years ago functions.global.php 6 years ago functions.opengraph.php 6 years ago functions.photon.php 6 years ago jest.config.js 6 years ago jetpack.php 1 year ago json-api-config.php 10 years ago json-endpoints.php 7 years ago load-jetpack.php 6 years ago locales.php 7 years ago readme.txt 1 year ago require-lib.php 6 years ago uninstall.php 6 years ago wpml-config.xml 10 years ago
functions.opengraph.php
453 lines
1 <?php
2 /**
3 * Open Graph Tags
4 *
5 * Add Open Graph tags so that Facebook (and any other service that supports them)
6 * can crawl the site better and we provide a better sharing experience.
7 *
8 * @link https://ogp.me/
9 * @link https://developers.facebook.com/docs/opengraph/
10 *
11 * @package Jetpack
12 */
13
14 add_action( 'wp_head', 'jetpack_og_tags' );
15 add_action( 'amp_story_head', 'jetpack_og_tags' );
16
17 /**
18 * Outputs Open Graph tags generated by Jetpack.
19 */
20 function jetpack_og_tags() {
21 /**
22 * Allow Jetpack to output Open Graph Meta Tags.
23 *
24 * @module sharedaddy, publicize
25 *
26 * @since 2.0.0
27 * @deprecated 2.0.3 Duplicative filter. Use `jetpack_enable_open_graph`.
28 *
29 * @param bool true Should Jetpack's Open Graph Meta Tags be enabled. Default to true.
30 */
31 if ( false === apply_filters( 'jetpack_enable_opengraph', true ) ) {
32 _deprecated_function( 'jetpack_enable_opengraph', '2.0.3', 'jetpack_enable_open_graph' );
33 return;
34 }
35
36 $is_amp_response = ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() );
37
38 // Disable the widont filter on WP.com to avoid stray &nbsps.
39 $disable_widont = remove_filter( 'the_title', 'widont' );
40
41 $og_output = "\n";
42 if ( ! $is_amp_response ) { // Because AMP optimizes the order or the nodes in the head.
43 $og_output .= "<!-- Jetpack Open Graph Tags -->\n";
44 }
45 $tags = array();
46
47 /**
48 * Filter the minimum width of the images used in Jetpack Open Graph Meta Tags.
49 *
50 * @module sharedaddy, publicize
51 *
52 * @since 2.0.0
53 *
54 * @param int 200 Minimum image width used in Jetpack Open Graph Meta Tags.
55 */
56 $image_width = absint( apply_filters( 'jetpack_open_graph_image_width', 200 ) );
57 /**
58 * Filter the minimum height of the images used in Jetpack Open Graph Meta Tags.
59 *
60 * @module sharedaddy, publicize
61 *
62 * @since 2.0.0
63 *
64 * @param int 200 Minimum image height used in Jetpack Open Graph Meta Tags.
65 */
66 $image_height = absint( apply_filters( 'jetpack_open_graph_image_height', 200 ) );
67 $description_length = 197;
68
69 if ( is_home() || is_front_page() ) {
70 $site_type = Jetpack_Options::get_option_and_ensure_autoload( 'open_graph_protocol_site_type', '' );
71 $tags['og:type'] = ! empty( $site_type ) ? $site_type : 'website';
72 $tags['og:title'] = get_bloginfo( 'name' );
73 $tags['og:description'] = get_bloginfo( 'description' );
74
75 $front_page_id = get_option( 'page_for_posts' );
76 if ( 'page' === get_option( 'show_on_front' ) && $front_page_id && is_home() ) {
77 $tags['og:url'] = get_permalink( $front_page_id );
78 } else {
79 $tags['og:url'] = home_url( '/' );
80 }
81
82 // Associate a blog's root path with one or more Facebook accounts.
83 $facebook_admins = Jetpack_Options::get_option_and_ensure_autoload( 'facebook_admins', array() );
84 if ( ! empty( $facebook_admins ) ) {
85 $tags['fb:admins'] = $facebook_admins;
86 }
87 } elseif ( is_author() ) {
88 $tags['og:type'] = 'profile';
89
90 $author = get_queried_object();
91
92 if ( is_a( $author, 'WP_User' ) ) {
93 $tags['og:title'] = $author->display_name;
94 if ( ! empty( $author->user_url ) ) {
95 $tags['og:url'] = $author->user_url;
96 } else {
97 $tags['og:url'] = get_author_posts_url( $author->ID );
98 }
99 $tags['og:description'] = $author->description;
100 $tags['profile:first_name'] = get_the_author_meta( 'first_name', $author->ID );
101 $tags['profile:last_name'] = get_the_author_meta( 'last_name', $author->ID );
102 }
103 } elseif ( is_archive() ) {
104 $tags['og:type'] = 'website';
105 $tags['og:title'] = wp_get_document_title();
106
107 $archive = get_queried_object();
108 if ( ! empty( $archive ) ) {
109 if ( is_category() || is_tag() || is_tax() ) {
110 $tags['og:url'] = get_term_link( $archive->term_id, $archive->taxonomy );
111 $tags['og:description'] = $archive->description;
112 } elseif ( is_post_type_archive() ) {
113 $tags['og:url'] = get_post_type_archive_link( $archive->name );
114 $tags['og:description'] = $archive->description;
115 }
116 }
117 } elseif ( is_singular() ) {
118 global $post;
119 $data = $post; // so that we don't accidentally explode the global.
120
121 $tags['og:type'] = 'article';
122 if ( empty( $data->post_title ) ) {
123 $tags['og:title'] = ' ';
124 } else {
125 /** This filter is documented in core/src/wp-includes/post-template.php */
126 $tags['og:title'] = wp_kses( apply_filters( 'the_title', $data->post_title, $data->ID ), array() );
127 }
128
129 $tags['og:url'] = get_permalink( $data->ID );
130 if ( ! post_password_required() ) {
131 if ( ! empty( $data->post_excerpt ) ) {
132 $tags['og:description'] = preg_replace( '@https?://[\S]+@', '', strip_shortcodes( wp_kses( $data->post_excerpt, array() ) ) );
133 } else {
134 $exploded_content_on_more_tag = explode( '<!--more-->', $data->post_content );
135 $tags['og:description'] = wp_trim_words( preg_replace( '@https?://[\S]+@', '', strip_shortcodes( wp_kses( $exploded_content_on_more_tag[0], array() ) ) ) );
136 }
137 }
138 if ( empty( $tags['og:description'] ) ) {
139 /**
140 * Filter the fallback `og:description` used when no excerpt information is provided.
141 *
142 * @module sharedaddy, publicize
143 *
144 * @since 3.9.0
145 *
146 * @param string $var Fallback og:description. Default is translated `Visit the post for more'.
147 * @param object $data Post object for the current post.
148 */
149 $tags['og:description'] = apply_filters( 'jetpack_open_graph_fallback_description', __( 'Visit the post for more.', 'jetpack' ), $data );
150 } else {
151 // Intentionally not using a filter to prevent pollution. @see https://github.com/Automattic/jetpack/pull/2899#issuecomment-151957382 .
152 $tags['og:description'] = wp_kses( trim( convert_chars( wptexturize( $tags['og:description'] ) ) ), array() );
153 }
154
155 $tags['article:published_time'] = date( 'c', strtotime( $data->post_date_gmt ) );
156 $tags['article:modified_time'] = date( 'c', strtotime( $data->post_modified_gmt ) );
157 if ( post_type_supports( get_post_type( $data ), 'author' ) && isset( $data->post_author ) ) {
158 $publicize_facebook_user = get_post_meta( $data->ID, '_publicize_facebook_user', true );
159 if ( ! empty( $publicize_facebook_user ) ) {
160 $tags['article:author'] = esc_url( $publicize_facebook_user );
161 }
162 }
163 }
164
165 /**
166 * Allow plugins to inject additional template-specific Open Graph tags.
167 *
168 * @module sharedaddy, publicize
169 *
170 * @since 3.0.0
171 *
172 * @param array $tags Array of Open Graph Meta tags.
173 * @param array $args Array of image size parameters.
174 */
175 $tags = apply_filters( 'jetpack_open_graph_base_tags', $tags, compact( 'image_width', 'image_height' ) );
176
177 // Re-enable widont if we had disabled it.
178 if ( $disable_widont ) {
179 add_filter( 'the_title', 'widont' );
180 }
181
182 /**
183 * Do not return any Open Graph Meta tags if we don't have any info about a post.
184 *
185 * @module sharedaddy, publicize
186 *
187 * @since 3.0.0
188 *
189 * @param bool true Do not return any Open Graph Meta tags if we don't have any info about a post.
190 */
191 if ( empty( $tags ) && apply_filters( 'jetpack_open_graph_return_if_empty', true ) ) {
192 return;
193 }
194
195 $tags['og:site_name'] = get_bloginfo( 'name' );
196
197 // Get image info and build tags.
198 if ( ! post_password_required() ) {
199 $image_info = jetpack_og_get_image( $image_width, $image_height );
200 $tags['og:image'] = $image_info['src'];
201
202 if ( ! empty( $image_info['width'] ) ) {
203 $tags['og:image:width'] = (int) $image_info['width'];
204 }
205 if ( ! empty( $image_info['height'] ) ) {
206 $tags['og:image:height'] = (int) $image_info['height'];
207 }
208 if ( ! empty( $image_info['alt_text'] ) ) {
209 $tags['og:image:alt'] = esc_attr( $image_info['alt_text'] );
210 }
211 }
212
213 // Facebook whines if you give it an empty title.
214 if ( empty( $tags['og:title'] ) ) {
215 $tags['og:title'] = __( '(no title)', 'jetpack' );
216 }
217
218 // Shorten the description if it's too long.
219 if ( isset( $tags['og:description'] ) ) {
220 $tags['og:description'] = strlen( $tags['og:description'] ) > $description_length ? mb_substr( $tags['og:description'], 0, $description_length ) . '' : $tags['og:description'];
221 }
222
223 // Try to add OG locale tag if the WP->FB data mapping exists.
224 if ( defined( 'JETPACK__GLOTPRESS_LOCALES_PATH' ) && file_exists( JETPACK__GLOTPRESS_LOCALES_PATH ) ) {
225 require_once JETPACK__GLOTPRESS_LOCALES_PATH;
226 $_locale = get_locale();
227
228 // We have to account for w.org vs WP.com locale divergence.
229 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
230 $gp_locale = GP_Locales::by_field( 'slug', $_locale );
231 } else {
232 $gp_locale = GP_Locales::by_field( 'wp_locale', $_locale );
233 }
234 }
235
236 if ( isset( $gp_locale->facebook_locale ) && ! empty( $gp_locale->facebook_locale ) ) {
237 $tags['og:locale'] = $gp_locale->facebook_locale;
238 }
239
240 /**
241 * Allow the addition of additional Open Graph Meta tags, or modify the existing tags.
242 *
243 * @module sharedaddy, publicize
244 *
245 * @since 2.0.0
246 *
247 * @param array $tags Array of Open Graph Meta tags.
248 * @param array $args Array of image size parameters.
249 */
250 $tags = apply_filters( 'jetpack_open_graph_tags', $tags, compact( 'image_width', 'image_height' ) );
251
252 // secure_urls need to go right after each og:image to work properly so we will abstract them here.
253 $tags['og:image:secure_url'] = ( empty( $tags['og:image:secure_url'] ) ) ? '' : $tags['og:image:secure_url'];
254 $secure = $tags['og:image:secure_url'];
255 unset( $tags['og:image:secure_url'] );
256 $secure_image_num = 0;
257
258 foreach ( (array) $tags as $tag_property => $tag_content ) {
259 // to accommodate multiple images.
260 $tag_content = (array) $tag_content;
261 $tag_content = array_unique( $tag_content );
262
263 foreach ( $tag_content as $tag_content_single ) {
264 if ( empty( $tag_content_single ) ) {
265 continue; // Don't ever output empty tags.
266 }
267 $og_tag = sprintf( '<meta property="%s" content="%s" />', esc_attr( $tag_property ), esc_attr( $tag_content_single ) );
268 /**
269 * Filter the HTML Output of each Open Graph Meta tag.
270 *
271 * @module sharedaddy, publicize
272 *
273 * @since 2.0.0
274 *
275 * @param string $og_tag HTML HTML Output of each Open Graph Meta tag.
276 */
277 $og_output .= apply_filters( 'jetpack_open_graph_output', $og_tag );
278 $og_output .= "\n";
279
280 if ( 'og:image' === $tag_property ) {
281 if ( is_array( $secure ) && ! empty( $secure[ $secure_image_num ] ) ) {
282 $og_tag = sprintf( '<meta property="og:image:secure_url" content="%s" />', esc_url( $secure[ $secure_image_num ] ) );
283 /** This filter is documented in functions.opengraph.php */
284 $og_output .= apply_filters( 'jetpack_open_graph_output', $og_tag );
285 $og_output .= "\n";
286 } elseif ( ! is_array( $secure ) && ! empty( $secure ) ) {
287 $og_tag = sprintf( '<meta property="og:image:secure_url" content="%s" />', esc_url( $secure ) );
288 /** This filter is documented in functions.opengraph.php */
289 $og_output .= apply_filters( 'jetpack_open_graph_output', $og_tag );
290 $og_output .= "\n";
291 }
292 $secure_image_num++;
293 }
294 }
295 }
296
297 if ( ! $is_amp_response ) { // Because AMP optimizes the order or the nodes in the head.
298 $og_output .= "\n<!-- End Jetpack Open Graph Tags -->";
299 }
300 $og_output .= "\n";
301 // This is trusted output or added by a filter.
302 echo $og_output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
303 }
304
305 /**
306 * Returns an image used in social shares.
307 *
308 * @since 2.0.0
309 *
310 * @param int $width Minimum width for the image. Default is 200 based on Facebook's requirement.
311 * @param int $height Minimum height for the image. Default is 200 based on Facebook's requirement.
312 * @param null $deprecated Deprecated.
313 *
314 * @return array The source ('src'), 'width', and 'height' of the image.
315 */
316 function jetpack_og_get_image( $width = 200, $height = 200, $deprecated = null ) {
317 if ( ! empty( $deprecated ) ) {
318 _deprecated_argument( __FUNCTION__, '6.6.0' );
319 }
320 $image = array();
321
322 if ( is_singular() && ! is_home() ) {
323 // Grab obvious image if post is an attachment page for an image.
324 if ( is_attachment( get_the_ID() ) && 'image' === substr( get_post_mime_type(), 0, 5 ) ) {
325 $image['src'] = wp_get_attachment_url( get_the_ID() );
326 }
327
328 // Attempt to find something good for this post using our generalized PostImages code.
329 if ( empty( $image ) && class_exists( 'Jetpack_PostImages' ) ) {
330 $post_images = Jetpack_PostImages::get_images(
331 get_the_ID(),
332 array(
333 'width' => $width,
334 'height' => $height,
335 )
336 );
337 if ( $post_images && ! is_wp_error( $post_images ) ) {
338 foreach ( (array) $post_images as $post_image ) {
339 $image['src'] = $post_image['src'];
340 if ( isset( $post_image['src_width'], $post_image['src_height'] ) ) {
341 $image['width'] = $post_image['src_width'];
342 $image['height'] = $post_image['src_height'];
343 }
344 if ( ! empty( $post_image['alt_text'] ) ) {
345 $image['alt_text'] = $post_image['alt_text'];
346 }
347 }
348 }
349 }
350 } elseif ( is_author() ) {
351 $author = get_queried_object();
352 if ( is_a( $author, 'WP_User' ) ) {
353 $image['src'] = get_avatar_url(
354 $author->user_email,
355 array(
356 'size' => $width,
357 )
358 );
359 }
360 }
361
362 // First fall back, blavatar.
363 if ( empty( $image ) && function_exists( 'blavatar_domain' ) ) {
364 $blavatar_domain = blavatar_domain( site_url() );
365 if ( blavatar_exists( $blavatar_domain ) ) {
366 $image['src'] = blavatar_url( $blavatar_domain, 'img', $width, false, true );
367 $image['width'] = $width;
368 $image['height'] = $height;
369 }
370 }
371
372 // Second fall back, Site Logo.
373 if ( empty( $image ) && ( function_exists( 'jetpack_has_site_logo' ) && jetpack_has_site_logo() ) ) {
374 $image_id = jetpack_get_site_logo( 'id' );
375 $logo = wp_get_attachment_image_src( $image_id, 'full' );
376 if (
377 isset( $logo[0], $logo[1], $logo[2] )
378 && ( _jetpack_og_get_image_validate_size( $logo[1], $logo[2], $width, $height ) )
379 ) {
380 $image['src'] = $logo[0];
381 $image['width'] = $logo[1];
382 $image['height'] = $logo[2];
383 }
384 }
385
386 // Third fall back, Core Site Icon, if valid in size.
387 if ( empty( $image ) && has_site_icon() ) {
388 $image_id = get_option( 'site_icon' );
389 $icon = wp_get_attachment_image_src( $image_id, 'full' );
390 if (
391 isset( $icon[0], $icon[1], $icon[2] )
392 && ( _jetpack_og_get_image_validate_size( $icon[1], $icon[2], $width, $height ) )
393 ) {
394 $image['src'] = $icon[0];
395 $image['width'] = $icon[1];
396 $image['height'] = $icon[2];
397 }
398 }
399
400 // Final fall back, blank image.
401 if ( empty( $image ) ) {
402 /**
403 * Filter the default Open Graph Image tag, used when no Image can be found in a post.
404 *
405 * @since 3.0.0
406 *
407 * @param string $str Default Image URL.
408 */
409 $image['src'] = apply_filters( 'jetpack_open_graph_image_default', 'https://s0.wp.com/i/blank.jpg' );
410 }
411
412 return $image;
413 }
414
415
416 /**
417 * Validate the width and height against required width and height
418 *
419 * @param int $width Width of the image.
420 * @param int $height Height of the image.
421 * @param int $req_width Required width to pass validation.
422 * @param int $req_height Required height to pass validation.
423 *
424 * @return bool - True if the image passed the required size validation
425 */
426 function _jetpack_og_get_image_validate_size( $width, $height, $req_width, $req_height ) {
427 if ( ! $width || ! $height ) {
428 return false;
429 }
430
431 $valid_width = ( $width >= $req_width );
432 $valid_height = ( $height >= $req_height );
433 $is_image_acceptable = $valid_width && $valid_height;
434
435 return $is_image_acceptable;
436 }
437
438 /**
439 * Gets a gravatar URL of the specified size.
440 *
441 * @param string $email E-mail address to get gravatar for.
442 * @param int $width Size of returned gravatar.
443 * @return array|bool|mixed|string
444 */
445 function jetpack_og_get_image_gravatar( $email, $width ) {
446 return get_avatar_url(
447 $email,
448 array(
449 'size' => $width,
450 )
451 );
452 }
453