几个月后,我使用了一个自动下载远程图像并保存的插件。但是,我发现大约有15000个未附加的图像,实际上是在帖子中。该插件从未将图像附加到帖子本身。
我不知道该做什么或如何解决这个问题。我不能手动做它需要很长时间。 有没有办法扫描图像并将它们重新附加到相应的帖子?
更新:在我运行Sergiu提到的下面的插件之后。报告显示:
所以它似乎确实在帖子中拾取了图像。我只是希望它可以以某种方式附加到该帖子ID。有没有办法修改代码?
在下面的插件中。在第525行,我删除了代码:
if ( stripos( $img, $path ) !== false ) {
$response .= 'Img already in media library<br>';
continue;
}
现在它附加了图像! 最后一个问题是它制作新副本。我无法找到一种不重新下载的方法。我更喜欢它只是附上它们。
在这里,我认为完整的代码负责。请提出修改建议:
/**
* 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 );
}
}
答案 0 :(得分:1)
This plugin似乎实现了一个完全解决您问题的功能。
答案 1 :(得分:0)
我建议这样做:
忘记您的网站 wget -m http://yoursite.com 这应该反映您的所有网站。 wget不会下载未附加的图像。
检查是否已下载所有内容
删除wp-content目录(我的意思是存储图像的目录)
上传wget。
下次使用:DX删除附加媒体插件。 当删除帖子时,它会删除附加到帖子的所有图像。
答案 2 :(得分:0)
我是这个问题的原始海报。几年后,我遇到了这个老帖子。我挖出了解决方案,希望它可能在将来帮助任何人。
这是修改后的media-tools.php文件:
只需安装媒体工具插件:https://github.com/c3mdigital/media-tools-for-WordPress
并使用media-tools.php
覆盖pastebin然后,该插件实际上会将所有未附加的媒体重新附加到正确的帖子,也无需重新下载图像。
我希望这有助于某人,因为这个问题纯粹是为了解决问题。