get_the_post_thumbnail( int|WP_Post $post = null, string|int[] $size = ‘post-thumbnail’, string|array $attr =  ): string

Retrieves the post thumbnail.

Description

When a theme adds ‘post-thumbnail’ support, a special ‘post-thumbnail’ image size is registered, which differs from the ‘thumbnail’ image size managed via the Settings > Media screen.

When using the_post_thumbnail() or related functions, the ‘post-thumbnail’ image size is used by default, though a different size can be specified instead as needed.

Parameters

$postint|WP_Postoptional
Post ID or WP_Post object. Default is global $post.

Default:null

$sizestring|int[]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'.

Default:'post-thumbnail'

$attrstring|arrayoptional
Query string or array of attributes.

Default:''

Return

string The post thumbnail image tag.

More Information

If the required add_theme_support( 'post-thumbnails' ); in the current theme’s functions.php file is attached to a hook, it must be must be called before the init hook is fired. The init hook may be too late for some features. If attached to a hook, it must be after_setup_theme.

Source

function get_the_post_thumbnail( $post = null, $size = 'post-thumbnail', $attr = '' ) {
	$post = get_post( $post );

	if ( ! $post ) {
		return '';
	}

	$post_thumbnail_id = get_post_thumbnail_id( $post );

	/**
	 * Filters the post thumbnail size.
	 *
	 * @since 2.9.0
	 * @since 4.9.0 Added the `$post_id` parameter.
	 *
	 * @param string|int[] $size    Requested image size. Can be any registered image size name, or
	 *                              an array of width and height values in pixels (in that order).
	 * @param int          $post_id The post ID.
	 */
	$size = apply_filters( 'post_thumbnail_size', $size, $post->ID );

	if ( $post_thumbnail_id ) {

		/**
		 * Fires before fetching the post thumbnail HTML.
		 *
		 * Provides "just in time" filtering of all filters in wp_get_attachment_image().
		 *
		 * @since 2.9.0
		 *
		 * @param int          $post_id           The post ID.
		 * @param int          $post_thumbnail_id The post thumbnail ID.
		 * @param string|int[] $size              Requested image size. Can be any registered image size name, or
		 *                                        an array of width and height values in pixels (in that order).
		 */
		do_action( 'begin_fetch_post_thumbnail_html', $post->ID, $post_thumbnail_id, $size );

		if ( in_the_loop() ) {
			update_post_thumbnail_cache();
		}

		$html = wp_get_attachment_image( $post_thumbnail_id, $size, false, $attr );

		/**
		 * Fires after fetching the post thumbnail HTML.
		 *
		 * @since 2.9.0
		 *
		 * @param int          $post_id           The post ID.
		 * @param int          $post_thumbnail_id The post thumbnail ID.
		 * @param string|int[] $size              Requested image size. Can be any registered image size name, or
		 *                                        an array of width and height values in pixels (in that order).
		 */
		do_action( 'end_fetch_post_thumbnail_html', $post->ID, $post_thumbnail_id, $size );

	} else {
		$html = '';
	}

	/**
	 * Filters the post thumbnail HTML.
	 *
	 * @since 2.9.0
	 *
	 * @param string       $html              The post thumbnail HTML.
	 * @param int          $post_id           The post ID.
	 * @param int          $post_thumbnail_id The post thumbnail ID, or 0 if there isn't one.
	 * @param string|int[] $size              Requested image size. Can be any registered image size name, or
	 *                                        an array of width and height values in pixels (in that order).
	 * @param string|array $attr              Query string or array of attributes.
	 */
	return apply_filters( 'post_thumbnail_html', $html, $post->ID, $post_thumbnail_id, $size, $attr );
}

Hooks

do_action( ‘begin_fetch_post_thumbnail_html’, int $post_id, int $post_thumbnail_id, string|int[] $size )

Fires before fetching the post thumbnail HTML.

do_action( ‘end_fetch_post_thumbnail_html’, int $post_id, int $post_thumbnail_id, string|int[] $size )

Fires after fetching the post thumbnail HTML.

apply_filters( ‘post_thumbnail_html’, string $html, int $post_id, int $post_thumbnail_id, string|int[] $size, string|array $attr )

Filters the post thumbnail HTML.

apply_filters( ‘post_thumbnail_size’, string|int[] $size, int $post_id )

Filters the post thumbnail size.

Changelog

VersionDescription
4.4.0$post can be a post ID or WP_Post object.
2.9.0Introduced.

User Contributed Notes

  1. Skip to note 13 content

    Styling Post Thumbnails
    Post Thumbnails are given a class “wp-post-image”. They also get a class depending on the size of the thumbnail being displayed. You can style the output with these CSS selectors:

    img.wp-post-image
    	img.attachment-thumbnail
    	img.attachment-medium
    	img.attachment-large
    	img.attachment-full

    You can also give Post Thumbnails their own class:

    // Give the Post Thumbnail a class "alignleft".
    echo get_the_post_thumbnail( $post_id, 'thumbnail', array( 'class' => 'alignleft' ) );
  2. Skip to note 14 content

    Thumbnail Sizes
    The default image sizes of WordPress are “thumbnail”, “medium”, “large” and “full” (the size of the image you uploaded).
    These image sizes can be configured in the WordPress Administration Media panel under Settings > Media.
    Themes may also add “post-thumbnail”. This is how you can use these default sizes with get_the_post_thumbnail():

    // without parameter -> Post Thumbnail (as set by theme using set_post_thumbnail_size())
    get_the_post_thumbnail( $post_id );                   
    
    get_the_post_thumbnail( $post_id, 'thumbnail' );      // Thumbnail (Note: different to Post Thumbnail)
    get_the_post_thumbnail( $post_id, 'medium' );         // Medium resolution
    get_the_post_thumbnail( $post_id, 'large' );          // Large resolution
    get_the_post_thumbnail( $post_id, 'full' );           // Original resolution
    
    get_the_post_thumbnail( $post_id, array( 100, 100) ); // Other resolutions

    Register new image sizes for Post Thumbnails with: add_image_size().
    To set the default size for Post Thumbnails see: set_post_thumbnail_size().

  3. Skip to note 15 content

    Sample Usage

    <?php $pages = get_pages( array( 'child_of' => 1 ) ); ?> 
    <ul>
    	<?php foreach ( $pages as $page ) : ?>
    		<li>
    			<?php echo get_the_post_thumbnail( $page->ID, 'thumbnail' ); ?>
    			<h1><?php echo apply_filters( 'the_title', $page->post_title, $page->ID ); ?></h1>
    			<?php echo apply_filters( 'the_content', $page->post_content ); ?>
    		</li>
    	<?php endforeach; ?>
    </ul>
  4. Skip to note 16 content

    Post Thumbnail Linking to the Post Permalink

    This example shows the 5 latest Post Thumbnails linked to their Post permalink.

    $posts = get_posts( array( 'posts_per_page' => 5 ) );
    foreach ( $posts as $_post ) {
    	if ( has_post_thumbnail( $_post->ID ) ) {
    		echo '<a href="' . get_permalink( $_post->ID ) . '" title="' . esc_attr( $_post->post_title ) . '">';
    		echo get_the_post_thumbnail( $_post->ID, 'thumbnail' );
    		echo '</a>';
    	}
    }
  5. Skip to note 17 content

    Remove width and height attributes from the returning html

    get_the_post_thumbnail function produces html with img tag which includes width, height, src, class, alt and title attributes. The following code snippet is useful if someone wish to remove width and height attribute.

    This function provides 'post_thumbnail_html' filter before returning the html.

    add_filter( 'post_thumbnail_html', 'remove_thumbnail_width_height', 10, 5 );
    
    function remove_thumbnail_width_height( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
        $html = preg_replace( '/(width|height)=\"\d*\"\s/', "", $html );
        return $html;
    }
  6. Skip to note 18 content

    You can set more than just classes –
    If you want to optimize your SrcSet values you can do something like this

     echo get_the_post_thumbnail($post->ID, 'WhateverSize-Large', array('title' => 'WhateverTitle', 'sizes' => '(max-width: 320px) 288px, (max-width: 375px) 343px, (max-width: 425px) 393px, (max-width: 540px) 493px, (max-width: 768px) 320px, (max-width: 999px) 435px, 288px')); 

    etc.

    Normally in a grid, the srcset can go 100vw – which is sometimes way too big –
    this method lets you control that.

  7. Skip to note 19 content

    Post Thumbnail Linking to large Image Size
    This example links to the “large” Post Thumbnail image size and must be used within The Loop.

    if ( has_post_thumbnail() ) {
    	$large_image_url = wp_get_attachment_image_src( get_post_thumbnail_id( $post->ID ), 'large' );
    	if ( ! empty( $large_image_url[0] ) ) {
    		echo '<a href="' . esc_url( $large_image_url[0] ) . '" title="' . the_title_attribute( array( 'echo' => 0 ) ) . '">';
    		echo get_the_post_thumbnail( $post->ID, 'thumbnail' ); 
    		echo '</a>';
    	}
    }
  8. Skip to note 21 content

    When specifying a size e.g. get_the_post_thumbnail(null, [300, 300]), the image’s proportions are preserved and the width/height are maximum sizes. If the a dimension’s are smaller than specified, then the image returned will be the full size image.

    Example 1: Your image is 500px (width) by 1000px (height), the image returned will be 150px by 300px.

    Example 2: Your image is 100px by 100px the the image size returned will be 100px by 100px

  9. Skip to note 22 content

    Post thumbnails in a listing context are often linked to the content they’re representing. Instead of adding that every time, here is a filter you can add that will do it automatically based on an `$attr` passed in.

    /**
     * Link thumbnails to their posts based on attr
     *
     * @param $html
     * @param int $pid
     * @param int $post_thumbnail_id
     * @param int $size
     * @param array $attr
     *
     * @return string
     */
    
    function wpdev_filter_post_thumbnail_html( $html, $pid, $post_thumbnail_id, $size, $attr ) {
    
    	 if ( ! empty( $attr[ 'link_thumbnail' ] ) ) {
    
    		$html = sprintf(
    			'<a href="%s" title="%s" rel="nofollow">%s</a>',
    			get_permalink( $pid ),
    			esc_attr( get_the_title( $pid ) ),
    			$html
    		);
    	 }
    
    	return $html;
    }
    
    add_filter( 'post_thumbnail_html', 'wpdev_filter_post_thumbnail_html', 10, 5 );

    Just “add the above to your functions.php file” (there’s probably a better place for it) and use it like this in a template file:

     'my-custom-class', // classes
    		'link_thumbnail' => TRUE, // yes please link my thumbnail
    	]
    );
    ?>

You must log in before being able to contribute a note or feedback.