{"id":241504,"date":"2025-07-21T10:33:45","date_gmt":"2025-07-21T10:33:45","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/replace-external-images\/"},"modified":"2026-02-13T21:59:24","modified_gmt":"2026-02-13T21:59:24","slug":"replace-external-images","status":"publish","type":"plugin","link":"https:\/\/szl.wordpress.org\/plugins\/replace-external-images\/","author":23325474,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.2.0","stable_tag":"1.2.0","tested":"6.9.4","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"Replace External Images","header_author":"Hans & Friends","header_description":"Detects external images in post content, saves them to the media library, and replaces external URLs with local ones.","assets_banners_color":"efc8c7","last_updated":"2026-02-13 21:59:24","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/hansandfriends.de","rating":0,"author_block_rating":0,"active_installs":60,"downloads":659,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"hansandfriends","date":"2025-07-21 10:47:40"},"1.1.0":{"tag":"1.1.0","author":"hansandfriends","date":"2025-12-08 15:41:47"},"1.2.0":{"tag":"1.2.0","author":"hansandfriends","date":"2026-02-13 21:59:24"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3331060,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3331060,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3331060,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3331060,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0","1.2.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3331060,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3331060,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3331060,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3331060,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3338974,"resolution":"5","location":"assets","locale":""}},"screenshots":{"1":"A post with an externally hosted image. The \"Replace External Images\" panel appears in the editor sidebar. One click imports the image into the media library and updates the post to use the local version.","2":"Successful import confirmation with summary and return link.","3":"Works in both Classic Editor and Gutenberg, including multi-image posts.","4":"Respecting protected content \u2014 import fails cleanly for non-image or restricted resources."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[15235,15346,163,87,84],"plugin_category":[50,59],"plugin_contributors":[245174],"plugin_business_model":[],"class_list":["post-241504","plugin","type-plugin","status-publish","hentry","plugin_tags-external-images","plugin_tags-hotlinking","plugin_tags-images","plugin_tags-import","plugin_tags-media","plugin_category-media","plugin_category-utilities-and-tools","plugin_contributors-hansandfriends","plugin_committers-hansandfriends"],"banners":{"banner":"https:\/\/ps.w.org\/replace-external-images\/assets\/banner-772x250.png?rev=3331060","banner_2x":"https:\/\/ps.w.org\/replace-external-images\/assets\/banner-1544x500.png?rev=3331060","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/replace-external-images\/assets\/icon-128x128.png?rev=3331060","icon_2x":"https:\/\/ps.w.org\/replace-external-images\/assets\/icon-256x256.png?rev=3331060","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/replace-external-images\/assets\/screenshot-1.png?rev=3331060","caption":"A post with an externally hosted image. The \"Replace External Images\" panel appears in the editor sidebar. One click imports the image into the media library and updates the post to use the local version."},{"src":"https:\/\/ps.w.org\/replace-external-images\/assets\/screenshot-2.png?rev=3331060","caption":"Successful import confirmation with summary and return link."},{"src":"https:\/\/ps.w.org\/replace-external-images\/assets\/screenshot-3.png?rev=3331060","caption":"Works in both Classic Editor and Gutenberg, including multi-image posts."},{"src":"https:\/\/ps.w.org\/replace-external-images\/assets\/screenshot-4.png?rev=3331060","caption":"Respecting protected content \u2014 import fails cleanly for non-image or restricted resources."},{"src":"https:\/\/ps.w.org\/replace-external-images\/assets\/screenshot-5.png?rev=3338974","caption":""}],"raw_content":"<!--section=description-->\n<p>\u201cReplace External Images\u201d lets you import externally hosted images used in post content directly into your WordPress media library \u2014 either one by one or now with the new bulk import feature across multiple posts at once.<\/p>\n\n<p>The plugin automatically replaces external URLs in the content with local media URLs, shows a live progress view, supports any image host, and updates featured images where needed.<\/p>\n\n<p>Ideal for:\n\u2013 site migrations\n\u2013 pasted content from other sources\n\u2013 cleaning up hotlinked images\n\u2013 processing many posts in one go with the bulk importer<\/p>\n\n<p>Full documentation available here: <a href=\"https:\/\/hansandfriends.de\/docs\/replace-external-images\/\">Replace External Images Docs<\/a><\/p>\n\n<!--section=installation-->\n<ol>\n<li>Go to your WordPress dashboard.<\/li>\n<li>Navigate to \u201cPlugins &gt; Add New\u201d.<\/li>\n<li>Search for \u201cReplace External Images\u201d.<\/li>\n<li>Click \u201cInstall Now\u201d and then \u201cActivate\u201d.<\/li>\n<\/ol>\n\n<p>Alternatively:<\/p>\n\n<ol>\n<li>Download the plugin as a ZIP file.<\/li>\n<li>Go to \u201cPlugins &gt; Add New &gt; Upload Plugin\u201d.<\/li>\n<li>Select the ZIP file, click \u201cInstall Now\u201d, then \u201cActivate\u201d.<\/li>\n<\/ol>\n\n<p>Once activated:<\/p>\n\n<ul>\n<li>Open a post that contains externally linked images.<\/li>\n<li>Click \u201cReplace External Images\u201d in the Tools section.<\/li>\n<li>Watch the live progress bar and wait for completion.<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20overwrite%20existing%20media%3F\"><h3>Does it overwrite existing media?<\/h3><\/dt>\n<dd><p>No \u2014 it only imports external images and skips media already in the library.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20the%20image%20urls%3F\"><h3>What happens to the image URLs?<\/h3><\/dt>\n<dd><p>They are updated to local media paths after import.<\/p><\/dd>\n<dt id=\"can%20i%20undo%20the%20import%3F\"><h3>Can I undo the import?<\/h3><\/dt>\n<dd><p>Not automatically. Please make a backup before running the importer if you need to restore content later.<\/p><\/dd>\n<dt id=\"what%20happens%20with%20protected%20or%20blocked%20images%3F\"><h3>What happens with protected or blocked images?<\/h3><\/dt>\n<dd><p>Some image sources actively block hotlinking or automated downloads by returning a different content type (e.g. <code>text\/plain<\/code> instead of <code>image\/jpeg<\/code>).<br \/>\nThis plugin detects such cases and skips the import gracefully \u2014 no image is saved, and the log explains why.<\/p><\/dd>\n<dt id=\"what%20if%20the%20post%20doesn%27t%20have%20a%20featured%20image%3F\"><h3>What if the post doesn't have a featured image?<\/h3><\/dt>\n<dd><p>If a post has no featured image, the plugin will automatically set the <strong>first successfully imported image<\/strong> as the featured image.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Improved prefix consistency across AJAX, JS globals, script handles, and importer internals<\/li>\n<li>Hardened nonce and request sanitization in admin and AJAX flows<\/li>\n<li>Improved download handling and clearer logging for blocked sources (e.g. HTTP 403 responses)<\/li>\n<li>Improved post-type aware back navigation after single and bulk imports<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>NEW: Bulk import for external images across multiple posts<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release<\/li>\n<li>Live importer for external images<\/li>\n<li>Works on individual post basis<\/li>\n<li>Tested up to WordPress 6.8.1 and PHP 8.2<\/li>\n<\/ul>","raw_excerpt":"Easily import externally hosted images found in post content into your media library and replace them with local copies.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/241504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=241504"}],"author":[{"embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/hansandfriends"}],"wp:attachment":[{"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=241504"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=241504"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=241504"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=241504"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=241504"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/szl.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=241504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}