PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.3-beta
16.3 16.3-beta 16.3-a.5 16.3-a.7 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 All 508 releases
← All changes | jetpack_vendor/automattic/jetpack-post-list/src/class-post-thumbnail.php +112 -0 16.2-beta → 16.3-beta View file →
@@ -1,0 +1,112 @@
1 +<?php
2 +/**
3 + * This file contains the Post_Thumbnail class used for finding a suitable thumbnail for a post.
4 + *
5 + * @package automattic/jetpack-post-list
6 + */
7 +
8 +namespace Automattic\Jetpack\Post_List;
9 +
10 +/**
11 + * The Post_Thumbnail class contains methods to find and return a suitable thumbnail for a post.
12 + */
13 +class Post_Thumbnail {
14 + /**
15 + * Returns the featured image thumbnail or if no featured image is set, return the first image in the post. If
16 + * neither exists returns the image array with null values.
17 + *
18 + * @param object $post The current post.
19 + * @return array|null The thumbnail image id and URLs
20 + */
21 + public static function get_post_thumbnail( $post ) {
22 + $image_id = null;
23 + $image_url = null;
24 + $image_alt = null;
25 + $image_thumb = false;
26 +
27 + $post_id = $post->ID;
28 +
29 + // If a featured image exists for the post, use that thumbnail.
30 + if ( has_post_thumbnail( $post_id ) ) {
31 + $image_id = get_post_thumbnail_id( $post_id );
32 + $image_url = get_the_post_thumbnail_url( $post_id );
33 + $image_thumb = get_the_post_thumbnail_url( $post_id, array( 50, 50 ) );
34 + $image_alt = get_post_meta( $image_id, '_wp_attachment_image_alt', true );
35 + } else {
36 + // If a featured image does not exist look for the first "media library" hosted image on the post.
37 + $attachment_id = self::get_first_image_id_from_post_content( $post->post_content );
38 +
39 + if ( null !== $attachment_id ) {
40 + $image_id = $attachment_id;
41 + $image_url = wp_get_attachment_image_url( $attachment_id, 'full-size' );
42 + $image_thumb = wp_get_attachment_image_url( $attachment_id, array( 50, 50 ) );
43 + $image_alt = get_post_meta( $attachment_id, '_wp_attachment_image_alt', true );
44 + }
45 + }
46 +
47 + // If no thumbnail is found return null.
48 + if ( false === $image_thumb ) {
49 + return null;
50 + }
51 +
52 + // Escape values just in case.
53 + return array(
54 + 'id' => esc_attr( $image_id ),
55 + 'url' => esc_url( $image_url ),
56 + 'thumb' => esc_url( $image_thumb ),
57 + 'alt' => esc_attr( $image_alt ),
58 + );
59 + }
60 +
61 + /**
62 + * Looks for the first image in the post content containing a class value of 'wp-image-{$attachment_id}' and
63 + * returns the $attachment_id from that class value.
64 + *
65 + * @param string $post_content The current post's HTML content.
66 + * @return int The image attachment id.
67 + */
68 + public static function get_first_image_id_from_post_content( $post_content ) {
69 + // If $post_content does not contain a value of substance, return null right away and avoid trying to parse it.
70 + if ( empty( $post_content ) ) {
71 + return null;
72 + }
73 +
74 + $attachment_id = null;
75 + $dom = new \DOMDocument();
76 +
77 + // libxml_use_internal_errors(true) silences PHP warnings and errors from malformed HTML in loadHTML().
78 + // you can consult libxml_get_last_error() or libxml_get_errors() to check for errors if needed.
79 + libxml_use_internal_errors( true );
80 + $dom->loadHTML( $post_content );
81 +
82 + // Media library images have a class attribute value containing 'wp-image-{$attachment_id}'.
83 + // Use DomXPath to parse the post content and get the first img tag containing 'wp-image-' as a class value.
84 + $class_name = 'wp-image-';
85 + $dom_x_path = new \DomXPath( $dom );
86 + $nodes = $dom_x_path->query( "//img[contains(@class, '$class_name')]/@class" );
87 +
88 + if ( $nodes->length > 0 ) {
89 + // Get the class attribute value of the 1st image node (aka index 0).
90 + $class_value = $nodes[0]->value;
91 +
92 + // Ignore all class attribute values except 'wp-image{$attachment_id}'.
93 + // Regex english translation: Look for a word \b, that does not start or end with a hyphen (?!-), that
94 + // starts with 'wp-image-', and ends with a number of any length \d+.
95 + $class_name_found = preg_match( '/\b(?!-)wp-image-\d+(?!-)\b/', $class_value, $class_value );
96 +
97 + if ( $class_name_found ) {
98 + // Get the $attachment_id from the end of the class name value.
99 + $attachment_id = str_replace( $class_name, '', $class_value[0] );
100 +
101 + // If the ID we found is numeric, cast it as an int. Else, make it null.
102 + if ( is_numeric( $attachment_id ) ) {
103 + $attachment_id = (int) $attachment_id;
104 + } else {
105 + $attachment_id = null;
106 + }
107 + }
108 + }
109 +
110 + return $attachment_id;
111 + }
112 +}