add the post as canonical for attachment page wordpress

the attachment page should have canonical added to the main post

on attachment page (image.php) I currently have (automatically added by All in One Seo Pack):

link rel="canonical" href="https://example.com/main-post/image-name" /

And I want to change it to point to the post (where this image is attached)

link rel="canonical" href="https://example.com/main-post" /

You can ignore All in One Seo Pack if that is difficutl to change, and maybe simple provide a way to add the canonical to the main post.

Topic rel-canonical attachments images plugin-all-in-one-seo seo Wordpress

Category Web


Here's an (untested) example where we inject into the header tag on attachment's pages, the canonical link of the attached post:

add_action( 'wp_head', 'wpse_attachment_parent_canonical' );

function wpse_attachment_parent_canonical()
{
    // Only target attachment's pages
    if( ! is_attachment() )
        return;

    $object = get_queried_object();

    // Make sure we're dealing with a WP_Post object
    if ( ! is_a( $object, '\WP_Post' ) )
        return;

    // Only target attachments that are attached to posts
    if( 0 == $object->post_parent )
        return;

    // Output canonical link
    printf(
        '<link rel="canonical" href="%s" />' . PHP_EOL,
        esc_url( get_permalink( $object->post_parent ) )
    );
} 

Note that we can't use the get_canonical_url filter here to adjust the canonical url, as it's only applied to objects with publish post status. Attachments have inherit post status.

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.