The specific bit I’m having difficulty with:
<?php the_title( $attachment_id ); ?>
-
the_title()doesn’t have a post ID parameter, and the first parameter is actually a text/markup to prepend to the title. And note that attachments like images in the WordPress media library have their own posts, where the type (i.e.post_type) isattachment. -
the_title()uses the global$postvariable which references the current post in the main (WordPress) query. (therefore the function doesn’t need a post ID as a parameter) -
the_title_attribute()also by default uses the same$postglobal mentioned above, so that explains the “when you’re viewing the image on a page or post, it adopts their title” in your comment. -
Both the above functions use
get_the_title()to get the post title, hence you could use that function to get the title of an image (or any other attachment in the media library) by the image/attachment ID.I.e. Use
echo get_the_title( $attachment_id )instead ofthe_title( $attachment_id ).
However, for use in an HTML attribute like the title attribute, you would want to use the_title_attribute() which sanitizes/escapes the title and works with any posts (regular Posts, Pages, attachments, etc.), but to make the function works for a specific post only, use the post argument and pass a post object, like so, which uses get_post() to get the post object:
<a href="<?php the_post_thumbnail_url( 'full' ); ?>"
title="<?php the_title_attribute( array( 'post' => get_post( $attachment_id ) ) );
?>"><?php the_post_thumbnail( 'full', array( 'itemprop' => 'image' ) ); ?></a>
But actually looking at the source, passing a post ID, i.e. the_title_attribute( array( 'post' => $attachment_id ) ), should also work because the value is only used with get_the_title() which accepts either a post ID or object.
And note that I intentionally used the_post_thumbnail_url() in the above code.. because that’s a simpler way to display/echo the post thumbnail’s URL, for any image sizes like full, thumbnail, custom, etc. 🙂