媒体库中未附加的所有文件都需要重新附加它们的方法

时间:2013-08-24 17:55:55

标签: php wordpress

几个月后,我使用了一个自动下载远程图像并保存的插件。但是,我发现大约有15000个未附加的图像,实际上是在帖子中。该插件从未将图像附加到帖子本身。

我不知道该做什么或如何解决这个问题。我不能手动做它需要很长时间。 有没有办法扫描图像并将它们重新附加到相应的帖子?

更新:在我运行Sergiu提到的下面的插件之后。报告显示:

enter image description here

所以它似乎确实在帖子中拾取了图像。我只是希望它可以以某种方式附加到该帖子ID。有没有办法修改代码?

在下面的插件中。在第525行,我删除了代码:

if (  stripos( $img, $path ) !== false ) {
                    $response .= 'Img already in media library<br>';
                    continue;
                }

现在它附加了图像! 最后一个问题是它制作新副本。我无法找到一种不重新下载的方法。我更喜欢它只是附上它们。

在这里,我认为完整的代码负责。请提出修改建议:

http://pastebin.com/ePERuGjt#

/**
 * Extracts all images in content adds to media library if external and updates content with new url
 * @param object $post The post object
 * @return array|bool Post id and images converted on success false if no images found in source
 */
function extract_multi( $post ) {
        $html = $post->post_content;
        $path = wp_upload_dir();
        $path = $path['baseurl'];
        $error = 0;
        $response = '';
        if ( stripos( $html, '<img' ) !== false ) {

                $regex = '#<\s*img [^\>]*src\s*=\s*(["\'])(.*?)\1#im';
                preg_match_all( $regex, $html, $matches );

                if ( is_array( $matches ) && ! empty( $matches ) ) {
                        $new = array();
                        $old = array();
                        foreach( $matches[2] as $img ) {
                                /** Compare image source against upload directory to prevent adding same attachment multiple times  */



                                $tmp = download_url( $img );

                                preg_match('/[^\?]+\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/', $img, $matches);
                                $file_array['name'] = basename($matches[0]);
                                $file_array['tmp_name'] = $tmp;
                                // If error storing temporarily, unlink
                if ( is_wp_error( $tmp ) ) {
                    @unlink($file_array['tmp_name']);
                    $file_array['tmp_name'] = '';
                        continue;
                }

                                $id = media_handle_sideload( $file_array, $post->ID );

                                if ( ! is_wp_error( $id ) ) {
                                        $url  = wp_get_attachment_url( $id );
                                        $thumb = wp_get_attachment_thumb_url( $id );
                                        array_push( $new, $url );
                                        array_push( $old, $img );

                                        $response .= '<p><a href="'. wp_nonce_url( get_edit_post_link( $id, true ) ).'" title="edit-image"><img src="'.esc_url( $thumb ).'" style="max-width:100px;" /></a><br>';
                                        $response .= '<a href="'. wp_nonce_url( get_edit_post_link( $id, true ) ).'" >'.get_the_title( $id ). '</a>  Imported and attached</p>';
                                } else {
                                        $response .= '<span style="color:red">Upload Error: Could not upload image. Check for malformed img src url</span><br>';
                                        $error ++;
                                }
                        }
                        if( !empty( $new ) ) {
                                $content = str_ireplace( $old, $new, $html );
                                $post_args = array( 'ID' => $post->ID, 'post_content' => $content, );
                                if ( !empty( $content ) )
                                        $post_id = wp_update_post( $post_args );
                                        if ( isset( $post_id ) )
                                                $response .= 'Post Content updated for Post: '.esc_html( $post->post_title).'<br>';
                                        return array( 'error' => $error, 'response' => $response );
                        } else
                                 $response .= 'No external images found for ' . esc_html( $post->post_title ) . '<br>';
                                return array ( 'error' => $error, 'response' => $response );

                } else {
                         $response .= 'Error processing images for '. esc_html( $post->post_title ) .'<br>';
                        return array ( 'error' => $error, 'response' => $response );
                  }
        } else {
                 $response .= 'No images found for ' . esc_html( $post->post_title) . '<br>';
                return array ( 'error' => $error, 'response' => $response );
          }
}

3 个答案:

答案 0 :(得分:1)

This plugin似乎实现了一个完全解决您问题的功能。

答案 1 :(得分:0)

我建议这样做:

  1. 忘记您的网站 wget -m http://yoursite.com 这应该反映您的所有网站。 wget不会下载未附加的图像。

  2. 检查是否已下载所有内容

  3. 删除wp-content目录(我的意思是存储图像的目录)

  4. 上传wget。

  5. 下载的文件

    下次使用:DX删除附加媒体插件。 当删除帖子时,它会删除附加到帖子的所有图像。

答案 2 :(得分:0)

我是这个问题的原始海报。几年后,我遇到了这个老帖子。我挖出了解决方案,希望它可能在将来帮助任何人。

这是修改后的media-tools.php文件:

https://pastebin.com/8iUT78aP

只需安装媒体工具插件:https://github.com/c3mdigital/media-tools-for-WordPress

并使用media-tools.php

覆盖pastebin

然后,该插件实际上会将所有未附加的媒体重新附加到正确的帖子,也无需重新下载图像。

我希望这有助于某人,因为这个问题纯粹是为了解决问题。