{"id":269222,"date":"2026-01-19T06:46:58","date_gmt":"2026-01-19T06:46:58","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/mksddn-migrate-content\/"},"modified":"2026-04-03T10:42:10","modified_gmt":"2026-04-03T10:42:10","slug":"mksddn-migrate-content","status":"publish","type":"plugin","link":"https:\/\/en-ca.wordpress.org\/plugins\/mksddn-migrate-content\/","author":23351592,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"2.1.7","stable_tag":"2.1.7","tested":"6.9.4","requires":"6.2","requires_php":"8.0","requires_plugins":null,"header_name":"MksDdn Migrate Content","header_author":"mksddn","header_description":"Export and import single pages (and more) with metadata and media.","assets_banners_color":"","last_updated":"2026-04-03 10:42:10","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/mksddn\/WP-MksDdn-Migrate-Content","header_author_uri":"https:\/\/github.com\/mksddn","rating":0,"author_block_rating":0,"active_installs":0,"downloads":758,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.3.1":{"tag":"1.3.1","author":"mksddn","date":"2026-01-19 06:46:31"},"1.3.2":{"tag":"1.3.2","author":"mksddn","date":"2026-01-21 13:10:20"},"1.4.0":{"tag":"1.4.0","author":"mksddn","date":"2026-01-25 05:50:52"},"2.0.0":{"tag":"2.0.0","author":"mksddn","date":"2026-01-25 09:03:36"},"2.0.1":{"tag":"2.0.1","author":"mksddn","date":"2026-01-25 09:25:14"},"2.0.2":{"tag":"2.0.2","author":"mksddn","date":"2026-02-06 12:27:13"},"2.0.3":{"tag":"2.0.3","author":"mksddn","date":"2026-02-12 06:24:53"},"2.1.0":{"tag":"2.1.0","author":"mksddn","date":"2026-02-19 17:50:35"},"2.1.1":{"tag":"2.1.1","author":"mksddn","date":"2026-02-21 06:34:00"},"2.1.2":{"tag":"2.1.2","author":"mksddn","date":"2026-02-25 11:15:26"},"2.1.3":{"tag":"2.1.3","author":"mksddn","date":"2026-03-20 10:07:38"},"2.1.4":{"tag":"2.1.4","author":"mksddn","date":"2026-03-24 15:12:36"},"2.1.5":{"tag":"2.1.5","author":"mksddn","date":"2026-04-01 14:11:55"},"2.1.6":{"tag":"2.1.6","author":"mksddn","date":"2026-04-03 09:47:22"},"2.1.7":{"tag":"2.1.7","author":"mksddn","date":"2026-04-03 10:42:10"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.3.1","1.3.2","1.4.0","2.0.0","2.0.1","2.0.2","2.0.3","2.1.0","2.1.1","2.1.2","2.1.3","2.1.4","2.1.5","2.1.6","2.1.7"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Export dashboard with \u201cFull Site\u201d and \u201cSelected Content\u201d cards.","2":"Selected Content picker with multi-select lists and media toggles.","3":"User merge dialog showing archive\/current comparison."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[151,1859,87,4155,254240],"plugin_category":[59],"plugin_contributors":[247396],"plugin_business_model":[],"class_list":["post-269222","plugin","type-plugin","status-publish","hentry","plugin_tags-backup","plugin_tags-export","plugin_tags-import","plugin_tags-migration","plugin_tags-wpbkp","plugin_category-utilities-and-tools","plugin_contributors-mksddn","plugin_committers-mksddn"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/mksddn-migrate-content.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>MksDdn Migrate Content is a clean-room migration suite that packages your site into deterministic <code>.wpbkp<\/code> archives. Each bundle contains a manifest, checksum, database segments, media, selected files, and user decisions, so imports stay predictable.<\/p>\n\n<h4>Why MksDdn Migrate Content?<\/h4>\n\n<ul>\n<li><strong>Dual export modes<\/strong> \u2013 choose Full Site (database + uploads\/plugins\/mu-plugins\/themes) or Selected Content (multi-select posts\/pages\/CPTs) with or without referenced media.<\/li>\n<li><strong>Chunked pipeline<\/strong> \u2013 large archives stream through REST API endpoints with resume tokens, so multi\u2011GB transfers survive flaky networks.<\/li>\n<li><strong>User merge control<\/strong> \u2013 compare archive vs current users and decide how to merge conflicts.<\/li>\n<li><strong>Theme import mode<\/strong> \u2013 when a theme archive is detected, choose replace vs merge before applying changes.<\/li>\n<li><strong>Integrity &amp; safety<\/strong> \u2013 <code>.wpbkp<\/code> archives ship with manifests and checksums; imports verify capabilities, nonces, and disk space before touching data.<\/li>\n<\/ul>\n\n<h4>Feature Highlights<\/h4>\n\n<ul>\n<li>Archive format with manifest, checksum, and payload folders (<code>content.json<\/code>, <code>media\/<\/code>, <code>options\/<\/code>, filesystem slices).<\/li>\n<li>Media scanner that collects featured images, galleries, attachments referenced inside blocks or shortcodes.<\/li>\n<li>File-system coverage for <code>wp-content\/uploads<\/code>, <code>wp-content\/plugins<\/code>, <code>wp-content\/mu-plugins<\/code>, <code>wp-content\/themes<\/code> with filters to skip VCS\/system files.<\/li>\n<li>Chunked upload\/download JS client with live progress, auto-resume, and graceful fallback to direct transfer.<\/li>\n<li>Server file import - select backup files directly from <code>wp-content\/uploads\/mksddn-mc\/imports\/<\/code> directory without browser uploads.<\/li>\n<li>Custom <code>.wpbkp<\/code> drag-and-drop uploader with checksum guardrails (UI polish deferred to next milestone, functionality already complete).<\/li>\n<\/ul>\n\n<h3>Architecture<\/h3>\n\n<p>The plugin follows SOLID principles and WordPress Coding Standards with a clean, modular architecture:<\/p>\n\n<h4>Service Container &amp; Dependency Injection<\/h4>\n\n<ul>\n<li>Centralized <code>ServiceContainer<\/code> manages all dependencies<\/li>\n<li>Service Providers (<code>CoreServiceProvider<\/code>, <code>AdminServiceProvider<\/code>, <code>ExportServiceProvider<\/code>, <code>ImportServiceProvider<\/code>, <code>ChunkServiceProvider<\/code>) register services<\/li>\n<li>All dependencies resolved through container, eliminating direct instantiation<\/li>\n<li>Full support for interface-based dependency injection<\/li>\n<\/ul>\n\n<h4>Request Handlers<\/h4>\n\n<ul>\n<li><code>ExportRequestHandler<\/code> - handles export requests<\/li>\n<li><code>ImportRequestHandler<\/code> - delegates to specialized import services (supports unified import via <code>UnifiedImportOrchestrator<\/code>)<\/li>\n<li><code>UserMergeRequestHandler<\/code> - processes user merge operations<\/li>\n<li><code>ThemePreviewRequestHandler<\/code> - handles theme preview cancel operations<\/li>\n<li><code>ChunkRestController<\/code> - REST API controller for chunked upload\/download operations<\/li>\n<li>All handlers implement corresponding interfaces for testability<\/li>\n<\/ul>\n\n<h4>Service Layer<\/h4>\n\n<ul>\n<li><code>SelectedContentImportService<\/code> - handles selected content imports<\/li>\n<li><code>FullSiteImportService<\/code> - manages full site imports<\/li>\n<li><code>ThemeImportService<\/code> - handles theme archive imports<\/li>\n<li><code>UnifiedImportOrchestrator<\/code> - orchestrates unified import with automatic type detection and routing<\/li>\n<li><code>ImportTypeDetector<\/code> - detects import type (full site or selected content) from archive file<\/li>\n<li><code>ImportFileValidator<\/code> - validates uploaded files<\/li>\n<li><code>ImportPayloadPreparer<\/code> - prepares import payloads<\/li>\n<li><code>ServerBackupScanner<\/code> - scans and validates backup files on the server<\/li>\n<li><code>ResponseHandler<\/code> - manages redirects and status messages<\/li>\n<li><code>NotificationService<\/code> - handles user notifications<\/li>\n<li><code>ProgressService<\/code> - tracks operation progress<\/li>\n<li><code>ErrorHandler<\/code> - centralized error handling and logging<\/li>\n<li><code>UserDiffBuilder<\/code> - builds user difference comparison<\/li>\n<li><code>UserMergeApplier<\/code> - applies user merge operations<\/li>\n<li><code>ThemePreviewStore<\/code> - stores pending theme import previews<\/li>\n<li><code>DeactivationCleanup<\/code> - clears temporary upload state and service directories when the plugin is deactivated<\/li>\n<\/ul>\n\n<h4>Contracts (Interfaces)<\/h4>\n\n<p>All key components implement interfaces:\n* <code>ExporterInterface<\/code>, <code>ImporterInterface<\/code>\n* <code>MediaCollectorInterface<\/code>, <code>ChunkJobRepositoryInterface<\/code>\n* <code>UserPreviewStoreInterface<\/code>, <code>ThemePreviewStoreInterface<\/code>, <code>UserDiffBuilderInterface<\/code>, <code>UserMergeApplierInterface<\/code>\n* <code>NotificationServiceInterface<\/code>, <code>ProgressServiceInterface<\/code>\n* <code>ArchiveHandlerInterface<\/code>, <code>ValidatorInterface<\/code>\n* Request handler interfaces for all handlers<\/p>\n\n<h4>Error Handling<\/h4>\n\n<ul>\n<li>Specialized exceptions: <code>ValidationException<\/code>, <code>FileOperationException<\/code>, <code>DatabaseOperationException<\/code>, <code>ImportException<\/code>, <code>ExportException<\/code><\/li>\n<li>Centralized <code>ErrorHandler<\/code> for consistent error processing<\/li>\n<li>Proper logging and user-friendly error messages<\/li>\n<li>Validation classes: <code>ArchiveValidator<\/code>, <code>ImportDataValidator<\/code>, <code>ExportDataValidator<\/code>, <code>FileValidator<\/code><\/li>\n<\/ul>\n\n<h4>Performance<\/h4>\n\n<ul>\n<li><code>BatchLoader<\/code> for optimized database queries (prevents N+1 problems)<\/li>\n<li>Efficient media collection with batch processing (<code>AttachmentCollector<\/code>)<\/li>\n<li>Chunked transfer for large files via REST API (<code>ChunkRestController<\/code>)<\/li>\n<li>Memory-efficient streaming for large archives<\/li>\n<li><code>FullArchivePayload<\/code> for efficient archive payload handling<\/li>\n<li><code>ContentCollector<\/code> for filesystem content collection<\/li>\n<\/ul>\n\n<h4>Security<\/h4>\n\n<ul>\n<li>All admin operations check <code>current_user_can('manage_options')<\/code><\/li>\n<li>Nonce verification for all forms and AJAX requests<\/li>\n<li>REST API endpoints protected with permission callbacks<\/li>\n<li>Input sanitization using WordPress sanitization functions<\/li>\n<li>Output escaping with <code>esc_html()<\/code>, <code>esc_attr()<\/code>, <code>esc_url()<\/code><\/li>\n<li>File upload validation with MIME type checking<\/li>\n<li>Path traversal protection for server file access (<code>ServerBackupScanner<\/code>)<\/li>\n<li>Path traversal protection for archive extraction (full site + theme import)<\/li>\n<li><code>SiteUrlGuard<\/code> prevents accidental site URL changes during import<\/li>\n<li><code>ImportLock<\/code> prevents concurrent import operations<\/li>\n<li><code>DomainReplacer<\/code> safely handles URL replacement during migrations<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>mksddn-migrate-content<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install via the Plugins page in WordPress.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Go to Tools \u2192 Migrate Content to run exports and imports.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20is%20inside%20a%20%60.wpbkp%60%20archive%3F\"><h3>What is inside a `.wpbkp` archive?<\/h3><\/dt>\n<dd><p>Each archive stores a manifest (checksums, metadata, timestamps), JSON payloads for selected entities, optional filesystem slices (uploads\/plugins\/themes), media binaries, and user-merge selections. Imports verify the manifest before processing.<\/p><\/dd>\n<dt id=\"how%20is%20%60.wpbkp%60%20different%20from%20%60.json%60%20exports%3F\"><h3>How is `.wpbkp` different from `.json` exports?<\/h3><\/dt>\n<dd><p>.json exports are lightweight (content only) and convenient for quick edits. <code>.wpbkp<\/code> adds media, filesystem slices, and checksums. Use <code>.wpbkp<\/code> for full fidelity.<\/p><\/dd>\n<dt id=\"does%20it%20support%20acf%20and%20custom%20post%20types%3F\"><h3>Does it support ACF and custom post types?<\/h3><\/dt>\n<dd><p>Yes. Any public post type plus Advanced Custom Fields metadata is exported\/imported. Taxonomies, menus, widgets, and serialized options are also covered.<\/p><\/dd>\n<dt id=\"how%20do%20chunked%20uploads%20resume%3F\"><h3>How do chunked uploads resume?<\/h3><\/dt>\n<dd><p>The JS client splits files into 5\u201310\u202fMB chunks (auto-tuned by server limits). Each chunk is hashed and acknowledged via REST API endpoints (<code>mksddn\/v1\/chunk\/*<\/code>). If the browser reloads, the resume token restarts from the last confirmed chunk.<\/p><\/dd>\n<dt id=\"how%20do%20i%20import%20a%20backup%20file%20from%20the%20server%3F\"><h3>How do I import a backup file from the server?<\/h3><\/dt>\n<dd><p>You can import backup files directly from the server without uploading them through the browser. Place your <code>.wpbkp<\/code> or <code>.json<\/code> archive files in the <code>wp-content\/uploads\/mksddn-mc\/imports\/<\/code> directory (the plugin will create this directory automatically if it doesn't exist). Then, in the import form, toggle the \"Select from server\" option instead of \"Upload file\". The plugin will scan the imports directory and display available files with their size and modification date. Select the desired file and proceed with the import. This method is especially useful for large files or when you have direct server access via FTP\/SFTP.<\/p><\/dd>\n<dt id=\"what%20is%20cleaned%20up%20when%20the%20plugin%20is%20deactivated%3F\"><h3>What is cleaned up when the plugin is deactivated?<\/h3><\/dt>\n<dd><p>Chunk upload state under <code>wp-content\/uploads\/mksddn-mc\/jobs\/<\/code>, theme replace backups under <code>wp-content\/mksddn-mc\/theme-backups\/<\/code>, the import lock transient, server-backup list cache, user\/theme preview transients, optional <code>mksddn_mc_storage_path<\/code>, and theme preview index data. Files in <code>wp-content\/uploads\/mksddn-mc\/imports\/<\/code> are not removed by default; set the <code>mksddn_mc_deactivation_clear_imports<\/code> filter to true if you want that directory emptied on deactivation.<\/p><\/dd>\n<dt id=\"can%20i%20merge%20users%20without%20overwriting%20existing%20accounts%3F\"><h3>Can I merge users without overwriting existing accounts?<\/h3><\/dt>\n<dd><p>Yes. The user merge dialog shows archive\/current rows with conflict indicators. You can keep current roles, replace metadata, or skip entire accounts.<\/p><\/dd>\n<dt id=\"does%20it%20touch%20production%20files%20directly%3F\"><h3>Does it touch production files directly?<\/h3><\/dt>\n<dd><p>Filesystem operations run through <code>WP_Filesystem<\/code>, honor capability checks, and avoid <code>.git<\/code>, <code>.svn<\/code>, and OS temp files. Full-site imports back up theme directories before replace and restore them if extraction fails.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.1.7<\/h4>\n\n<ul>\n<li>Added: On plugin deactivation, <code>DeactivationCleanup<\/code> removes chunk job files, theme import backups under <code>wp-content\/mksddn-mc\/theme-backups\/<\/code>, import lock and related transients, and clears theme preview data; optional filter <code>mksddn_mc_deactivation_clear_imports<\/code> may empty the server imports directory; action <code>mksddn_mc_deactivation_cleanup<\/code> runs after the default steps.<\/li>\n<li>Fixed: Selected content import \u2014 Polylang translation links when the bundle includes every post in a group (<code>_pll_translations<\/code> remapped, <code>pll_save_post_translations()<\/code>).<\/li>\n<\/ul>\n\n<h4>2.1.6<\/h4>\n\n<ul>\n<li>Rollback: Codebase restored to the 2.1.4 state; supersedes 2.1.5.<\/li>\n<\/ul>\n\n<h4>2.1.5<\/h4>\n\n<ul>\n<li>Enhanced: Full-site export \u2014 time-sliced runner, incremental database reads, resumable chunked download, clearer errors for missing\/unreadable files.<\/li>\n<li>Changed: Export step time budget in settings; removed deprecated helpers.<\/li>\n<\/ul>\n\n<h4>2.1.4<\/h4>\n\n<ul>\n<li>Fixed: User merge replace mode \u2014 <code>resolve_remote_user_login()<\/code> uses loose <code>sanitize_user()<\/code> first; <code>force_wp_users_login_and_password()<\/code> updates <code>wp_users<\/code> after <code>wp_update_user()<\/code> so archive login and password hash stay paired (avoids old username + new password).<\/li>\n<\/ul>\n\n<h4>2.1.3<\/h4>\n\n<ul>\n<li>Added: Export memory management (<code>ExportMemoryHelper<\/code>) with configurable min\/max export memory limits in <code>PluginConfig<\/code> for more stable full-site exports.<\/li>\n<li>Enhanced: Full site export\/import now includes <code>wp-content\/mu-plugins<\/code> alongside uploads, plugins, and themes.<\/li>\n<li>Fixed: User merge \u2014 when updating existing users, login is adjusted to stay unique if the archive login collides with another account.<\/li>\n<\/ul>\n\n<h4>2.1.2<\/h4>\n\n<ul>\n<li>Fixed: UnifiedImportOrchestrator constructor now receives ThemePreviewStoreInterface as 5th argument (fixes full-site import error when wrong service was passed).<\/li>\n<li>Enhanced: AdminServiceProvider - explicit use of ThemePreviewStoreInterface for UnifiedImportOrchestrator and related registrations.<\/li>\n<\/ul>\n\n<h4>2.1.1<\/h4>\n\n<ul>\n<li>Added: Theme import preview - preview theme changes before applying.<\/li>\n<li>Added: Russian translation (ru_RU).<\/li>\n<li>Enhanced: Theme import - full theme replacement, improved error handling and validation.<\/li>\n<li>Enhanced: ChunkJobRepository - improved directory handling and cleanup for chunked transfers.<\/li>\n<li>Enhanced: FullSiteImportService - WooCommerce maintenance and plugin reactivation after import.<\/li>\n<li>Enhanced: Theme export section descriptions for clarity.<\/li>\n<\/ul>\n\n<h4>2.1.0<\/h4>\n\n<ul>\n<li>Added: Theme export and import functionality - users can now export and import WordPress themes with merge and replace mode options.<\/li>\n<li>Enhanced: Export and Import Handlers for improved data handling - added local dates, modified dates, menu order, comment status, and parent page slug to exports. Import now sorts items by parent-child relationships.<\/li>\n<li>Enhanced: Taxonomy handling in Export and Import Handlers - preloads taxonomy terms for all post types including Polylang language taxonomy, improving export accuracy and import consistency.<\/li>\n<li>Enhanced: DomainReplacer for improved URL normalization - prevents port duplication in URLs during domain replacements.<\/li>\n<li>Enhanced: Import locking mechanism with improved error handling and automatic lock release on fatal errors, ensuring only one import can run at a time.<\/li>\n<li>Enhanced: Admin styles with new flexbox layout classes for better organization and responsiveness of selection elements.<\/li>\n<li>Enhanced: Theme import and export with improved logging, optimized theme retrieval, and validation to prevent deletion of active or parent themes.<\/li>\n<li>Refactored: Removed deprecated import templates and sections from admin interface for cleaner codebase.<\/li>\n<\/ul>\n\n<h4>2.0.3<\/h4>\n\n<ul>\n<li>Fixed: Media files are now properly linked to pages\/posts during wpbkp import. ACF Image fields correctly receive new attachment IDs for all return formats.<\/li>\n<\/ul>\n\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>Fixed: Partial export material selection now displays items from all languages when Polylang is installed.<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Enhanced: FullDatabaseImporter type safety with integer casting for batch offsets.<\/li>\n<li>Enhanced: UserMergeApplier recursive validation for incomplete objects in user meta, preventing import errors.<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Added: Unified import feature with automatic type detection - single import form automatically detects and routes full site or selected content imports.<\/li>\n<li>Added: Import locking mechanism to prevent concurrent import operations and ensure data integrity.<\/li>\n<li>Added: AJAX search functionality for post selection, improving usability when selecting content for export.<\/li>\n<li>Enhanced: Download progress handling in chunked transfers for better user experience.<\/li>\n<li>Enhanced: Security with improved nonce verification in unified import orchestrator.<\/li>\n<li>Refactored: Import handling architecture with unified orchestrator for cleaner code organization.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added: Post-import maintenance tasks (cache flushing, WooCommerce maintenance, plugin reactivation hooks).<\/li>\n<li>Enhanced: SQL safety with improved sanitization and escaping for database operations.<\/li>\n<li>Enhanced: Memory management with adaptive strategies to prevent exhaustion during large imports.<\/li>\n<li>Enhanced: Error handling and logging throughout import processes.<\/li>\n<li>Added: RedirectTrait for streamlined HTTP redirect handling during background imports.<\/li>\n<li>Refactored: Database row insertion logic for improved performance.<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Enhanced: Improved memory management in FullArchivePayload - original memory limit is now stored and restored during JSON decoding for large files, ensuring efficient resource handling.<\/li>\n<li>Enhanced: Enhanced domain signature collection in DomainReplacer to include port and scheme information, improving URL replacement accuracy during migrations.<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Fixed: Improved compliance with WordPress.org plugin guidelines - all scripts\/styles now properly enqueued, conditional loading for admin files, removed inline code.<\/li>\n<li>Enhanced: Real-time import progress tracking via REST API polling without page refresh.<\/li>\n<li>Enhanced: Improved background import execution with fastcgi_finish_request() support for uninterrupted processing.<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Added MKSDDN_MC_BASENAME constant for plugin path management.<\/li>\n<li>Introduced dedicated CSS file for import progress styling.<\/li>\n<li>Added user warnings to prevent accidental lockouts when deselecting all users.<\/li>\n<li>Enhanced user selection handling to preserve current admin user during imports.<\/li>\n<li>Improved data sanitization across handlers.<\/li>\n<li>Added import completion notices in NotificationService.<\/li>\n<li>Implemented backup and restore of critical options during full database imports.<\/li>\n<li>Enhanced file verification in FullContentImporter.<\/li>\n<li>Refactored FilesystemHelper to initialize permissions dynamically.<\/li>\n<li>Enhanced ImportProgressPage with static CSS\/JS generation methods.<\/li>\n<\/ul>\n\n<h4>1.2.5<\/h4>\n\n<ul>\n<li>Refactored BatchLoader to enhance database query efficiency by replacing placeholder-based queries with sanitized ID strings, improving security and performance.<\/li>\n<li>Implemented dedicated admin styles and scripts with separate CSS and JavaScript files for better code organization and maintainability.<\/li>\n<li>Added CSS for progress bars, sections, grids, and cards to enhance the admin interface.<\/li>\n<li>Introduced JavaScript for progress bar functionality with dynamic updates during content migration.<\/li>\n<li>Refactored code to remove deprecated inline styles and scripts, promoting better separation of concerns.<\/li>\n<li>Updated comments for clarity on caching and sanitization practices.<\/li>\n<li>Added PHPCS ignore comments for specific cases to address coding standards compliance.<\/li>\n<\/ul>\n\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Enhanced ACF field export and import support for groups and repeaters.<\/li>\n<li>Improved ACF field handling in BatchLoader by using get_fields() directly for better efficiency.<\/li>\n<li>Enhanced link field processing in repeaters and groups during import operations.<\/li>\n<li>Refactored ACF field retrieval in WpFunctionsWrapper to ensure consistent array return types.<\/li>\n<li>Improved data integrity during ACF imports with better field value handling and recursive media remapping.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Enhanced FilesystemHelper with dynamic definition of FS_CHMOD_FILE and FS_CHMOD_DIR based on existing WordPress file permissions, improving filesystem operations compatibility.<\/li>\n<li>Added ensure_directory() method to FilesystemHelper for consistent directory creation with proper error handling.<\/li>\n<li>Refactored directory creation logic in ChunkJobRepository, ChunkRestController, and FullContentExporter to utilize FilesystemHelper for improved error handling and consistency.<\/li>\n<li>Improved file permissions handling in put_stream() method to ensure proper chmod after streaming operations.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Updated PHPCS ignore comments for set_time_limit and ini_set to current standards.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added real-time progress tracking for import operations with visual progress bar.<\/li>\n<li>Implemented incremental database import to optimize memory usage for large backups.<\/li>\n<li>Enhanced memory and time limit management based on file size to prevent failures.<\/li>\n<li>Added output flushing for better responsiveness during import.<\/li>\n<li>Improved error handling and logging for large file imports.<\/li>\n<li>Removed unused auto-increment key handling code for cleaner codebase.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added server file import feature - users can now select backup files directly from the server imports directory.<\/li>\n<li>Introduced ServerBackupScanner service for scanning and validating backup files on the server.<\/li>\n<li>Added JavaScript module (server-file-selector.js) for dynamic file selection with AJAX loading.<\/li>\n<li>Updated import forms (full site and selected content) with source toggle (upload vs server).<\/li>\n<li>Enhanced FullSiteImportService and SelectedContentImportService to support server file imports.<\/li>\n<li>Added AJAX endpoint (mksddn_mc_get_server_backups) for retrieving available backup files.<\/li>\n<li>Implemented file caching via WordPress transients to improve performance.<\/li>\n<li>Added path traversal protection for secure server file access.<\/li>\n<li>Server file selector displays file size and modification date for better user experience.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed duplicate PRIMARY KEY errors during full site import (wp_postmeta, wp_actionscheduler_actions).<\/li>\n<li>Auto-increment PRIMARY KEY fields are now excluded from inserts to let database generate new values.<\/li>\n<li>Added INSERT IGNORE fallback for handling duplicate key conflicts during import.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Clean-room <code>.wpbkp<\/code> archive format with manifest + checksum validator.<\/li>\n<li>Full-site export\/import (database + uploads\/plugins\/themes) with streaming chunked transfer.<\/li>\n<li>Selected content export with multi-select CPT picker, media toggle, and JSON fallback.<\/li>\n<li>Media collector\/restorer for featured images, galleries, and inline attachments.<\/li>\n<li>Chunked upload\/download pipeline with resume tokens, progress UI, and safe fallbacks.<\/li>\n<li>User merge matrix covering new, conflicting, and existing accounts with role\/metasync choices.<\/li>\n<li>Refactored architecture following SOLID principles with Service Container and Dependency Injection.<\/li>\n<li>All components use interfaces (Contracts) for improved testability and maintainability.<\/li>\n<li>Separated concerns: Request Handlers, Services, and Views are clearly divided.<\/li>\n<li>Specialized exception handling for better error management.<\/li>\n<li>Optimized database queries using BatchLoader to prevent N+1 problems.<\/li>\n<\/ul>","raw_excerpt":"Reliable chunked migrations powered by custom .wpbkp archives.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/269222","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=269222"}],"author":[{"embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/mksddn"}],"wp:attachment":[{"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=269222"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=269222"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=269222"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=269222"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=269222"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/en-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=269222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}