wp/wp-includes/post-thumbnail-template.php
changeset 22 8c2e4d02f4ef
parent 21 48c4eec2b7e6
--- a/wp/wp-includes/post-thumbnail-template.php	Fri Sep 05 18:40:08 2025 +0200
+++ b/wp/wp-includes/post-thumbnail-template.php	Fri Sep 05 18:52:52 2025 +0200
@@ -19,7 +19,7 @@
  * @since 2.9.0
  * @since 4.4.0 `$post` can be a post ID or WP_Post object.
  *
- * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
+ * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`.
  * @return bool Whether the post has an image attached.
  */
 function has_post_thumbnail( $post = null ) {
@@ -46,7 +46,7 @@
  * @since 5.5.0 The return value for a non-existing post
  *              was changed to false instead of an empty string.
  *
- * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
+ * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`.
  * @return int|false Post thumbnail ID (which can be 0 if the thumbnail is not set),
  *                   or false if the post does not exist.
  */
@@ -99,7 +99,7 @@
  *
  * @global WP_Query $wp_query WordPress Query object.
  *
- * @param WP_Query $wp_query Optional. A WP_Query instance. Defaults to the $wp_query global.
+ * @param WP_Query|null $wp_query Optional. A WP_Query instance. Defaults to the $wp_query global.
  */
 function update_post_thumbnail_cache( $wp_query = null ) {
 	if ( ! $wp_query ) {
@@ -112,8 +112,25 @@
 
 	$thumb_ids = array();
 
+	/*
+	 * $wp_query may contain an array of post objects or post IDs.
+	 *
+	 * This ensures the cache is primed for all post objects to avoid
+	 * `get_post()` calls in `get_the_post_thumbnail()` triggering an
+	 * additional database call for each post.
+	 */
+	$parent_post_ids = array();
 	foreach ( $wp_query->posts as $post ) {
-		$id = get_post_thumbnail_id( $post->ID );
+		if ( $post instanceof WP_Post ) {
+			$parent_post_ids[] = $post->ID;
+		} elseif ( is_int( $post ) ) {
+			$parent_post_ids[] = $post;
+		}
+	}
+	_prime_post_caches( $parent_post_ids, false, true );
+
+	foreach ( $wp_query->posts as $post ) {
+		$id = get_post_thumbnail_id( $post );
 		if ( $id ) {
 			$thumb_ids[] = $id;
 		}
@@ -139,10 +156,10 @@
  * @since 2.9.0
  * @since 4.4.0 `$post` can be a post ID or WP_Post object.
  *
- * @param int|WP_Post  $post Optional. Post ID or WP_Post object.  Default is global `$post`.
- * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array of
- *                           width and height values in pixels (in that order). Default 'post-thumbnail'.
- * @param string|array $attr Optional. Query string or array of attributes. Default empty.
+ * @param int|WP_Post|null $post Optional. Post ID or WP_Post object.  Default is global `$post`.
+ * @param string|int[]     $size Optional. Image size. Accepts any registered image size name, or an array of
+ *                               width and height values in pixels (in that order). Default 'post-thumbnail'.
+ * @param string|array     $attr Optional. Query string or array of attributes. Default empty.
  * @return string The post thumbnail image tag.
  */
 function get_the_post_thumbnail( $post = null, $size = 'post-thumbnail', $attr = '' ) {
@@ -224,9 +241,9 @@
  *
  * @since 4.4.0
  *
- * @param int|WP_Post  $post Optional. Post ID or WP_Post object.  Default is global `$post`.
- * @param string|int[] $size Optional. Registered image size to retrieve the source for or a flat array
- *                           of height and width dimensions. Default 'post-thumbnail'.
+ * @param int|WP_Post|null $post Optional. Post ID or WP_Post object.  Default is global `$post`.
+ * @param string|int[]     $size Optional. Registered image size to retrieve the source for or a flat array
+ *                               of height and width dimensions. Default 'post-thumbnail'.
  * @return string|false Post thumbnail URL or false if no image is available. If `$size` does not match
  *                      any registered image size, the original image URL will be returned.
  */
@@ -274,7 +291,7 @@
  *
  * @since 4.6.0
  *
- * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
+ * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`.
  * @return string Post thumbnail caption.
  */
 function get_the_post_thumbnail_caption( $post = null ) {
@@ -298,7 +315,7 @@
  *
  * @since 4.6.0
  *
- * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`.
+ * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`.
  */
 function the_post_thumbnail_caption( $post = null ) {
 	/**