_fix_attachment_links
Replace hrefs of attachment anchors with up-to-date permalinks.
Description
(void|int|WP_Error) _fix_attachment_links( (int|object) $post );
Returns (void|int|WP_Error)
Void if nothing fixed. 0 or WP_Error on update failure. The post ID on update success.
Parameters (1)
- 0. $post (int|object)
- Post ID or post object.
Usage
if ( !function_exists( '_fix_attachment_links' ) ) { require_once ABSPATH . '/wp-admin/includes/post.php'; } // Post ID or post object. $post = null; // NOTICE! Understand what this does before running. $result = _fix_attachment_links($post);
Defined (1)
The function is defined in the following location(s).
- /wp-admin/includes/post.php
- function _fix_attachment_links( $post ) {
- $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);
- }
- }