_fix_attachment_links

The timeline below displays how wordpress function _fix_attachment_links has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.3

//
// Private.
//
/**
 * Replaces hrefs of attachment anchors with up-to-date permalinks.
 *
 * @since 2.3.0
 * @access private
 *
 * @param int|object $post Post ID or post object.
 * @return void|int|WP_Error Void if nothing fixed. 0 or WP_Error on update failure. The post ID on update success.
 */
function _fix_attachment_links($post)
{
    $post = get_post($post, ARRAY_A);
    $content = $post['post_content'];
    // Don't run if no pretty permalinks or post is not published, scheduled, or privately published.
    if (!get_option('permalink_structure') || !in_array($post['post_status'], array('publish', 'future', 'private'), true)) {
        return;
    }
    // Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero).
    if (!strpos($content, '?attachment_id=') || !preg_match_all('/<a ([^>]+)>[\s\S]+?<\/a>/', $content, $link_matches)) {
        return;
    }
    $site_url = get_bloginfo('url');
    $site_url = substr($site_url, (int) strpos($site_url, '://'));
    // Remove the http(s).
    $replace = '';
    foreach ($link_matches[1] as $key => $value) {
        if (!strpos($value, '?attachment_id=') || !strpos($value, 'wp-att-') || !preg_match('/href=(["\'])[^"\']*\?attachment_id=(\d+)[^"\']*\1/', $value, $url_match) || !preg_match('/rel=["\'][^"\']*wp-att-(\d+)/', $value, $rel_match)) {
            continue;
        }
        $quote = $url_match[1];
        // The quote (single or double).
        $url_id = (int) $url_match[2];
        $rel_id = (int) $rel_match[1];
        if (!$url_id || !$rel_id || $url_id != $rel_id || !str_contains($url_match[0], $site_url)) {
            continue;
        }
        $link = $link_matches[0][$key];
        $replace = str_replace($url_match[0], 'href=' . $quote . get_attachment_link($url_id) . $quote, $link);
        $content = str_replace($link, $replace, $content);
    }
    if ($replace) {
        $post['post_content'] = $content;
        // Escape data pulled from DB.
        $post = add_magic_quotes($post);
        return wp_update_post($post);
    }
}

WordPress Version: 6.1

//
// Private.
//
/**
 * Replaces hrefs of attachment anchors with up-to-date permalinks.
 *
 * @since 2.3.0
 * @access private
 *
 * @param int|object $post Post ID or post object.
 * @return void|int|WP_Error Void if nothing fixed. 0 or WP_Error on update failure. The post ID on update success.
 */
function _fix_attachment_links($post)
{
    $post = get_post($post, ARRAY_A);
    $content = $post['post_content'];
    // Don't run if no pretty permalinks or post is not published, scheduled, or privately published.
    if (!get_option('permalink_structure') || !in_array($post['post_status'], array('publish', 'future', 'private'), true)) {
        return;
    }
    // Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero).
    if (!strpos($content, '?attachment_id=') || !preg_match_all('/<a ([^>]+)>[\s\S]+?<\/a>/', $content, $link_matches)) {
        return;
    }
    $site_url = get_bloginfo('url');
    $site_url = substr($site_url, (int) strpos($site_url, '://'));
    // Remove the http(s).
    $replace = '';
    foreach ($link_matches[1] as $key => $value) {
        if (!strpos($value, '?attachment_id=') || !strpos($value, 'wp-att-') || !preg_match('/href=(["\'])[^"\']*\?attachment_id=(\d+)[^"\']*\1/', $value, $url_match) || !preg_match('/rel=["\'][^"\']*wp-att-(\d+)/', $value, $rel_match)) {
            continue;
        }
        $quote = $url_match[1];
        // The quote (single or double).
        $url_id = (int) $url_match[2];
        $rel_id = (int) $rel_match[1];
        if (!$url_id || !$rel_id || $url_id != $rel_id || strpos($url_match[0], $site_url) === false) {
            continue;
        }
        $link = $link_matches[0][$key];
        $replace = str_replace($url_match[0], 'href=' . $quote . get_attachment_link($url_id) . $quote, $link);
        $content = str_replace($link, $replace, $content);
    }
    if ($replace) {
        $post['post_content'] = $content;
        // Escape data pulled from DB.
        $post = add_magic_quotes($post);
        return wp_update_post($post);
    }
}

WordPress Version: 5.5

//
// Private.
//
/**
 * Replace hrefs of attachment anchors with up-to-date permalinks.
 *
 * @since 2.3.0
 * @access private
 *
 * @param int|object $post Post ID or post object.
 * @return void|int|WP_Error Void if nothing fixed. 0 or WP_Error on update failure. The post ID on update success.
 */
function _fix_attachment_links($post)
{
    $post = get_post($post, ARRAY_A);
    $content = $post['post_content'];
    // Don't run if no pretty permalinks or post is not published, scheduled, or privately published.
    if (!get_option('permalink_structure') || !in_array($post['post_status'], array('publish', 'future', 'private'), true)) {
        return;
    }
    // Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero).
    if (!strpos($content, '?attachment_id=') || !preg_match_all('/<a ([^>]+)>[\s\S]+?<\/a>/', $content, $link_matches)) {
        return;
    }
    $site_url = get_bloginfo('url');
    $site_url = substr($site_url, (int) strpos($site_url, '://'));
    // Remove the http(s).
    $replace = '';
    foreach ($link_matches[1] as $key => $value) {
        if (!strpos($value, '?attachment_id=') || !strpos($value, 'wp-att-') || !preg_match('/href=(["\'])[^"\']*\?attachment_id=(\d+)[^"\']*\1/', $value, $url_match) || !preg_match('/rel=["\'][^"\']*wp-att-(\d+)/', $value, $rel_match)) {
            continue;
        }
        $quote = $url_match[1];
        // The quote (single or double).
        $url_id = (int) $url_match[2];
        $rel_id = (int) $rel_match[1];
        if (!$url_id || !$rel_id || $url_id != $rel_id || strpos($url_match[0], $site_url) === false) {
            continue;
        }
        $link = $link_matches[0][$key];
        $replace = str_replace($url_match[0], 'href=' . $quote . get_attachment_link($url_id) . $quote, $link);
        $content = str_replace($link, $replace, $content);
    }
    if ($replace) {
        $post['post_content'] = $content;
        // Escape data pulled from DB.
        $post = add_magic_quotes($post);
        return wp_update_post($post);
    }
}

WordPress Version: 5.4

//
// Private.
//
/**
 * Replace hrefs of attachment anchors with up-to-date permalinks.
 *
 * @since 2.3.0
 * @access private
 *
 * @param int|object $post Post ID or post object.
 * @return void|int|WP_Error Void if nothing fixed. 0 or WP_Error on update failure. The post ID on update success.
 */
function _fix_attachment_links($post)
{
    $post = get_post($post, ARRAY_A);
    $content = $post['post_content'];
    // Don't run if no pretty permalinks or post is not published, scheduled, or privately published.
    if (!get_option('permalink_structure') || !in_array($post['post_status'], array('publish', 'future', 'private'))) {
        return;
    }
    // Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero).
    if (!strpos($content, '?attachment_id=') || !preg_match_all('/<a ([^>]+)>[\s\S]+?<\/a>/', $content, $link_matches)) {
        return;
    }
    $site_url = get_bloginfo('url');
    $site_url = substr($site_url, (int) strpos($site_url, '://'));
    // Remove the http(s).
    $replace = '';
    foreach ($link_matches[1] as $key => $value) {
        if (!strpos($value, '?attachment_id=') || !strpos($value, 'wp-att-') || !preg_match('/href=(["\'])[^"\']*\?attachment_id=(\d+)[^"\']*\1/', $value, $url_match) || !preg_match('/rel=["\'][^"\']*wp-att-(\d+)/', $value, $rel_match)) {
            continue;
        }
        $quote = $url_match[1];
        // The quote (single or double).
        $url_id = (int) $url_match[2];
        $rel_id = (int) $rel_match[1];
        if (!$url_id || !$rel_id || $url_id != $rel_id || strpos($url_match[0], $site_url) === false) {
            continue;
        }
        $link = $link_matches[0][$key];
        $replace = str_replace($url_match[0], 'href=' . $quote . get_attachment_link($url_id) . $quote, $link);
        $content = str_replace($link, $replace, $content);
    }
    if ($replace) {
        $post['post_content'] = $content;
        // Escape data pulled from DB.
        $post = add_magic_quotes($post);
        return wp_update_post($post);
    }
}

WordPress Version: 3.7

//
// Private
//
/**
 * Replace hrefs of attachment anchors with up-to-date permalinks.
 *
 * @since 2.3.0
 * @access private
 *
 * @param int|object $post Post ID or post object.
 * @return void|int|WP_Error Void if nothing fixed. 0 or WP_Error on update failure. The post ID on update success.
 */
function _fix_attachment_links($post)
{
    $post = get_post($post, ARRAY_A);
    $content = $post['post_content'];
    // Don't run if no pretty permalinks or post is not published, scheduled, or privately published.
    if (!get_option('permalink_structure') || !in_array($post['post_status'], array('publish', 'future', 'private'))) {
        return;
    }
    // Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero)
    if (!strpos($content, '?attachment_id=') || !preg_match_all('/<a ([^>]+)>[\s\S]+?<\/a>/', $content, $link_matches)) {
        return;
    }
    $site_url = get_bloginfo('url');
    $site_url = substr($site_url, (int) strpos($site_url, '://'));
    // remove the http(s)
    $replace = '';
    foreach ($link_matches[1] as $key => $value) {
        if (!strpos($value, '?attachment_id=') || !strpos($value, 'wp-att-') || !preg_match('/href=(["\'])[^"\']*\?attachment_id=(\d+)[^"\']*\1/', $value, $url_match) || !preg_match('/rel=["\'][^"\']*wp-att-(\d+)/', $value, $rel_match)) {
            continue;
        }
        $quote = $url_match[1];
        // the quote (single or double)
        $url_id = (int) $url_match[2];
        $rel_id = (int) $rel_match[1];
        if (!$url_id || !$rel_id || $url_id != $rel_id || strpos($url_match[0], $site_url) === false) {
            continue;
        }
        $link = $link_matches[0][$key];
        $replace = str_replace($url_match[0], 'href=' . $quote . get_attachment_link($url_id) . $quote, $link);
        $content = str_replace($link, $replace, $content);
    }
    if ($replace) {
        $post['post_content'] = $content;
        // Escape data pulled from DB.
        $post = add_magic_quotes($post);
        return wp_update_post($post);
    }
}