{"id":355198,"date":"2026-08-16T18:59:18","date_gmt":"2026-08-16T18:59:18","guid":{"rendered":"https:\/\/es.wordpress.org\/plugins\/find-and-import-external-images\/"},"modified":"2026-08-16T18:58:42","modified_gmt":"2026-08-16T18:58:42","slug":"media-ranger","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/media-ranger\/","author":16112365,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.0.4","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Media Ranger","header_author":"Bubuku","header_description":"Imports external images found in post content, downloads them to the Media Library, and replaces their URLs with local ones.","assets_banners_color":"dcfbfb","last_updated":"2026-08-16 18:58:42","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.bubuku.com\/","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/media-ranger\/","header_author_uri":"https:\/\/www.bubuku.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":39,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"lruizcode","date":"2026-08-16 18:58:42"}},"upgrade_notice":{"1.0.1":"<p>Security hardening for remote image downloads. Recommended update.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3650071,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-158x158.png":{"filename":"icon-158x158.png","revision":3650071,"resolution":"158x158","location":"assets","locale":"","width":158,"height":158},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3650071,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3650071,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500-es_ES.png":{"filename":"banner-1544x500-es_ES.png","revision":3650071,"resolution":"1544x500","location":"assets","locale":"es_ES","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3650071,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-es_ES.png":{"filename":"banner-772x250-es_ES.png","revision":3650071,"resolution":"772x250","location":"assets","locale":"es_ES","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3650071,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3650071,"resolution":"1","location":"assets","locale":"","width":940,"height":695},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3650071,"resolution":"2","location":"assets","locale":"","width":922,"height":620}},"screenshots":{"1":"Admin interface showing scan options","2":"Results after processing posts"}},"plugin_section":[],"plugin_tags":[1920,163,87,233,4155],"plugin_category":[50,59],"plugin_contributors":[249034,180155],"plugin_business_model":[],"class_list":["post-355198","plugin","type-plugin","status-publish","hentry","plugin_tags-external","plugin_tags-images","plugin_tags-import","plugin_tags-media-library","plugin_tags-migration","plugin_category-media","plugin_category-utilities-and-tools","plugin_contributors-bubuku","plugin_contributors-lruizcode","plugin_committers-lruizcode"],"banners":{"banner":"https:\/\/ps.w.org\/media-ranger\/assets\/banner-772x250.png?rev=3650071","banner_2x":"https:\/\/ps.w.org\/media-ranger\/assets\/banner-1544x500.png?rev=3650071","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/media-ranger\/assets\/icon.svg?rev=3650071","icon":"https:\/\/ps.w.org\/media-ranger\/assets\/icon.svg?rev=3650071","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/media-ranger\/assets\/screenshot-1.png?rev=3650071","caption":"Admin interface showing scan options"},{"src":"https:\/\/ps.w.org\/media-ranger\/assets\/screenshot-2.png?rev=3650071","caption":"Results after processing posts"}],"raw_content":"<!--section=description-->\n<p><strong>Media Ranger<\/strong> scans your posts, pages, and custom post types for images hosted on external domains. It then downloads those images to your WordPress Media Library and automatically replaces the external URLs with local ones.<\/p>\n\n<p>This is especially useful when:<\/p>\n\n<ul>\n<li>Migrating content from another platform (Webflow, Squarespace, etc.)<\/li>\n<li>Consolidating images from multiple CDNs<\/li>\n<li>Ensuring all your media is hosted locally for better control<\/li>\n<li>Improving site performance by serving images from your own server or CDN<\/li>\n<\/ul>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li>Scan posts, pages, and any custom post type<\/li>\n<li>Filter by post status (published, draft, any)<\/li>\n<li>Process in batches to avoid timeouts<\/li>\n<li>Include\/exclude specific external hosts<\/li>\n<li>Detect images in <code>src<\/code>, <code>data-src<\/code>, <code>srcset<\/code>, and <code>&lt;source&gt;<\/code> elements<\/li>\n<li>Automatic deduplication (won't re-import already imported images)<\/li>\n<li>Optional: prefer original image size over thumbnails<\/li>\n<li>Dry run mode to preview changes without modifying anything<\/li>\n<li>REST API endpoint for programmatic access<\/li>\n<li>Full WPML and Polylang compatibility<\/li>\n<li>Support for modern image formats (WebP, AVIF)<\/li>\n<\/ul>\n\n<h3>SUPPORT<\/h3>\n\n<p><strong>Need help or have a suggestion?<\/strong>\nPlease use the <a href=\"https:\/\/wordpress.org\/support\/plugin\/media-ranger\/\">official WordPress.org Support Forum<\/a> for any issues related to the plugin.<\/p>\n\n<p><strong>Official Website<\/strong>\nFor additional information or to get in touch with the development team, please visit our <a href=\"https:\/\/www.bubuku.com\/\">official website<\/a>.<\/p>\n\n<p><strong>Like the plugin?<\/strong>\nPlease <a href=\"https:\/\/wordpress.org\/support\/plugin\/media-ranger\/reviews\/?filter=5\">leave a 5-star review<\/a> and help others discover Media Ranger.<\/p>\n\n<h3>ABOUT BUBUKU_CODE<\/h3>\n\n<p>We develop custom solutions for WordPress focused on performance, accessibility, and maintainable code. Our work includes plugins, themes, and integrations designed to improve the daily workflow of marketing and content teams.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>media-ranger<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress<\/li>\n<li>Go to Tools \u2192 Media Ranger<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20modify%20my%20original%20posts%3F\"><h3>Does this modify my original posts?<\/h3><\/dt>\n<dd><p>Yes, when not in dry-run mode, the plugin updates your post content to replace external image URLs with local ones. The original external images remain untouched on their servers.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20an%20image%20fails%20to%20download%3F\"><h3>What happens if an image fails to download?<\/h3><\/dt>\n<dd><p>The plugin logs the error and continues processing other images. Failed downloads are reported in the results.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20with%20woocommerce%20products%3F\"><h3>Can I use this with WooCommerce products?<\/h3><\/dt>\n<dd><p>Yes! Simply include \"product\" in the Post Types field to scan WooCommerce products.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20wpml%20or%20polylang%3F\"><h3>Does it work with WPML or Polylang?<\/h3><\/dt>\n<dd><p>Yes, the plugin is fully compatible with both WPML and Polylang. You can process all languages at once or select a specific language.<\/p><\/dd>\n<dt id=\"how%20do%20i%20avoid%20re-importing%20the%20same%20image%3F\"><h3>How do I avoid re-importing the same image?<\/h3><\/dt>\n<dd><p>The plugin stores the original source URL as attachment metadata. When scanning, it checks if an image was already imported and reuses the existing attachment.<\/p><\/dd>\n<dt id=\"can%20i%20run%20this%20via%20wp-cli%20or%20programmatically%3F\"><h3>Can I run this via WP-CLI or programmatically?<\/h3><\/dt>\n<dd><p>Yes, you can use the REST API endpoint. See the documentation for details on how to call <code>\/wp-json\/media-ranger\/v1\/run<\/code>.<\/p><\/dd>\n<dt id=\"how%20does%20the%20plugin%20protect%20against%20unsafe%20downloads%3F\"><h3>How does the plugin protect against unsafe downloads?<\/h3><\/dt>\n<dd><p>Before downloading any remote image, the plugin rejects URLs that don't use the <code>http<\/code> or <code>https<\/code> scheme, and performs a HEAD request that blocks requests to private\/internal network addresses (via <code>wp_safe_remote_head()<\/code>). It also checks the <code>Content-Type<\/code> (must be an image) and the <code>Content-Length<\/code> (default max 20 MB) before downloading. These can be adjusted with the <code>mran_allowed_mime_prefixes<\/code> and <code>mran_max_download_size<\/code> filters, and the <code>MRAN_HTTP_TIMEOUT<\/code> constant (default 10 seconds, define it in <code>wp-config.php<\/code>).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Added plugin icons, banners, and screenshots for the WordPress.org assets directory<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Security: reject non-http(s) URLs before making any request<\/li>\n<li>Security: use wp_safe_remote_head() to prevent requests to internal\/private network addresses<\/li>\n<li>Security: validate Content-Type and enforce a maximum download size (20 MB default, filterable) before downloading<\/li>\n<li>Security: configurable HTTP timeout via MR_HTTP_TIMEOUT constant<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Complete rewrite following WordPress Coding Standards<\/li>\n<li>Added namespace support and modular architecture<\/li>\n<li>Improved WPML\/Polylang compatibility<\/li>\n<li>Added scan-only endpoint<\/li>\n<li>Enhanced error handling and reporting<\/li>\n<li>Added verbose mode for debugging<\/li>\n<li>Better deduplication using attachment metadata<\/li>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"Imports external images found in post content, downloads them to the Media Library, and replaces their URLs with local ones.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/355198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=355198"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/lruizcode"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=355198"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=355198"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=355198"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=355198"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=355198"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=355198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}