{"id":253957,"date":"2025-10-07T00:54:29","date_gmt":"2025-10-07T00:54:29","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/exportimport-media\/"},"modified":"2026-04-27T18:19:19","modified_gmt":"2026-04-27T18:19:19","slug":"calliope-media-import-export","status":"publish","type":"plugin","link":"https:\/\/cn.wordpress.org\/plugins\/calliope-media-import-export\/","author":21100331,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.7.9","stable_tag":"1.7.9","tested":"6.9.4","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"Export\/Import Media","header_author":"CalliopeWP","header_description":"Exports and imports images with metadata using CSV. Includes real-time batch processing and prevents duplicates.","assets_banners_color":"4a9cd0","last_updated":"2026-04-27 18:19:19","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/pluginswordpress.calliope.com.ar\/","rating":3,"author_block_rating":0,"active_installs":1000,"downloads":5688,"num_ratings":2,"support_threads":1,"support_threads_resolved":1,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0":{"tag":"1.0","author":"mairaforesto","date":"2025-10-07 01:02:47"},"1.0.3":{"tag":"1.0.3","author":"mairaforesto","date":"2026-01-03 01:00:06"},"1.2.1":{"tag":"1.2.1","author":"mairaforesto","date":"2025-10-08 19:32:32"},"1.2.2":{"tag":"1.2.2","author":"mairaforesto","date":"2025-10-08 19:38:40"},"1.2.3":{"tag":"1.2.3","author":"mairaforesto","date":"2025-12-04 23:53:22"},"1.6.15":{"tag":"1.6.15","author":"mairaforesto","date":"2026-04-22 04:00:54"},"1.6.4":{"tag":"1.6.4","author":"mairaforesto","date":"2026-04-07 21:09:24"},"1.7":{"tag":"1.7","author":"mairaforesto","date":"2026-04-24 18:45:58"},"1.7.1":{"tag":"1.7.1","author":"mairaforesto","date":"2026-04-27 14:16:44"},"1.7.9":{"tag":"1.7.9","author":"mairaforesto","date":"2026-04-27 18:19:19"}},"upgrade_notice":[],"ratings":{"1":1,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3375315,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3375315,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3375315,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3375315,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0","1.0.3","1.2.1","1.2.2","1.2.3","1.6.15","1.6.4","1.7","1.7.1","1.7.9"],"block_files":[],"assets_screenshots":[],"screenshots":[],"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[1859,163,87,84,186],"plugin_category":[50,59],"plugin_contributors":[248854],"plugin_business_model":[],"class_list":["post-253957","plugin","type-plugin","status-publish","hentry","plugin_tags-export","plugin_tags-images","plugin_tags-import","plugin_tags-media","plugin_tags-seo","plugin_category-media","plugin_category-utilities-and-tools","plugin_contributors-mairaforesto","plugin_committers-mairaforesto"],"banners":{"banner":"https:\/\/ps.w.org\/calliope-media-import-export\/assets\/banner-772x250.png?rev=3375315","banner_2x":"https:\/\/ps.w.org\/calliope-media-import-export\/assets\/banner-1544x500.png?rev=3375315","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/calliope-media-import-export\/assets\/icon-128x128.png?rev=3375315","icon_2x":"https:\/\/ps.w.org\/calliope-media-import-export\/assets\/icon-256x256.png?rev=3375315","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Export\/Import Media<\/strong> helps you move media between WordPress sites using CSV while preserving core media metadata columns such as alt text, title, caption, and description.<\/p>\n\n<p>The free workflow is built for straightforward media export and import. The plugin generates a CSV file containing useful media information such as URLs, relative paths, alt text, titles, captions, and descriptions. You can validate that CSV, preview it before importing, and process rows in batches from a cleaner admin screen focused on the core workflow.<\/p>\n\n<p>During normal free imports, detected duplicates are skipped to help prevent duplicate attachments in the library. Metadata columns are supported for rows that are imported, while controlled matching and update rules for already-existing media are handled by the separate Pro add-on.<\/p>\n\n<p><strong>Why use this plugin?<\/strong>\n* <strong>Straightforward CSV workflows:<\/strong> Export media data, validate incoming CSV files, preview them, and import them in batches.\n* <strong>Batch import:<\/strong> AJAX-powered processing helps avoid browser and timeout issues on medium and large imports.\n* <strong>Duplicate prevention:<\/strong> Detects existing matches and skips them in the normal free workflow.\n* <strong>Metadata columns:<\/strong> Supports title, alt text, caption, and description columns in CSV import\/export.\n* <strong>Developer friendly:<\/strong> Includes hooks and filters for extending CSV columns, validation, admin UI, and import\/export behavior.<\/p>\n\n<p>Need more control for larger libraries? The separate <strong>Export\/Import Media Pro<\/strong> add-on adds saved workflows, remote or server-side CSV sources, controlled matching against existing media, selective metadata refreshes, safer replace-file workflows, and background processing with history tools.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li><strong>CSV Export:<\/strong> Export media data to CSV with filters by date, media type, and attachment context.<\/li>\n<li><strong>CSV Preview:<\/strong> Validate and preview the file before importing.<\/li>\n<li><strong>Batch Processing:<\/strong> Import media rows in AJAX batches.<\/li>\n<li><strong>Local Import Mode:<\/strong> Register files that already exist in <code>\/uploads\/<\/code> without downloading them again.<\/li>\n<li><strong>Honor Relative Path:<\/strong> Reuse or preserve folder paths from the CSV.<\/li>\n<li><strong>Skip Thumbnail Generation:<\/strong> Speed up large imports when needed.<\/li>\n<li><strong>Duplicate Prevention:<\/strong> Uses source meta and file fingerprints to detect existing matches and skip those rows in the standard free workflow.<\/li>\n<li><strong>Metadata Columns:<\/strong> Imports and exports title, alt text, caption, and description columns for supported rows.<\/li>\n<li><strong>Downloadable Log:<\/strong> Save an import log as <code>.txt<\/code> after the process finishes.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Go to <strong>Export\/Import Media<\/strong> in the WordPress admin menu to start using the tool.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20move%20the%20actual%20media%20files%3F\"><h3>Does this plugin move the actual media files?<\/h3><\/dt>\n<dd><p>Yes. During a remote import, the plugin securely downloads the file from the URL provided in the CSV and adds it to your media library, generating the necessary attachment records.<\/p><\/dd>\n<dt id=\"how%20does%20the%20%22skip%20thumbnail%20generation%22%20work%3F\"><h3>How does the \"Skip Thumbnail Generation\" work?<\/h3><\/dt>\n<dd><p>By checking this option, WordPress imports only the original image and skips creating intermediate image sizes during the import process. This makes large image imports faster. You can regenerate thumbnails later using a dedicated plugin.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20media%20file%20already%20exists%3F\"><h3>What happens if a media file already exists?<\/h3><\/dt>\n<dd><p>The free plugin performs duplicate detection using stored source data, relative paths, attachment paths, and fingerprints. If it finds an existing match, it skips that row to help prevent duplicates in the library.<\/p><\/dd>\n<dt id=\"does%20%22metadata%20support%22%20mean%20the%20free%20plugin%20updates%20existing%20media%20records%3F\"><h3>Does \"metadata support\" mean the free plugin updates existing media records?<\/h3><\/dt>\n<dd><p>No. In the free plugin, metadata columns are supported for standard export\/import rows, while detected duplicates are skipped in the normal workflow. Controlled matching, metadata refreshes, selective field updates, and replace-file workflows for existing attachments belong to the separate Pro add-on.<\/p><\/dd>\n<dt id=\"what%20does%20the%20pro%20add-on%20add%3F\"><h3>What does the Pro add-on add?<\/h3><\/dt>\n<dd><p>Export\/Import Media Pro adds saved workflows, remote or server-side CSV sources, controlled matching against existing media, selective metadata updates, replace-file workflows, history, and background processing for larger media libraries.<\/p><\/dd>\n<dt id=\"can%20i%20filter%20which%20media%20items%20to%20export%3F\"><h3>Can I filter which media items to export?<\/h3><\/dt>\n<dd><p>Yes. You can filter by date range, media type, and attachment context such as unattached files or media attached to posts, pages, and WooCommerce products.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.7.9<\/h4>\n\n<ul>\n<li>Fixed export media type filtering so selecting Videos, Audio, Documents, or Images uses explicit MIME type lists instead of falling back to images.<\/li>\n<li>Export filenames now include the selected media type for easier verification.<\/li>\n<\/ul>\n\n<h4>1.7.6<\/h4>\n\n<ul>\n<li>Fix: Adjusted the footer review star styles so inline SVG stars are not clipped by admin line-height or inherited image rules.<\/li>\n<\/ul>\n\n<h4>1.7.5<\/h4>\n\n<ul>\n<li>Fix: Made large AJAX imports safer on shared hosting by capping oversized batches, using a host-aware soft time limit, and preventing long stale locks after failed requests.<\/li>\n<li>Improvement: Import retries now wait for active batches instead of immediately failing against the import lock, and reduce the runtime batch size after server\/network failures.<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Fix: The downloadable sample CSV now uses stable canonical column headers and points to a bundled sample image so it can validate and run more reliably on translated admin sites.<\/li>\n<li>Fix: CSV validation now recognizes translated column headers for URL, relative path, title, alt text, caption, and description when users import files created from localized exports.<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Fix: CSV validation no longer fails because the importer now closes file handles correctly instead of re-entering its own close helper.<\/li>\n<li>Improvement: AJAX validation errors now surface a clearer server response when a host returns a non-JSON error.<\/li>\n<\/ul>\n\n<h4>1.7<\/h4>\n\n<ul>\n<li>Internal: Replaced the global service map with an internal service registry to keep bootstrapped plugin services more controlled and maintainable.<\/li>\n<li>Compatibility: Kept <code>eim_get_service()<\/code> working as the compatibility layer for importer, exporter, admin, and add-on access patterns.<\/li>\n<\/ul>\n\n<h4>1.6.15<\/h4>\n\n<ul>\n<li>Fixed broken Spanish MO encoding so accented text renders correctly again in the admin.<\/li>\n<li>Added a small follow-up Spanish i18n pass for the latest admin wording.<\/li>\n<\/ul>\n\n<h4>1.6.14<\/h4>\n\n<ul>\n<li>UX: Returned the main Export to CSV and Start Import actions to a stronger fuchsia accent so the key workflow buttons stand out again.<\/li>\n<li>Housekeeping: Aligned the free stylesheet version comment and readme release metadata with the current plugin version.<\/li>\n<\/ul>\n\n<h4>1.6.13<\/h4>\n\n<ul>\n<li>Tightened the free header layout so all four feature chips stay compact and use the full hero width better.<\/li>\n<li>Added a shared hook after the main import flow so Pro tools can appear below preview\/progress instead of interrupting the standard workflow.<\/li>\n<\/ul>\n\n<h4>1.6.11<\/h4>\n\n<ul>\n<li>UX: Rebalanced the main hero feature chips into a compact full-width row so the banner stays shorter and uses space more efficiently.<\/li>\n<\/ul>\n\n<h4>1.6.10<\/h4>\n\n<ul>\n<li>UX: Removed the oversized Pro upsell callout from inside the main hero so the free header stays more compact.<\/li>\n<li>UX: Hide the Free badge automatically when the Pro add-on is active to keep the shared admin header consistent.<\/li>\n<\/ul>\n\n<h4>1.6.9<\/h4>\n\n<ul>\n<li>i18n: Wrapped remaining visible admin and CSV header labels for translation coverage.<\/li>\n<li>i18n: Refreshed the translation template and locale files so the latest free-screen strings are ready for localization.<\/li>\n<\/ul>\n\n<h4>1.6.8<\/h4>\n\n<ul>\n<li>UX: Refined the free admin screen with a cleaner hierarchy, calmer styling, and clearer step-by-step guidance.<\/li>\n<li>UX: Reworked the free vs Pro messaging so the upgrade path stays visible without getting in the way of the core workflow.<\/li>\n<li>Messaging: Clarified more explicitly that updating metadata on already-existing media is a Pro workflow.<\/li>\n<\/ul>\n\n<h4>1.6.6<\/h4>\n\n<ul>\n<li>UX: Removed locked Pro submenus from the free plugin so the admin experience stays focused and less intrusive.<\/li>\n<li>UX: Reworked the free admin page to keep the core export\/import workflow front and center while showing a lighter Pro teaser section.<\/li>\n<li>Messaging: Clarified the free vs Pro boundary around updating metadata on already-existing media items.<\/li>\n<\/ul>\n\n<h4>1.6.5<\/h4>\n\n<ul>\n<li>Internal: Added a service getter so companion add-ons can safely access the free plugin importer without duplicating core logic.<\/li>\n<li>Internal: Added a programmatic import runner for compatible add-ons, including optional dry-run and duplicate-strategy context.<\/li>\n<li>Internal: Added import lifecycle events and request context support so add-ons can store history and extend the import flow without changing the free UI.<\/li>\n<li>Compatibility: This release prepares the free core for the separate Pro add-on while keeping the free plugin clean and fully usable on its own.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Fix: Removed the UTF-8 BOM from AJAX-related PHP files to prevent invalid JSON responses during CSV validation.<\/li>\n<li>Improvement: Added safer importer i18n fallbacks so missing localized keys do not render empty labels in the admin UI.<\/li>\n<li>Improvement: Replaced the external admin Google Font dependency with a local system font stack for a cleaner WordPress.org release.<\/li>\n<li>Improvement: Aligned the admin screen title with the published plugin name.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Improvement: Centralized plugin defaults, feature flags, and extension-ready configuration.<\/li>\n<li>Improvement: Export pipeline refactored to support column definitions and cleaner request handling.<\/li>\n<li>Improvement: Admin screen prepared for future add-on sections and Pro-ready feature slots without changing the free workflow.<\/li>\n<li>Improvement: Import pipeline now supports extensible header definitions and row-level validation hooks.<\/li>\n<li>Fix: Readme and release metadata aligned with the current plugin version.<\/li>\n<\/ul>\n\n<h4>1.4.4<\/h4>\n\n<ul>\n<li>Fix: Prevent duplicated imports by detecting existing attachments via source URL \/ relative path \/ file fingerprint.<\/li>\n<li>Improvement: Store and backfill source and fingerprint meta to make future imports faster and consistent.<\/li>\n<\/ul>\n\n<h4>1.4.3<\/h4>\n\n<ul>\n<li>Fix: Removed stray HTML text output in the import form.<\/li>\n<li>UX: Hides third-party admin notices inside the plugin screen to keep the interface clean.<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>New: Export all media types with a dedicated \"Media Type\" filter.<\/li>\n<li>New: Import option to honor the original relative path when importing.<\/li>\n<li>New: Downloadable sample CSV template.<\/li>\n<li>Security\/UX: Hardened Local Import Mode to keep file access inside uploads.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>New: Modern drag and drop interface for easier CSV uploads.<\/li>\n<li>New: Advanced export filters for attachments linked to WooCommerce products, posts, or pages.<\/li>\n<li>New: Downloadable import log for better debugging.<\/li>\n<li>UX: Improved file selection with visual feedback.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Security: Major hardening using native WordPress sideload APIs.<\/li>\n<li>New: Date range filters in the export section.<\/li>\n<li>New: Skip Thumbnail Generation option for faster imports.<\/li>\n<li>Improvement: Refactored the plugin into object-oriented classes.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Improved compatibility with PHP 8.x.<\/li>\n<li>Fixed minor UI bugs in the progress bar.<\/li>\n<\/ul>\n\n<h4>1.2<\/h4>\n\n<ul>\n<li>Added Local Import Mode.<\/li>\n<li>Added automatic cleanup for temporary files.<\/li>\n<li>Improved error reporting for downloads.<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Import and export your WordPress media library using CSV, with preview, batch processing, duplicate prevention, and core media metadata columns.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/253957","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=253957"}],"author":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mairaforesto"}],"wp:attachment":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=253957"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=253957"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=253957"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=253957"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=253957"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=253957"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}