0

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

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

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

在此处输入图像描述

所以它似乎确实拿起了帖子中的图像。我只是希望它可以以某种方式附加到该帖子 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 );
          }
}
4

3 回答 3

2

我是这个问题的原始海报。几年后,我偶然发现了这个旧帖子。我挖掘了解决方案,希望它将来可以帮助任何人。

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

https://pastebin.com/8iUT78aP

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

并用 media-tools.php 覆盖 pastebin

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

我希望这对某人有所帮助,因为这个问题纯粹是要解决的。

于 2017-04-11T06:50:20.083 回答
1

这个插件似乎实现了一个功能来处理你的问题。

于 2013-08-24T18:01:18.893 回答
0

我建议这样做:

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

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

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

  4. 上传 wget 下载的文件。

下次使用:DX Delete Attached Media Plugin。当帖子被删除时,它会删除所有附加到帖子的图像。

于 2014-04-11T06:44:51.083 回答