From f35042174619b3330b3e467ea23685e1b6e84ea6 Mon Sep 17 00:00:00 2001 From: azaozz Date: Wed, 28 Mar 2012 16:02:12 +0000 Subject: [PATCH] Improve _fix_attachment_links(), replace attachment URLs with the real permalink only for published posts, re-save only when there are changes, see #13429 git-svn-id: http://svn.automattic.com/wordpress/trunk@20308 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/includes/post.php | 67 ++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/wp-admin/includes/post.php b/wp-admin/includes/post.php index d2f26a6cf..9df362d2f 100644 --- a/wp-admin/includes/post.php +++ b/wp-admin/includes/post.php @@ -749,50 +749,47 @@ function update_meta( $meta_id, $meta_key, $meta_value ) { * @return unknown */ function _fix_attachment_links( $post_ID ) { - global $_fix_attachment_link_id; - $post = & get_post( $post_ID, ARRAY_A ); - - $search = "#]+rel=('|\")[^'\"]*attachment[^>]*>#ie"; - - // See if we have any rel="attachment" links - if ( 0 == preg_match_all( $search, $post['post_content'], $anchor_matches, PREG_PATTERN_ORDER ) ) + $content = $post['post_content']; + + // quick sanity check, don't run if no pretty permalinks or post is not published + if ( !get_option('permalink_structure') || $post['post_status'] != 'publish' ) return; - $i = 0; - $search = "#[\s]+rel=(\"|')(.*?)wp-att-(\d+)\\1#i"; - foreach ( $anchor_matches[0] as $anchor ) { - if ( 0 == preg_match( $search, $anchor, $id_matches ) ) + // Short if there aren't any links or no '?attachment_id=' strings (strpos cannot be zero) + if ( !strpos($content, '?attachment_id=') || !preg_match_all( '/]+)>[\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; - $id = (int) $id_matches[3]; + $link = $link_matches[0][$key]; + $replace = str_replace( $url_match[0], 'href=' . $quote . get_attachment_link( $url_id ) . $quote, $link ); - // While we have the attachment ID, let's adopt any orphans. - $attachment = & get_post( $id, ARRAY_A ); - if ( ! empty( $attachment) && ! is_object( get_post( $attachment['post_parent'] ) ) ) { - $attachment['post_parent'] = $post_ID; - // Escape data pulled from DB. - $attachment = add_magic_quotes( $attachment ); - wp_update_post( $attachment ); - } - - $post_search[$i] = $anchor; - $_fix_attachment_link_id = $id; - $post_replace[$i] = preg_replace_callback( "#href=(\"|')[^'\"]*\\1#", '_fix_attachment_links_replace_cb', $anchor ); - ++$i; + $content = str_replace( $link, $replace, $content ); } - $post['post_content'] = str_replace( $post_search, $post_replace, $post['post_content'] ); + if ( $replace ) { + $post['post_content'] = $content; + // Escape data pulled from DB. + $post = add_magic_quotes($post); - // Escape data pulled from DB. - $post = add_magic_quotes( $post); - - return wp_update_post( $post); -} - -function _fix_attachment_links_replace_cb($match) { - global $_fix_attachment_link_id; - return stripslashes( 'href='.$match[1] ).get_attachment_link( $_fix_attachment_link_id ).stripslashes( $match[1] ); + return wp_update_post($post); + } } /**