From 577d07e5f3bc0da5c72d6193923b56805ac2f51f Mon Sep 17 00:00:00 2001 From: kodinkat Date: Mon, 27 Apr 2026 13:56:36 +0100 Subject: [PATCH 1/8] Implement file job management in Disciple.Tools Migration plugin - Introduced a new class, Disciple_Tools_Migration_File_Job_Store, to handle file-mode migration job storage and management. - Added functionality for scheduling and pruning expired file migration jobs based on user-defined retention settings. - Enhanced the import process with AJAX actions for file job completion, failure, and cancellation notifications. - Updated the admin interface to support file job management, including displaying past jobs and their statuses. - Improved settings to allow configuration of maximum age for stored file migration jobs, defaulting to 7 days. - Refactored import logic to accommodate file job handling, ensuring better user experience and error management. --- admin/admin-menu-and-tabs.php | 3 +- admin/class-dt-migration-import-ajax.php | 203 +++++++++- admin/class-dt-migration-tab-import.php | 174 ++++++++- admin/class-dt-migration-tab-settings.php | 45 +++ admin/js/import.js | 101 ++++- disciple-tools-migration.php | 38 ++ .../class-dt-migration-file-job-store.php | 357 ++++++++++++++++++ 7 files changed, 899 insertions(+), 22 deletions(-) create mode 100644 includes/class-dt-migration-file-job-store.php diff --git a/admin/admin-menu-and-tabs.php b/admin/admin-menu-and-tabs.php index a242216..e62338b 100644 --- a/admin/admin-menu-and-tabs.php +++ b/admin/admin-menu-and-tabs.php @@ -93,7 +93,8 @@ public static function get_settings(): array { 'jwt_token_set_at' => 0, ], 'file' => [ - 'compression' => 'zip', + 'compression' => 'zip', + 'job_max_age_days' => defined( 'DT_MIGRATION_FILE_JOB_MAX_AGE_DAYS' ) ? (int) constant( 'DT_MIGRATION_FILE_JOB_MAX_AGE_DAYS' ) : 7, ], ]; diff --git a/admin/class-dt-migration-import-ajax.php b/admin/class-dt-migration-import-ajax.php index 302d3f4..6a6748d 100644 --- a/admin/class-dt-migration-import-ajax.php +++ b/admin/class-dt-migration-import-ajax.php @@ -16,6 +16,10 @@ class Disciple_Tools_Migration_Import_Ajax { public function __construct() { add_action( 'wp_ajax_dt_migration_import_batch', [ $this, 'handle_import_batch' ] ); add_action( 'wp_ajax_dt_migration_preflight', [ $this, 'handle_preflight' ] ); + add_action( 'wp_ajax_dt_migration_file_job_delete', [ $this, 'handle_file_job_delete' ] ); + add_action( 'wp_ajax_dt_migration_file_job_complete', [ $this, 'handle_file_job_complete' ] ); + add_action( 'wp_ajax_dt_migration_file_job_failed', [ $this, 'handle_file_job_failed' ] ); + add_action( 'wp_ajax_dt_migration_file_job_cancelled', [ $this, 'handle_file_job_cancelled' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); } @@ -37,7 +41,7 @@ public function enqueue_scripts( string $hook ) : void { 'dt-migration-import', $plugin_url . 'admin/js/import.js', [ 'jquery' ], - '0.3.5', + '0.4.0', true ); wp_localize_script( @@ -46,6 +50,7 @@ public function enqueue_scripts( string $hook ) : void { [ 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'dt_migration_import' ), + 'fileJobId' => '', 'strings' => [ 'continue' => __( 'Continue', 'disciple-tools-migration' ), 'confirm' => __( 'Confirm', 'disciple-tools-migration' ), @@ -62,6 +67,9 @@ public function enqueue_scripts( string $hook ) : void { 'preflightRunning' => __( 'Running preflight…', 'disciple-tools-migration' ), 'preflightFailed' => __( 'Preflight request failed.', 'disciple-tools-migration' ), 'runPreflight' => __( 'Run preflight', 'disciple-tools-migration' ), + 'deleteFileJobConfirm' => __( 'Delete this file migration job and its stored data?', 'disciple-tools-migration' ), + 'deleteFileJobFailed' => __( 'Could not delete the job.', 'disciple-tools-migration' ), + 'preflightFileJobMissing' => __( 'No file migration job is active. Use Upload & Preview or Retry from the job list first.', 'disciple-tools-migration' ), ], ] ); @@ -106,6 +114,11 @@ private function get_modal_css() : string { .dt-migration-error-details { margin-top: 16px; padding: 12px; background: #fcf0f1; border: 1px solid #d63638; border-radius: 4px; } .dt-migration-error-details strong { display: block; margin-bottom: 8px; color: #b32d2e; } .dt-migration-error-scroll { max-height: 200px; overflow-y: auto; padding: 8px; background: #fff; border: 1px solid #c3c4c7; border-radius: 4px; white-space: pre-wrap; font-size: 12px; line-height: 1.4; } + .dt-migration-past-jobs { margin-top: 8px; } + .dt-migration-past-jobs .dt-migration-job-pill { display: inline-block; padding: 2px 10px; border-radius: 12px; font-size: 11px; font-weight: 600; } + .dt-migration-past-jobs .dt-migration-job-pill--success { background: #00a32a; color: #fff; } + .dt-migration-past-jobs .dt-migration-job-pill--failed { background: #d63638; color: #fff; } + .dt-migration-past-jobs .dt-migration-job-pill--neutral { background: #dcdcde; color: #1d2327; } '; } @@ -267,7 +280,62 @@ public function handle_import_batch() : void { } /** - * Handles import batch requests for file mode (payload in transient). + * Resolves the file-mode job payload for the current user, or returns an error structure. + * + * @param int $user_id + * @return array{ payload: array, job_id: string }|array{ error: string } + */ + private function resolve_file_job_payload( int $user_id ) { + $raw = isset( $_POST['file_job_id'] ) ? wp_unslash( $_POST['file_job_id'] ) : ''; + if ( is_array( $raw ) ) { + $raw = ''; + } + $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( (string) $raw ); + if ( $job_id === '' ) { + return [ + 'error' => __( 'No file migration job was specified. Use Upload & Preview or Retry from the job list.', 'disciple-tools-migration' ), + ]; + } + $payload = Disciple_Tools_Migration_File_Job_Store::get_payload( $user_id, $job_id ); + if ( $payload === null || ! Disciple_Tools_Migration_File_Job_Store::is_valid_migration_payload( $payload ) ) { + return [ + 'error' => __( 'That migration file is not available. Upload the JSON again or use Retry on a job that still has a stored file.', 'disciple-tools-migration' ), + ]; + } + return [ 'payload' => $payload, 'job_id' => $job_id ]; + } + + /** + * Marks a job as running on the first import step when appropriate. + * + * @param int $user_id + * @param string $job_id + * @param string $step + * @param int $offset + * @param bool $init_records + * @return void + */ + private function maybe_mark_file_job_running( int $user_id, string $job_id, string $step, int $offset, bool $init_records ) : void { + $meta = Disciple_Tools_Migration_File_Job_Store::get_job_meta( $user_id, $job_id ); + if ( $meta === null ) { + return; + } + $st = (string) ( $meta['status'] ?? '' ); + if ( $st === Disciple_Tools_Migration_File_Job_Store::STATUS_RUNNING ) { + return; + } + if ( ! in_array( $st, [ Disciple_Tools_Migration_File_Job_Store::STATUS_READY, Disciple_Tools_Migration_File_Job_Store::STATUS_FAILED, Disciple_Tools_Migration_File_Job_Store::STATUS_CANCELLED ], true ) ) { + return; + } + $is_first = ( $step === 'settings' ) || ( $step === 'records' && $offset === 0 && $init_records ); + if ( ! $is_first ) { + return; + } + Disciple_Tools_Migration_File_Job_Store::set_status( $user_id, $job_id, Disciple_Tools_Migration_File_Job_Store::STATUS_RUNNING ); + } + + /** + * Handles import batch requests for file mode (payload stored in options per job). * * @param string $step 'settings' or 'records' * @param array $settings Migration settings. @@ -276,15 +344,25 @@ private function handle_file_mode_batch( string $step, array $settings ) : void // Nonce verified in handle_import_batch() via check_ajax_referer( 'dt_migration_import', 'nonce' ). // phpcs:disable WordPress.Security.NonceVerification.Missing - $transient_key = 'dt_migration_file_payload_' . get_current_user_id(); - $payload = get_transient( $transient_key ); + $user_id = get_current_user_id(); + $resolved = $this->resolve_file_job_payload( $user_id ); + if ( isset( $resolved['error'] ) ) { + wp_send_json_error( [ 'message' => $resolved['error'] ] ); + } + $payload = $resolved['payload']; + $job_id = $resolved['job_id']; + + $post_type = isset( $_POST['post_type'] ) ? sanitize_key( wp_unslash( $_POST['post_type'] ) ) : ''; + $offset = isset( $_POST['offset'] ) ? absint( $_POST['offset'] ) : 0; + $init_q = ! empty( $_POST['init_records_import'] ); + $this->maybe_mark_file_job_running( $user_id, $job_id, $step, 'records' === $step ? $offset : 0, 'records' === $step && $init_q ); $export_block = ( is_array( $payload ) && isset( $payload['export'] ) && is_array( $payload['export'] ) ) ? $payload['export'] : []; $has_dt = ! empty( $export_block['dt_settings'] ); $has_users = array_key_exists( 'system_users', $export_block ) && is_array( $export_block['system_users'] ); if ( ! is_array( $payload ) || ( ! $has_dt && ! $has_users ) ) { wp_send_json_error( [ - 'message' => __( 'No migration file loaded or payload expired. Please upload the file again.', 'disciple-tools-migration' ), + 'message' => __( 'That migration file is not available. Upload the JSON again or use Retry on a job that still has a stored file.', 'disciple-tools-migration' ), ] ); } @@ -313,10 +391,7 @@ private function handle_file_mode_batch( string $step, array $settings ) : void } if ( $step === 'records' ) { - $post_type = isset( $_POST['post_type'] ) ? sanitize_key( wp_unslash( $_POST['post_type'] ) ) : ''; - $offset = isset( $_POST['offset'] ) ? absint( $_POST['offset'] ) : 0; - $limit = 50; - $init_q = ! empty( $_POST['init_records_import'] ); + $limit = 50; if ( empty( $post_type ) ) { wp_send_json_error( [ 'message' => __( 'Post type required.', 'disciple-tools-migration' ) ] ); @@ -422,14 +497,18 @@ public function handle_preflight() : void { * @return array|array{ error: string } */ private function preflight_file_payload( array $settings_map, array $records_selected_in ) : array { - $transient_key = 'dt_migration_file_payload_' . get_current_user_id(); - $payload = get_transient( $transient_key ); + $user_id = get_current_user_id(); + $resolved = $this->resolve_file_job_payload( $user_id ); + if ( isset( $resolved['error'] ) ) { + return [ 'error' => $resolved['error'] ]; + } + $payload = $resolved['payload']; $export_block = ( is_array( $payload ) && isset( $payload['export'] ) && is_array( $payload['export'] ) ) ? $payload['export'] : []; $has_dt = ! empty( $export_block['dt_settings'] ); $has_users = array_key_exists( 'system_users', $export_block ) && is_array( $export_block['system_users'] ); if ( ! is_array( $payload ) || ( ! $has_dt && ! $has_users ) ) { - return [ 'error' => __( 'No migration file loaded or payload expired. Please upload the file again.', 'disciple-tools-migration' ) ]; + return [ 'error' => __( 'That migration file is not available. Upload the JSON again or use Retry on a job that still has a stored file.', 'disciple-tools-migration' ) ]; } $records_all = isset( $payload['records'] ) && is_array( $payload['records'] ) ? $payload['records'] : []; @@ -564,4 +643,104 @@ private function preflight_api_payload( array $settings, array $settings_map, ar 'info' => $info_out, ]; } + + /** + * AJAX: remove a file migration job and its stored payload. + * + * @return void + */ + public function handle_file_job_delete() : void { + check_ajax_referer( 'dt_migration_import', 'nonce' ); + + if ( ! current_user_can( 'manage_dt' ) ) { + wp_send_json_error( [ 'message' => __( 'Insufficient permissions.', 'disciple-tools-migration' ) ] ); + } + + $raw = isset( $_POST['job_id'] ) ? wp_unslash( $_POST['job_id'] ) : ''; + if ( is_array( $raw ) ) { + $raw = ''; + } + $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( (string) $raw ); + if ( $job_id === '' ) { + wp_send_json_error( [ 'message' => __( 'Invalid job.', 'disciple-tools-migration' ) ] ); + } + + Disciple_Tools_Migration_File_Job_Store::delete_job( get_current_user_id(), $job_id ); + wp_send_json_success( [ 'deleted' => true ] ); + } + + /** + * AJAX: mark a file job successful and clear stored JSON. + * + * @return void + */ + public function handle_file_job_complete() : void { + check_ajax_referer( 'dt_migration_import', 'nonce' ); + + if ( ! current_user_can( 'manage_dt' ) ) { + wp_send_json_error( [ 'message' => __( 'Insufficient permissions.', 'disciple-tools-migration' ) ] ); + } + + $raw = isset( $_POST['file_job_id'] ) ? wp_unslash( $_POST['file_job_id'] ) : ''; + if ( is_array( $raw ) ) { + $raw = ''; + } + $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( (string) $raw ); + if ( $job_id === '' ) { + wp_send_json_error( [ 'message' => __( 'Invalid job.', 'disciple-tools-migration' ) ] ); + } + + Disciple_Tools_Migration_File_Job_Store::mark_success_and_clear_payload( get_current_user_id(), $job_id ); + wp_send_json_success( [ 'ok' => true ] ); + } + + /** + * AJAX: mark a file job as failed (payload kept for retry). + * + * @return void + */ + public function handle_file_job_failed() : void { + check_ajax_referer( 'dt_migration_import', 'nonce' ); + + if ( ! current_user_can( 'manage_dt' ) ) { + wp_send_json_error( [ 'message' => __( 'Insufficient permissions.', 'disciple-tools-migration' ) ] ); + } + + $raw = isset( $_POST['file_job_id'] ) ? wp_unslash( $_POST['file_job_id'] ) : ''; + if ( is_array( $raw ) ) { + $raw = ''; + } + $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( (string) $raw ); + if ( $job_id === '' ) { + wp_send_json_error( [ 'message' => __( 'Invalid job.', 'disciple-tools-migration' ) ] ); + } + + Disciple_Tools_Migration_File_Job_Store::set_status( get_current_user_id(), $job_id, Disciple_Tools_Migration_File_Job_Store::STATUS_FAILED ); + wp_send_json_success( [ 'ok' => true ] ); + } + + /** + * AJAX: mark a file job as user-cancelled. + * + * @return void + */ + public function handle_file_job_cancelled() : void { + check_ajax_referer( 'dt_migration_import', 'nonce' ); + + if ( ! current_user_can( 'manage_dt' ) ) { + wp_send_json_error( [ 'message' => __( 'Insufficient permissions.', 'disciple-tools-migration' ) ] ); + } + + $raw = isset( $_POST['file_job_id'] ) ? wp_unslash( $_POST['file_job_id'] ) : ''; + if ( is_array( $raw ) ) { + $raw = ''; + } + $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( (string) $raw ); + if ( $job_id === '' ) { + wp_send_json_error( [ 'message' => __( 'Invalid job.', 'disciple-tools-migration' ) ] ); + } + + Disciple_Tools_Migration_File_Job_Store::set_status( get_current_user_id(), $job_id, Disciple_Tools_Migration_File_Job_Store::STATUS_CANCELLED ); + wp_send_json_success( [ 'ok' => true ] ); + } } diff --git a/admin/class-dt-migration-tab-import.php b/admin/class-dt-migration-tab-import.php index 392cb52..d40d529 100644 --- a/admin/class-dt-migration-tab-import.php +++ b/admin/class-dt-migration-tab-import.php @@ -56,12 +56,22 @@ class Disciple_Tools_Migration_Tab_Import { */ private $import_preview_channel = null; + /** + * Active file-mode job id (JSON stored in options) for the current preview, if any. + * + * @var string + */ + private $active_file_job_id = ''; + public function content() { $settings = Disciple_Tools_Migration_Menu::get_settings(); // Process any submitted connection test form before rendering. $this->process_form_fields( $settings ); $settings = Disciple_Tools_Migration_Menu::get_settings(); + if ( ! empty( $settings['enabled'] ) ) { + $this->try_load_file_job_from_query( $settings ); + } ?>
@@ -367,11 +377,12 @@ class="dt-migration-record-checkbox"

-
+

+ render_past_file_jobs_table( $settings ); ?> connection_error ) ) : ?>

connection_error ); ?>

@@ -488,7 +499,7 @@ class="dt-migration-record-checkbox"

- settings_preview ) ) : ?> + settings_preview ) && ( $this->import_preview_channel === 'api' || $this->import_preview_channel === 'file' ) ) : ?> render_import_modal_and_progress(); ?> @@ -918,9 +929,57 @@ private function process_file_upload( array $settings ) : void { return; } - $transient_key = 'dt_migration_file_payload_' . get_current_user_id(); - set_transient( $transient_key, $payload, 15 * MINUTE_IN_SECONDS ); + if ( ! class_exists( 'Disciple_Tools_Migration_File_Job_Store' ) ) { + $this->connection_error = esc_html__( 'Migration file jobs are not available. Please reload the page.', 'disciple-tools-migration' ); + return; + } + + $filename = isset( $_FILES['dt_migration_import_file']['name'] ) ? (string) $_FILES['dt_migration_import_file']['name'] : 'export.json'; + $job_id = Disciple_Tools_Migration_File_Job_Store::create_job( get_current_user_id(), $payload, $filename ); + if ( $job_id === '' ) { + $this->connection_error = esc_html__( 'Could not store the migration file for import. The server may be out of space or the export may be too large for your database settings.', 'disciple-tools-migration' ); + return; + } + $this->active_file_job_id = $job_id; + $this->build_file_preview_state_from_payload( $payload ); + if ( class_exists( 'Disciple_Tools_Migration_File_Job_Store' ) ) { + Disciple_Tools_Migration_File_Job_Store::prune_expired_jobs(); + } + } + + /** + * Fills preview state from a GET ?file_job= request (retry a past job). + * + * @param array $settings + * @return void + */ + private function try_load_file_job_from_query( array $settings ) : void { + if ( ! class_exists( 'Disciple_Tools_Migration_File_Job_Store' ) || $this->settings_preview !== null ) { + return; + } + if ( ! isset( $_GET['file_job'] ) ) { + return; + } + $raw = sanitize_text_field( wp_unslash( $_GET['file_job'] ) ); + $id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( $raw ); + if ( $id === '' ) { + return; + } + $user_id = get_current_user_id(); + $payload = Disciple_Tools_Migration_File_Job_Store::get_payload( $user_id, $id ); + if ( $payload === null || ! Disciple_Tools_Migration_File_Job_Store::is_valid_migration_payload( $payload ) ) { + $this->connection_error = esc_html__( 'That migration file job was not found, completed without a retriable copy, or you do not have access. Upload the JSON again.', 'disciple-tools-migration' ); + return; + } + $this->active_file_job_id = $id; + $this->build_file_preview_state_from_payload( $payload ); + } + /** + * @param array $payload Full export payload. + * @return void + */ + private function build_file_preview_state_from_payload( array $payload ) : void { $dt_settings = $payload['export']['dt_settings'] ?? []; $post_types = $dt_settings['dt_post_types_settings']['values'] ?? []; $tiles_all = $dt_settings['dt_tiles_settings']['values'] ?? []; @@ -946,4 +1005,111 @@ private function process_file_upload( array $settings ) : void { $this->import_preview_channel = 'file'; } + + /** + * Renders a table of past file import jobs for the current user. + * + * @param array $settings + * @return void + */ + private function render_past_file_jobs_table( array $settings ) : void { + if ( ! class_exists( 'Disciple_Tools_Migration_File_Job_Store' ) || empty( $settings['enabled'] ) ) { + return; + } + $user_id = get_current_user_id(); + $rows = Disciple_Tools_Migration_File_Job_Store::list_jobs_for_user( $user_id ); + $page_token = Disciple_Tools_Migration_Menu::instance()->token; + $url_base = add_query_arg( + [ + 'page' => $page_token, + 'tab' => 'import', + ], + admin_url( 'admin.php' ) + ); + ?> +

+

+ +

+ + + + + + + + + + + + + + + + + 0 ? date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), $ts ) : '—'; + $size_str = $bytes > 0 + /* translators: %s: file size e.g. 2 MB */ + ? size_format( $bytes, 1 ) + : '—'; + $has_payload = $job_id !== '' && Disciple_Tools_Migration_File_Job_Store::job_has_stored_payload( $job_id ); + $can_retry = $has_payload && in_array( $status, [ Disciple_Tools_Migration_File_Job_Store::STATUS_READY, Disciple_Tools_Migration_File_Job_Store::STATUS_FAILED, Disciple_Tools_Migration_File_Job_Store::STATUS_CANCELLED, Disciple_Tools_Migration_File_Job_Store::STATUS_RUNNING ], true ); + $retry_url = add_query_arg( 'file_job', $job_id, $url_base ); + $pill_class = 'dt-migration-job-pill dt-migration-job-pill--neutral'; + if ( $status === Disciple_Tools_Migration_File_Job_Store::STATUS_SUCCESS ) { + $pill_class = 'dt-migration-job-pill dt-migration-job-pill--success'; + } elseif ( in_array( $status, [ Disciple_Tools_Migration_File_Job_Store::STATUS_FAILED, Disciple_Tools_Migration_File_Job_Store::STATUS_CANCELLED ], true ) ) { + $pill_class = 'dt-migration-job-pill dt-migration-job-pill--failed'; + } + $status_label = $status; + switch ( $status ) { + case Disciple_Tools_Migration_File_Job_Store::STATUS_SUCCESS: + $status_label = __( 'Success', 'disciple-tools-migration' ); + break; + case Disciple_Tools_Migration_File_Job_Store::STATUS_FAILED: + $status_label = __( 'Failed', 'disciple-tools-migration' ); + break; + case Disciple_Tools_Migration_File_Job_Store::STATUS_CANCELLED: + $status_label = __( 'Cancelled', 'disciple-tools-migration' ); + break; + case Disciple_Tools_Migration_File_Job_Store::STATUS_RUNNING: + $status_label = __( 'In progress', 'disciple-tools-migration' ); + break; + case Disciple_Tools_Migration_File_Job_Store::STATUS_READY: + default: + $status_label = __( 'Ready', 'disciple-tools-migration' ); + break; + } + ?> + + + + + + + + + + +
+ + + + + + + + +
+ + + + + + + + + + + + + +

+ +

+ @@ -180,7 +207,25 @@ public function process_form_fields(): void { $settings['allowed_items']['records']['contacts'] = ! empty( $allowed['records']['contacts'] ); $settings['allowed_items']['records']['groups'] = ! empty( $allowed['records']['groups'] ); + $days = isset( $post_vars['dt_migration_file_job_max_age_days'] ) ? (int) $post_vars['dt_migration_file_job_max_age_days'] : 7; + if ( $days < 1 ) { + $days = 1; + } + if ( $days > 365 ) { + $days = 365; + } + if ( ! isset( $settings['file'] ) || ! is_array( $settings['file'] ) ) { + $settings['file'] = [ + 'compression' => 'zip', + ]; + } + $settings['file']['job_max_age_days'] = $days; + Disciple_Tools_Migration_Menu::update_settings( $settings ); + + if ( class_exists( 'Disciple_Tools_Migration_File_Job_Store' ) ) { + Disciple_Tools_Migration_File_Job_Store::prune_expired_jobs(); + } } /** diff --git a/admin/js/import.js b/admin/js/import.js index 9a9994a..a7a5176 100644 --- a/admin/js/import.js +++ b/admin/js/import.js @@ -24,6 +24,8 @@ let completedSteps = 0; let activeImportChannel = 'api'; let isSlimConfirmMode = false; + /** File job UUID for the current or last-started file import (from data-file-job-id on the file section). */ + let fileJobIdForRun = ''; /** First records batch of this run sends init_records_import (clears stale deferred queue if settings step was skipped). */ let sentRecordsImportInit = false; /** Per-record or connection-pass issues logged while import continues. */ @@ -73,6 +75,16 @@ function beginImportFlow( $section ) { const fromBtn = $section.find( '.dt-migration-start-import' ).first().data( 'importChannel' ); activeImportChannel = fromBtn === 'file' ? 'file' : 'api'; + if ( activeImportChannel === 'file' ) { + const jid = String( $section.attr( 'data-file-job-id' ) || '' ).trim(); + if ( ! jid ) { + window.alert( 'No file migration job is active. Use Upload & Preview or Retry from the job list first.' ); + return; + } + fileJobIdForRun = jid; + } else { + fileJobIdForRun = ''; + } const settings = getSelectedSettings( $section ); const records = getSelectedRecords( $section ); @@ -91,6 +103,43 @@ startNextPhase(); } + function appendFileJobId( data ) { + if ( activeImportChannel === 'file' && fileJobIdForRun ) { + data.file_job_id = fileJobIdForRun; + } + return data; + } + + function notifyFileJobCompleteIfNeeded() { + if ( activeImportChannel === 'file' && fileJobIdForRun && typeof dtMigrationImport !== 'undefined' ) { + $.post( dtMigrationImport.ajaxUrl, { + action: 'dt_migration_file_job_complete', + nonce: dtMigrationImport.nonce, + file_job_id: fileJobIdForRun + } ); + } + } + + function notifyFileJobFailedIfNeeded() { + if ( activeImportChannel === 'file' && fileJobIdForRun && typeof dtMigrationImport !== 'undefined' ) { + $.post( dtMigrationImport.ajaxUrl, { + action: 'dt_migration_file_job_failed', + nonce: dtMigrationImport.nonce, + file_job_id: fileJobIdForRun + } ); + } + } + + function notifyFileJobCancelledIfNeeded() { + if ( activeImportChannel === 'file' && fileJobIdForRun && typeof dtMigrationImport !== 'undefined' ) { + $.post( dtMigrationImport.ajaxUrl, { + action: 'dt_migration_file_job_cancelled', + nonce: dtMigrationImport.nonce, + file_job_id: fileJobIdForRun + } ); + } + } + function runPreflightRequest( $section ) { const fromBtn = $section.find( '.dt-migration-run-preflight' ).first().data( 'importChannel' ); const channel = fromBtn === 'file' ? 'file' : 'api'; @@ -122,6 +171,17 @@ settings_selected: settings, records_selected: recordPts }; + if ( channel === 'file' ) { + const $fileSec = $section && $section.length && $section.is( '.dt-migration-import-section[data-import-channel="file"]' ) ? $section : $section.closest( '.dt-migration-import-section[data-import-channel="file"]' ); + const fid = $fileSec && $fileSec.length ? String( $fileSec.attr( 'data-file-job-id' ) || '' ).trim() : ''; + if ( ! fid ) { + window.alert( t( 'preflightFileJobMissing', 'No file migration job is active. Use Upload & Preview or Retry from the job list first.' ) ); + $pfStatus.prop( 'hidden', true ); + $pfModal.hide(); + return; + } + payload.file_job_id = fid; + } $.post( dtMigrationImport.ajaxUrl, payload ).done( function( r ) { $pfStatus.prop( 'hidden', true ); @@ -296,13 +356,13 @@ $currentPhase.text( phase.label + '...' ); if ( phase.type === 'settings' ) { - $.post( dtMigrationImport.ajaxUrl, { + $.post( dtMigrationImport.ajaxUrl, appendFileJobId( { action: 'dt_migration_import_batch', nonce: dtMigrationImport.nonce, import_channel: activeImportChannel, step: 'settings', settings_selected: phase.settings - } ).done( function( r ) { + } ) ).done( function( r ) { if ( r.success ) { resolve( r.data ); } else { @@ -325,12 +385,12 @@ return; } $currentPhase.text( 'Applying connection fields…' ); - $.post( dtMigrationImport.ajaxUrl, { + $.post( dtMigrationImport.ajaxUrl, appendFileJobId( { action: 'dt_migration_import_batch', nonce: dtMigrationImport.nonce, import_channel: activeImportChannel, step: 'apply_deferred_connections' - } ).done( function( r2 ) { + } ) ).done( function( r2 ) { if ( r2.success ) { const d2 = r2.data || {}; appendImportLogLines( d2.connection_errors ); @@ -360,7 +420,7 @@ payload.init_records_import = '1'; sentRecordsImportInit = true; } - $.post( dtMigrationImport.ajaxUrl, payload ).done( function( r ) { + $.post( dtMigrationImport.ajaxUrl, appendFileJobId( payload ) ).done( function( r ) { if ( r.success ) { const d = r.data; appendImportLogLines( d.record_errors ); @@ -389,6 +449,7 @@ function startNextPhase() { if ( currentPhaseIndex >= phases.length ) { + notifyFileJobCompleteIfNeeded(); setImportSpinner( false ); setProgress( 100 ); $currentPhase.text( @@ -423,6 +484,7 @@ markStepActive( currentPhaseIndex ); runPhase( phase ).then( function( result ) { if ( result && result.cancelled ) { + notifyFileJobCancelledIfNeeded(); setImportSpinner( false ); $currentPhase.text( 'Import cancelled.' ); $cancelImport.hide(); @@ -433,6 +495,7 @@ currentPhaseIndex++; startNextPhase(); } ).catch( function( err ) { + notifyFileJobFailedIfNeeded(); setImportSpinner( false ); $currentPhase.text( 'Import failed.' ); showError( err ); @@ -550,6 +613,34 @@ const checked = $( this ).prop( 'checked' ); $section.find( '.dt-migration-record-checkbox' ).prop( 'checked', checked ); } ); + + $( document ).on( 'click', '.dt-migration-file-job-delete', function( e ) { + e.preventDefault(); + const $btn = $( this ); + const id = $btn.data( 'job-id' ); + if ( ! id || ! window.confirm( t( 'deleteFileJobConfirm', 'Delete this file migration job and its stored data?' ) ) ) { + return; + } + if ( typeof dtMigrationImport === 'undefined' ) { + return; + } + $btn.prop( 'disabled', true ); + $.post( dtMigrationImport.ajaxUrl, { + action: 'dt_migration_file_job_delete', + nonce: dtMigrationImport.nonce, + job_id: id + } ).done( function( r ) { + if ( r.success ) { + window.location.reload(); + return; + } + window.alert( ( r.data && r.data.message ) ? r.data.message : t( 'deleteFileJobFailed', 'Could not delete the job.' ) ); + $btn.prop( 'disabled', false ); + } ).fail( function() { + window.alert( t( 'deleteFileJobFailed', 'Could not delete the job.' ) ); + $btn.prop( 'disabled', false ); + } ); + } ); } $( document ).ready( init ); diff --git a/disciple-tools-migration.php b/disciple-tools-migration.php index 3ff3bfa..a4955e1 100755 --- a/disciple-tools-migration.php +++ b/disciple-tools-migration.php @@ -21,6 +21,14 @@ exit; // Exit if accessed directly } +/** + * Default max age (days) for stored file migration jobs when option is unset. + * Overridden by Settings > File import jobs. + */ +if ( ! defined( 'DT_MIGRATION_FILE_JOB_MAX_AGE_DAYS' ) ) { + define( 'DT_MIGRATION_FILE_JOB_MAX_AGE_DAYS', 7 ); +} + /** * Gets the instance of the Disciple_Tools_Migration_Plugin class. * @@ -105,6 +113,7 @@ private function __construct() { require_once 'includes/class-dt-migration-import-engine.php'; require_once 'includes/class-dt-migration-preflight.php'; } + require_once 'includes/class-dt-migration-file-job-store.php'; if ( is_admin() ) { require_once 'includes/class-dt-migration-export-file.php'; @@ -117,6 +126,9 @@ private function __construct() { new Disciple_Tools_Migration_Import_Ajax(); } + add_action( 'init', [ $this, 'maybe_schedule_file_job_prune' ] ); + add_action( 'dt_migration_prune_file_jobs', [ $this, 'run_file_job_prune' ] ); + $this->i18n(); if ( is_admin() ) { @@ -151,6 +163,32 @@ public static function activation() { */ public static function deactivation() { delete_option( 'dismissed-disciple-tools-migration' ); + $ts = wp_next_scheduled( 'dt_migration_prune_file_jobs' ); + if ( $ts ) { + wp_unschedule_event( $ts, 'dt_migration_prune_file_jobs' ); + } + } + + /** + * Schedules daily prune of expired file migration jobs. + * + * @return void + */ + public function maybe_schedule_file_job_prune() { + if ( ! wp_next_scheduled( 'dt_migration_prune_file_jobs' ) ) { + wp_schedule_event( time() + HOUR_IN_SECONDS, 'daily', 'dt_migration_prune_file_jobs' ); + } + } + + /** + * Cron: removes file job records older than configured retention. + * + * @return void + */ + public function run_file_job_prune() { + if ( class_exists( 'Disciple_Tools_Migration_File_Job_Store' ) ) { + Disciple_Tools_Migration_File_Job_Store::prune_expired_jobs(); + } } /** diff --git a/includes/class-dt-migration-file-job-store.php b/includes/class-dt-migration-file-job-store.php new file mode 100644 index 0000000..67c5724 --- /dev/null +++ b/includes/class-dt-migration-file-job-store.php @@ -0,0 +1,357 @@ + File import jobs). + */ + public const MAX_AGE_DAYS_DEFAULT = 7; + + /** + * Sanitize a job id (UUID). + * + * @param string $job_id + * @return string + */ + public static function sanitize_job_id( string $job_id ) : string { + $job_id = strtolower( trim( $job_id ) ); + if ( ! preg_match( '/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/', $job_id ) ) { + return ''; + } + return $job_id; + } + + /** + * @return array> + */ + private static function get_registry() : array { + $raw = get_option( self::REGISTRY_OPTION, [] ); + return is_array( $raw ) ? $raw : []; + } + + /** + * @param array> $registry + * @return void + */ + private static function save_registry( array $registry ) : void { + if ( $registry === [] ) { + delete_option( self::REGISTRY_OPTION ); + return; + } + if ( get_option( self::REGISTRY_OPTION, null ) === false ) { + add_option( self::REGISTRY_OPTION, $registry, '', 'no' ); + } else { + update_option( self::REGISTRY_OPTION, $registry, false ); + } + } + + /** + * @param string $job_id + * @return string + */ + public static function payload_option_name( string $job_id ) : string { + return self::PAYLOAD_KEY_PREFIX . $job_id; + } + + /** + * @param int $user_id + * @param array $payload Full migration JSON (decoded). + * @param string $label Original filename or short label. + * @return string Job id (UUID) or empty string on failure. + */ + public static function create_job( int $user_id, array $payload, string $label ) : string { + $job_id = self::sanitize_job_id( wp_generate_uuid4() ); + if ( $job_id === '' ) { + return ''; + } + + $key = self::payload_option_name( $job_id ); + $ok = add_option( $key, $payload, '', 'no' ); + if ( ! $ok ) { + delete_option( $key ); + if ( ! add_option( $key, $payload, '', 'no' ) ) { + return ''; + } + } + + $json = wp_json_encode( $payload ); + $size = is_string( $json ) ? strlen( $json ) : 0; + + $registry = self::get_registry(); + $now = time(); + $registry[ $job_id ] = [ + 'user_id' => $user_id, + 'stored_at' => $now, + 'updated_at' => $now, + 'status' => self::STATUS_READY, + 'label' => sanitize_file_name( $label ), + 'byte_size' => $size, + ]; + self::save_registry( $registry ); + + return $job_id; + } + + /** + * @param int $user_id + * @param string $job_id + * @return array|null + */ + public static function get_job_meta( int $user_id, string $job_id ) : ?array { + $job_id = self::sanitize_job_id( $job_id ); + if ( $job_id === '' ) { + return null; + } + $registry = self::get_registry(); + $row = $registry[ $job_id ] ?? null; + if ( ! is_array( $row ) || (int) ( $row['user_id'] ?? 0 ) !== $user_id ) { + return null; + } + return $row; + } + + /** + * @param int $user_id + * @param string $job_id + * @return array|null Full payload or null. + */ + public static function job_has_stored_payload( string $job_id ) : bool { + $job_id = self::sanitize_job_id( $job_id ); + if ( $job_id === '' ) { + return false; + } + $name = self::payload_option_name( $job_id ); + $val = get_option( $name, null ); + return is_array( $val ) && ! empty( $val ); + } + + /** + * @param int $user_id + * @param string $job_id + * @return array|null Full payload or null. + */ + public static function get_payload( int $user_id, string $job_id ) : ?array { + $job_id = self::sanitize_job_id( $job_id ); + if ( $job_id === '' ) { + return null; + } + if ( self::get_job_meta( $user_id, $job_id ) === null ) { + return null; + } + $name = self::payload_option_name( $job_id ); + $val = get_option( $name, null ); + if ( ! is_array( $val ) ) { + return null; + } + return $val; + } + + /** + * @param int $user_id + * @param string $job_id + * @return bool + */ + public static function job_exists_for_user( int $user_id, string $job_id ) : bool { + return self::get_job_meta( $user_id, $job_id ) !== null; + } + + /** + * @param int $user_id + * @param string $status + * @return void + */ + public static function set_status( int $user_id, string $job_id, string $status ) : void { + $job_id = self::sanitize_job_id( $job_id ); + if ( $job_id === '' ) { + return; + } + $allowed = [ + self::STATUS_READY, + self::STATUS_RUNNING, + self::STATUS_SUCCESS, + self::STATUS_FAILED, + self::STATUS_CANCELLED, + ]; + if ( ! in_array( $status, $allowed, true ) ) { + return; + } + $registry = self::get_registry(); + if ( ! isset( $registry[ $job_id ] ) || (int) ( $registry[ $job_id ]['user_id'] ?? 0 ) !== $user_id ) { + return; + } + $registry[ $job_id ]['status'] = $status; + $registry[ $job_id ]['updated_at'] = time(); + self::save_registry( $registry ); + } + + /** + * Marks success and drops the stored payload to save space; keeps registry row. + * + * @param int $user_id + * @param string $job_id + * @return void + */ + public static function mark_success_and_clear_payload( int $user_id, string $job_id ) : void { + $job_id = self::sanitize_job_id( $job_id ); + if ( $job_id === '' ) { + return; + } + $registry = self::get_registry(); + if ( ! isset( $registry[ $job_id ] ) || (int) ( $registry[ $job_id ]['user_id'] ?? 0 ) !== $user_id ) { + return; + } + delete_option( self::payload_option_name( $job_id ) ); + $registry[ $job_id ]['status'] = self::STATUS_SUCCESS; + $registry[ $job_id ]['byte_size'] = 0; + $registry[ $job_id ]['updated_at'] = time(); + self::save_registry( $registry ); + } + + /** + * @param int $user_id + * @param string $job_id + * @return void + */ + public static function delete_job( int $user_id, string $job_id ) : void { + $job_id = self::sanitize_job_id( $job_id ); + if ( $job_id === '' ) { + return; + } + $registry = self::get_registry(); + if ( ! isset( $registry[ $job_id ] ) || (int) ( $registry[ $job_id ]['user_id'] ?? 0 ) !== $user_id ) { + return; + } + unset( $registry[ $job_id ] ); + self::save_registry( $registry ); + delete_option( self::payload_option_name( $job_id ) ); + } + + /** + * @param int $user_id + * @return array> List of rows with job_id key added. + */ + public static function list_jobs_for_user( int $user_id ) : array { + $registry = self::get_registry(); + $out = []; + foreach ( $registry as $job_id => $row ) { + if ( ! is_string( $job_id ) || ! is_array( $row ) ) { + continue; + } + if ( (int) ( $row['user_id'] ?? 0 ) !== $user_id ) { + continue; + } + $row['job_id'] = $job_id; + $out[] = $row; + } + usort( + $out, + static function ( $a, $b ) { + return ( (int) ( $b['stored_at'] ?? 0 ) ) <=> ( (int) ( $a['stored_at'] ?? 0 ) ); + } + ); + return $out; + } + + /** + * Max retention days from plugin settings, clamped 1..365. + * + * @return int + */ + public static function get_max_age_days() : int { + $raw = 0; + if ( class_exists( 'Disciple_Tools_Migration_Menu', false ) ) { + $settings = Disciple_Tools_Migration_Menu::get_settings(); + $file = isset( $settings['file'] ) && is_array( $settings['file'] ) ? $settings['file'] : []; + $raw = (int) ( $file['job_max_age_days'] ?? 0 ); + } else { + $opt = get_option( 'dt_migration_settings', [] ); + if ( is_array( $opt ) && isset( $opt['file'] ) && is_array( $opt['file'] ) ) { + $raw = (int) ( $opt['file']['job_max_age_days'] ?? 0 ); + } + } + if ( $raw < 1 ) { + $raw = (int) ( defined( 'DT_MIGRATION_FILE_JOB_MAX_AGE_DAYS' ) ? constant( 'DT_MIGRATION_FILE_JOB_MAX_AGE_DAYS' ) : self::MAX_AGE_DAYS_DEFAULT ); + } + if ( $raw < 1 ) { + $raw = self::MAX_AGE_DAYS_DEFAULT; + } + $raw = (int) apply_filters( 'dt_migration_file_job_max_age_days', $raw ); + if ( $raw < 1 ) { + $raw = 1; + } + if ( $raw > 365 ) { + $raw = 365; + } + return $raw; + } + + /** + * Removes registry rows and payload options past retention. + * + * @return int Number of jobs removed. + */ + public static function prune_expired_jobs() : int { + $max_days = self::get_max_age_days(); + $cut = time() - ( $max_days * DAY_IN_SECONDS ); + $registry = self::get_registry(); + $to_remove = []; + foreach ( $registry as $job_id => $row ) { + if ( ! is_string( $job_id ) || ! is_array( $row ) ) { + continue; + } + $t = (int) ( $row['stored_at'] ?? 0 ); + if ( $t >= $cut ) { + continue; + } + $to_remove[] = [ + 'job_id' => $job_id, + 'user_id' => (int) ( $row['user_id'] ?? 0 ), + ]; + } + $removed = 0; + foreach ( $to_remove as $item ) { + self::delete_job( $item['user_id'], $item['job_id'] ); + $removed++; + } + return $removed; + } + + /** + * Validates export block shape (same as upload handler). + * + * @param array $payload + * @return bool + */ + public static function is_valid_migration_payload( array $payload ) : bool { + $export_block = $payload['export'] ?? []; + $has_dt_settings = ! empty( $export_block['dt_settings'] ); + $has_users_block = array_key_exists( 'system_users', $export_block ) && is_array( $export_block['system_users'] ); + return is_array( $export_block ) && ( $has_dt_settings || $has_users_block ); + } +} From b833ac80cf3e161a40b1e7cd644ba421064e9327 Mon Sep 17 00:00:00 2001 From: kodinkat Date: Mon, 27 Apr 2026 14:49:02 +0100 Subject: [PATCH 2/8] Enhance documentation for file import jobs in Disciple.Tools Migration plugin - Updated README.md to clarify the file import process, including the new **Upload & Preview** feature and its role in creating file migration jobs. - Expanded user guides to include details on managing recent file migration jobs, including status tracking and retention settings. - Added troubleshooting tips for common issues related to file import jobs, ensuring users can effectively resolve problems during migration. - Introduced new images to illustrate file job management and settings for better user understanding. --- documentation/README.md | 11 ++++++-- documentation/reference/data-and-security.md | 4 +++ .../imgs/fig-10-settings-file-jobs.png | Bin 0 -> 125006 bytes .../imgs/fig-11-import-recent-file-jobs.png | Bin 0 -> 68255 bytes .../user-guide/migration-via-file.md | 26 ++++++++++++++++-- documentation/user-guide/overview.md | 2 +- .../user-guide/preflight-and-warnings.md | 2 ++ .../user-guide/settings-and-scope.md | 13 +++++++++ documentation/user-guide/troubleshooting.md | 26 ++++++++++++++++-- 9 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 documentation/user-guide/imgs/fig-10-settings-file-jobs.png create mode 100644 documentation/user-guide/imgs/fig-11-import-recent-file-jobs.png diff --git a/documentation/README.md b/documentation/README.md index 214f472..dc8fa77 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -28,7 +28,7 @@ This folder contains user and reference documentation for moving Disciple.Tools 1. Install and activate the plugin on **source** and **destination** Disciple.Tools sites (see [Overview](user-guide/overview.md)). 2. On the **source** site, open **Extensions (D.T)** → **Migration** → **Settings**: enable migration and select what to export (including record types). 3. On the **source** site, open **Export** and download the JSON package. -4. Move the file to a secure location and upload it on the **destination** site under **Import**. +4. Move the file to a secure location and upload it on the **destination** site under **Import** (**Upload & Preview**). The destination creates a **file migration job** (stored in the database) so long runs can complete; you can track status in **Recent file migration jobs** and adjust retention under **Settings** → **File import jobs** (see [Settings and scope](user-guide/settings-and-scope.md)). 5. Optionally run **preflight**, review warnings, then start the import. ### B. API-based (direct site-to-site) @@ -41,4 +41,11 @@ Both channels respect the same scope rules and the same import semantics on the ## Screenshots -Illustrations live next to the guides that reference them, under each section’s `imgs/` directory. Filenames are placeholders until real screenshots are added. +Illustrations live next to the guides that reference them, under each section’s `imgs/` directory. + +| File (under `user-guide/imgs/`) | Used in | +|--------------------------------|---------| +| `fig-10-settings-file-jobs.png` | [Settings and scope](user-guide/settings-and-scope.md) — **File import jobs** retention | +| `fig-11-import-recent-file-jobs.png` | [Migration via file](user-guide/migration-via-file.md) — **Recent file migration jobs** table | + +Add or replace these PNGs locally if the links in the Markdown are missing or broken in your preview. diff --git a/documentation/reference/data-and-security.md b/documentation/reference/data-and-security.md index ad9c7f5..704d051 100644 --- a/documentation/reference/data-and-security.md +++ b/documentation/reference/data-and-security.md @@ -25,6 +25,10 @@ API imports use a **bearer token** stored on the destination after a successful JSON export files contain **PII and ministry data**. Encrypt at rest and limit distribution to trusted operators. +### File import jobs on the destination + +When you **Upload & Preview** on the destination, the plugin stores a copy of the decoded export in the **WordPress database** (per user, as a **job** with metadata) so chunked preflight and import can run without a short time limit. After a **successful** import, the large payload is typically **removed** while a small **success** record may remain in the job list until automatic or manual cleanup. Operators with access to the Migration screens can **delete** jobs from the list; retention in days is configurable under **Settings** → **File import jobs** (see [Settings and scope](../user-guide/settings-and-scope.md)). Treat database backups as including any not-yet-pruned job payloads. + ## Capabilities Migration admin UI and REST permission checks rely on **`manage_dt`**. Some user operations may require **`promote_users`** or other WordPress caps when creating or elevating accounts. diff --git a/documentation/user-guide/imgs/fig-10-settings-file-jobs.png b/documentation/user-guide/imgs/fig-10-settings-file-jobs.png new file mode 100644 index 0000000000000000000000000000000000000000..d76eed66dc173d15864b1be5e240175d66d6ac10 GIT binary patch literal 125006 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 MTIpfw1EZ(^0~6Ylp8x;= literal 0 HcmV?d00001 diff --git a/documentation/user-guide/imgs/fig-11-import-recent-file-jobs.png b/documentation/user-guide/imgs/fig-11-import-recent-file-jobs.png new file mode 100644 index 0000000000000000000000000000000000000000..892de44fb88e5e9453486f8a811121b6ee65cbf9 GIT binary patch literal 68255 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�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 + ![Import tab: JSON file upload and actions](imgs/fig-06-import-file.png) +### Recent file migration jobs + +Under **Upload & preview (JSON file)**, the **Recent file migration jobs** table lists past uploads for your user account. + +| Column | Meaning | +|--------|---------| +| **Date** | When the job was created (upload or equivalent). | +| **File** | Original filename from the upload. | +| **Status** | Shown as a pill: **Success** (green) when a run finished; **Failed** or **Cancelled** (red) when a run errored or you stopped it; **Ready** or **In progress** (neutral) when not finished or not started. | +| **Size** | Approximate stored size while the JSON is kept; may show a dash after **Success** because the large payload is cleared to save space. | +| **Actions** | **Retry** loads that job’s data back into the preview (if the file is still stored). **Delete** removes the job and any stored data for it. | + +Completed jobs with **Success** often **cannot** be retried from this list, because the import clears the stored JSON on success. Upload the file again to run another import. Failed or cancelled jobs **can** be retried while the payload still exists. + +Automatic removal of old jobs uses the **day limit** on **Settings** → **File import jobs** (see [Settings and scope](settings-and-scope.md)). + + + +![Import tab: recent file migration jobs (table, status, actions)](imgs/fig-11-import-recent-file-jobs.png) + ## After import Verify records, users, and configuration in Disciple.Tools. If something failed mid-run, check the messages in the import UI and use [Troubleshooting](troubleshooting.md). diff --git a/documentation/user-guide/overview.md b/documentation/user-guide/overview.md index a9d5bfb..713facb 100644 --- a/documentation/user-guide/overview.md +++ b/documentation/user-guide/overview.md @@ -20,7 +20,7 @@ Imports on the destination are designed to **replace** existing data for the sel ## Where to find Migration in WordPress -Open the WordPress admin, then go to **Extensions (D.T)** → **Migration**. The screen has three tabs: **Settings**, **Export**, and **Import**. +Open the WordPress admin, then go to **Extensions (D.T)** → **Migration**. The screen has three tabs: **Settings**, **Export**, and **Import**. On **Settings**, you can set how long **file import jobs** stay in the database after a JSON upload; on **Import**, the **Recent file migration jobs** table shows status and optional **Retry** / **Delete** actions (see [Migration via file](migration-via-file.md)). diff --git a/documentation/user-guide/preflight-and-warnings.md b/documentation/user-guide/preflight-and-warnings.md index c485adb..5650bbe 100644 --- a/documentation/user-guide/preflight-and-warnings.md +++ b/documentation/user-guide/preflight-and-warnings.md @@ -12,6 +12,8 @@ Use preflight when: You can still start an import without preflight; the UI offers both flows. +For **file** imports, preflight uses the same **file migration job** as the import (the payload from **Upload & Preview** or **Retry** on [Migration via file](migration-via-file.md)). If the UI says no job is active, upload again or use **Retry** on a job that still has stored data. + ![Preflight warnings and informational lines](imgs/fig-08-preflight.png) diff --git a/documentation/user-guide/settings-and-scope.md b/documentation/user-guide/settings-and-scope.md index 39b59f4..a56b467 100644 --- a/documentation/user-guide/settings-and-scope.md +++ b/documentation/user-guide/settings-and-scope.md @@ -36,6 +36,18 @@ For each selected type, importing on a destination **removes existing records of Save changes with **Save Settings**. +## File import jobs (retention) + +On the same **Settings** tab, the **File import jobs** section controls how long **completed file migration jobs** remain in the database before the site removes them automatically. Each time you use **Upload & Preview** on the **Import** tab, the destination stores the JSON as a **job** (see [Migration via file](migration-via-file.md)) so long imports are not cut off by a short session window. + +- **Remove file migration jobs after (days):** enter a value between **1** and **365** (default is **7**). Jobs older than this are pruned on a schedule and when you save these settings. Lower the number if you need to free space sooner; raise it if you want the **Recent file migration jobs** list on the Import tab to show history for longer. + +Saving **Settings** also runs a one-time cleanup pass against jobs past this age. + + + +![Settings: file import job retention (days)](imgs/fig-10-settings-file-jobs.png) + ## API connection storage (destination) The plugin stores the **source site base URL** and a **JWT** obtained after a successful connection test (see [Migration via API](migration-via-api.md)). **Username and password** used to fetch the token are **not** stored. JWT and URL are kept in the migration settings option for subsequent API import batches. @@ -47,4 +59,5 @@ The plugin stores the **source site base URL** and a **JWT** obtained after a su ## See also - [Export tab](migration-via-file.md) — how the download reflects these choices +- [Migration via file](migration-via-file.md) — **Recent file migration jobs**, **Retry**, and how retention relates to the day limit above - [REST API capabilities](../reference/rest-api.md) — how the source reports `allowed_items` diff --git a/documentation/user-guide/troubleshooting.md b/documentation/user-guide/troubleshooting.md index 36ce40d..3df9c0e 100644 --- a/documentation/user-guide/troubleshooting.md +++ b/documentation/user-guide/troubleshooting.md @@ -53,7 +53,27 @@ Re-run **Test Connection** after fixing Server A. Clear old tokens by saving a f **Symptom:** Download or API batch stalls. -**Fix:** Increase PHP / web server timeouts where appropriate; for API imports, batches use pagination — retry from the UI. For very large file uploads, check `upload_max_filesize` / `post_max_size`. +**Fix:** Increase PHP / web server timeouts where appropriate; for API imports, batches use pagination — retry from the UI. For very large file uploads, check `upload_max_filesize` / `post_max_size` and the database’s ability to store large options (or raise `max_allowed_packet` on MySQL if the host requires it for multi‑MB JSON). + +## File import: no job or job not found + +**Symptom:** Message that the **migration file job** is missing, not found, or no longer has a retriable copy; preflight or import cannot start. + +**Common causes:** + +- The JSON was **never uploaded** in this session, or the page was opened without using **Upload & Preview** or **Retry** for a job that still has data. +- The job **completed successfully** and the site **cleared the stored file** to save space (see [Migration via file](migration-via-file.md) — re-upload the export). +- The job was **deleted** from **Recent file migration jobs** or **aged out** by the **day limit** on **Settings** → **File import jobs**. + +**Fix:** Upload the export again, or use **Retry** on a job that still lists retriable data. Adjust the retention day limit if you need jobs to last longer in the list. + +## Import progress appears stuck (file import) + +**Symptom:** Progress bar or counts stop updating during a file-based import. + +**Fix:** Check browser **Network** for failed `admin-ajax.php` requests and read the JSON **response** for the error text. The UI surfaces the same message in the import panel. A **failed** or **cancelled** run updates the **Recent file migration jobs** status so you can **Retry** when the file is still stored. If the import **succeeded** but the list still looks odd, refresh the page — **Success** clears the stored JSON; **size** may show as a dash. + +For **nonce** or permission errors, reload the admin page and start again from **Upload & Preview** or **Retry** (not only a hard refresh of a stale tab). ## Theme version notice @@ -61,11 +81,11 @@ Re-run **Test Connection** after fixing Server A. Clear old tokens by saving a f **Fix:** Upgrade the **Disciple.Tools theme** to the version required by the plugin (see main plugin file / readme). -## Import progress appears stuck +## Import progress appears stuck (general) **Symptom:** Progress bar or counts stop updating. -**Fix:** Check browser console and server error logs; session or nonce expiry can interrupt long jobs — refresh and consult whether partial import requires cleanup (records may be half imported depending on stage). +**Fix:** For **API** imports, JWT expiry or network issues can interrupt long jobs — re-run **Test Connection** and try again. For **file** imports, see [Import progress appears stuck (file import)](#import-progress-appears-stuck-file-import) above. In all cases, check the error text in the import UI, browser **Network** responses, and server error logs; partial imports may leave records half-imported depending on the stage, and you may need cleanup or a targeted re-run. From d733aa56f661f4dc8c741d0ae085c30eacd957f7 Mon Sep 17 00:00:00 2001 From: kodinkat Date: Mon, 27 Apr 2026 15:17:10 +0100 Subject: [PATCH 3/8] Refactor AJAX handling for file job payloads in migration import process - Updated the resolve_file_job_payload method to improve input sanitization using filter_input and sanitize_text_field for better security. - Enhanced error handling for job ID retrieval in multiple AJAX methods, ensuring consistent validation and improved user feedback. - Clarified documentation for the resolve_file_job_payload method, specifying the requirement for nonce verification before execution. - Adjusted file name handling in the import tab to utilize wp_unslash and sanitize_file_name for improved file upload security. --- admin/class-dt-migration-import-ajax.php | 43 ++++++++----------- admin/class-dt-migration-tab-import.php | 3 +- .../class-dt-migration-file-job-store.php | 10 ++--- 3 files changed, 24 insertions(+), 32 deletions(-) diff --git a/admin/class-dt-migration-import-ajax.php b/admin/class-dt-migration-import-ajax.php index 6a6748d..5bbf093 100644 --- a/admin/class-dt-migration-import-ajax.php +++ b/admin/class-dt-migration-import-ajax.php @@ -281,16 +281,15 @@ public function handle_import_batch() : void { /** * Resolves the file-mode job payload for the current user, or returns an error structure. + * Callers must verify the AJAX nonce (handle_import_batch, handle_preflight) before this runs. * - * @param int $user_id + * @param int $user_id Current user. * @return array{ payload: array, job_id: string }|array{ error: string } */ private function resolve_file_job_payload( int $user_id ) { - $raw = isset( $_POST['file_job_id'] ) ? wp_unslash( $_POST['file_job_id'] ) : ''; - if ( is_array( $raw ) ) { - $raw = ''; - } - $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( (string) $raw ); + $posted = filter_input( INPUT_POST, 'file_job_id' ); + $raw = ( is_string( $posted ) && $posted !== '' ) ? sanitize_text_field( wp_unslash( $posted ) ) : ''; + $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( $raw ); if ( $job_id === '' ) { return [ 'error' => __( 'No file migration job was specified. Use Upload & Preview or Retry from the job list.', 'disciple-tools-migration' ), @@ -656,11 +655,9 @@ public function handle_file_job_delete() : void { wp_send_json_error( [ 'message' => __( 'Insufficient permissions.', 'disciple-tools-migration' ) ] ); } - $raw = isset( $_POST['job_id'] ) ? wp_unslash( $_POST['job_id'] ) : ''; - if ( is_array( $raw ) ) { - $raw = ''; - } - $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( (string) $raw ); + $posted = filter_input( INPUT_POST, 'job_id' ); + $raw = ( is_string( $posted ) && $posted !== '' ) ? sanitize_text_field( wp_unslash( $posted ) ) : ''; + $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( $raw ); if ( $job_id === '' ) { wp_send_json_error( [ 'message' => __( 'Invalid job.', 'disciple-tools-migration' ) ] ); } @@ -681,11 +678,9 @@ public function handle_file_job_complete() : void { wp_send_json_error( [ 'message' => __( 'Insufficient permissions.', 'disciple-tools-migration' ) ] ); } - $raw = isset( $_POST['file_job_id'] ) ? wp_unslash( $_POST['file_job_id'] ) : ''; - if ( is_array( $raw ) ) { - $raw = ''; - } - $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( (string) $raw ); + $posted = filter_input( INPUT_POST, 'file_job_id' ); + $raw = ( is_string( $posted ) && $posted !== '' ) ? sanitize_text_field( wp_unslash( $posted ) ) : ''; + $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( $raw ); if ( $job_id === '' ) { wp_send_json_error( [ 'message' => __( 'Invalid job.', 'disciple-tools-migration' ) ] ); } @@ -706,11 +701,9 @@ public function handle_file_job_failed() : void { wp_send_json_error( [ 'message' => __( 'Insufficient permissions.', 'disciple-tools-migration' ) ] ); } - $raw = isset( $_POST['file_job_id'] ) ? wp_unslash( $_POST['file_job_id'] ) : ''; - if ( is_array( $raw ) ) { - $raw = ''; - } - $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( (string) $raw ); + $posted = filter_input( INPUT_POST, 'file_job_id' ); + $raw = ( is_string( $posted ) && $posted !== '' ) ? sanitize_text_field( wp_unslash( $posted ) ) : ''; + $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( $raw ); if ( $job_id === '' ) { wp_send_json_error( [ 'message' => __( 'Invalid job.', 'disciple-tools-migration' ) ] ); } @@ -731,11 +724,9 @@ public function handle_file_job_cancelled() : void { wp_send_json_error( [ 'message' => __( 'Insufficient permissions.', 'disciple-tools-migration' ) ] ); } - $raw = isset( $_POST['file_job_id'] ) ? wp_unslash( $_POST['file_job_id'] ) : ''; - if ( is_array( $raw ) ) { - $raw = ''; - } - $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( (string) $raw ); + $posted = filter_input( INPUT_POST, 'file_job_id' ); + $raw = ( is_string( $posted ) && $posted !== '' ) ? sanitize_text_field( wp_unslash( $posted ) ) : ''; + $job_id = Disciple_Tools_Migration_File_Job_Store::sanitize_job_id( $raw ); if ( $job_id === '' ) { wp_send_json_error( [ 'message' => __( 'Invalid job.', 'disciple-tools-migration' ) ] ); } diff --git a/admin/class-dt-migration-tab-import.php b/admin/class-dt-migration-tab-import.php index d40d529..654c5cb 100644 --- a/admin/class-dt-migration-tab-import.php +++ b/admin/class-dt-migration-tab-import.php @@ -934,7 +934,8 @@ private function process_file_upload( array $settings ) : void { return; } - $filename = isset( $_FILES['dt_migration_import_file']['name'] ) ? (string) $_FILES['dt_migration_import_file']['name'] : 'export.json'; + $upload_name = isset( $_FILES['dt_migration_import_file']['name'] ) ? (string) wp_unslash( $_FILES['dt_migration_import_file']['name'] ) : ''; + $filename = ( $upload_name !== '' ) ? sanitize_file_name( $upload_name ) : 'export.json'; $job_id = Disciple_Tools_Migration_File_Job_Store::create_job( get_current_user_id(), $payload, $filename ); if ( $job_id === '' ) { $this->connection_error = esc_html__( 'Could not store the migration file for import. The server may be out of space or the export may be too large for your database settings.', 'disciple-tools-migration' ); diff --git a/includes/class-dt-migration-file-job-store.php b/includes/class-dt-migration-file-job-store.php index 67c5724..53f30fe 100644 --- a/includes/class-dt-migration-file-job-store.php +++ b/includes/class-dt-migration-file-job-store.php @@ -137,9 +137,8 @@ public static function get_job_meta( int $user_id, string $job_id ) : ?array { } /** - * @param int $user_id - * @param string $job_id - * @return array|null Full payload or null. + * @param string $job_id Job UUID. + * @return bool */ public static function job_has_stored_payload( string $job_id ) : bool { $job_id = self::sanitize_job_id( $job_id ); @@ -182,8 +181,9 @@ public static function job_exists_for_user( int $user_id, string $job_id ) : boo } /** - * @param int $user_id - * @param string $status + * @param int $user_id User ID. + * @param string $job_id Job UUID. + * @param string $status One of the STATUS_* constants. * @return void */ public static function set_status( int $user_id, string $job_id, string $status ) : void { From 72ce1b6d9412b29cf0c8d55ce8b678edf9fc3aa7 Mon Sep 17 00:00:00 2001 From: kodinkat Date: Mon, 27 Apr 2026 15:20:42 +0100 Subject: [PATCH 4/8] Refactor file name handling in migration import process - Updated variable names for clarity, changing `$upload_name` to `$raw_name` to better reflect its purpose. - Ensured consistent sanitization of client-provided file names using `wp_unslash` and `sanitize_file_name`, enhancing security in the import process. --- admin/class-dt-migration-tab-import.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/class-dt-migration-tab-import.php b/admin/class-dt-migration-tab-import.php index 654c5cb..2025d1a 100644 --- a/admin/class-dt-migration-tab-import.php +++ b/admin/class-dt-migration-tab-import.php @@ -934,8 +934,8 @@ private function process_file_upload( array $settings ) : void { return; } - $upload_name = isset( $_FILES['dt_migration_import_file']['name'] ) ? (string) wp_unslash( $_FILES['dt_migration_import_file']['name'] ) : ''; - $filename = ( $upload_name !== '' ) ? sanitize_file_name( $upload_name ) : 'export.json'; + $raw_name = isset( $_FILES['dt_migration_import_file']['name'] ) ? (string) wp_unslash( $_FILES['dt_migration_import_file']['name'] ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Client-provided upload name; sanitized with sanitize_file_name() on next line. Nonce verified above. + $filename = ( $raw_name !== '' ) ? sanitize_file_name( $raw_name ) : 'export.json'; $job_id = Disciple_Tools_Migration_File_Job_Store::create_job( get_current_user_id(), $payload, $filename ); if ( $job_id === '' ) { $this->connection_error = esc_html__( 'Could not store the migration file for import. The server may be out of space or the export may be too large for your database settings.', 'disciple-tools-migration' ); From 8322066c989b563bf28074b249b847026be44e20 Mon Sep 17 00:00:00 2001 From: corsacca Date: Wed, 6 May 2026 10:49:45 +0100 Subject: [PATCH 5/8] When importing users make sure they are added to the current subsite. --- includes/class-dt-migration-system-users.php | 68 +++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/includes/class-dt-migration-system-users.php b/includes/class-dt-migration-system-users.php index 12d5ae9..c8fe49f 100644 --- a/includes/class-dt-migration-system-users.php +++ b/includes/class-dt-migration-system-users.php @@ -160,8 +160,17 @@ static function ( $a, $b ) { $out['map'][ (string) $old_id ] = (int) $existing->ID; ++$out['mapped_existing']; + $norm_roles = self::normalized_roles_from_row( $row ); + + if ( is_multisite() && ! is_user_member_of_blog( $existing->ID, get_current_blog_id() ) ) { + $add_err = self::add_existing_user_to_current_blog( $existing->ID, $norm_roles ); + if ( $add_err !== null ) { + return array_merge( $out, [ 'error' => $add_err ] ); + } + } + if ( $is_src_admin ) { - $roles_err = self::assign_roles_to_wp_user( $existing->ID, self::normalized_roles_from_row( $row ) ); + $roles_err = self::assign_roles_to_wp_user( $existing->ID, $norm_roles ); if ( $roles_err !== null ) { return array_merge( $out, [ 'error' => $roles_err ] ); } @@ -349,6 +358,63 @@ private static function assign_roles_to_wp_user( int $user_id, array $roles ) : return null; } + /** + * Adds an existing network user to the current subsite using their source roles. + * + * Multisite-only. Skips when user is already a member of the current blog. + * Uses add_user_to_blog() for the primary role so the standard hooks fire, + * then adds any extra roles via WP_User::add_role(). Falls back to the site's + * default role when the export carries no usable role. + * + * @param int $user_id Target site user ID. + * @param string[] $roles Sanitized role slugs from the export row. + * @return string|null Error message, or null on success / no-op. + */ + private static function add_existing_user_to_current_blog( int $user_id, array $roles ) : ?string { + $roles = array_values( array_filter( array_map( 'sanitize_key', $roles ) ) ); + + if ( in_array( 'administrator', $roles, true ) && ! current_user_can( 'promote_users' ) ) { + return __( 'You do not have permission to assign the administrator role.', 'disciple-tools-migration' ); + } + + $wp_roles = wp_roles(); + foreach ( $roles as $slug ) { + if ( ! $wp_roles->is_role( $slug ) ) { + return sprintf( + /* translators: %s: role slug from export */ + __( 'Unknown or invalid role in export: %s', 'disciple-tools-migration' ), + $slug + ); + } + } + + if ( empty( $roles ) ) { + $default_role = sanitize_key( (string) get_option( 'default_role', 'subscriber' ) ); + if ( ! $wp_roles->is_role( $default_role ) ) { + $default_role = 'subscriber'; + } + $primary = $default_role; + $extras = []; + } else { + $primary = array_shift( $roles ); + $extras = $roles; + } + + $result = add_user_to_blog( get_current_blog_id(), $user_id, $primary ); + if ( is_wp_error( $result ) ) { + return $result->get_error_message(); + } + + if ( ! empty( $extras ) ) { + $user = new WP_User( $user_id ); + foreach ( $extras as $extra_role ) { + $user->add_role( $extra_role ); + } + } + + return null; + } + /** * @param array $row * @return int|WP_Error From 509dbfcb334e72b7e6d85ed1f1bc20635f08dcb1 Mon Sep 17 00:00:00 2001 From: corsacca Date: Wed, 6 May 2026 11:23:49 +0100 Subject: [PATCH 6/8] Fix exporting private meta and link and task fields --- admin/class-dt-migration-import-ajax.php | 16 +++ includes/class-dt-migration-export-file.php | 99 ++++++++++++-- includes/class-dt-migration-import-engine.php | 125 ++++++++++++++++++ 3 files changed, 229 insertions(+), 11 deletions(-) diff --git a/admin/class-dt-migration-import-ajax.php b/admin/class-dt-migration-import-ajax.php index 4c8f4e6..4357cd6 100644 --- a/admin/class-dt-migration-import-ajax.php +++ b/admin/class-dt-migration-import-ajax.php @@ -454,6 +454,22 @@ private function handle_file_mode_batch( string $step, array $settings ) : void ] ); } + // Apply per-user private meta (dt_post_user_meta) for the post IDs in this slice. + $slice_post_ids = []; + foreach ( $slice as $rec ) { + if ( isset( $rec['ID'] ) ) { + $slice_post_ids[] = (int) $rec['ID']; + } + } + $pum_rows = $payload['post_user_meta'][ $post_type ] ?? []; + $pum_result = Disciple_Tools_Migration_Import_Engine::import_post_user_meta_for_posts( + is_array( $pum_rows ) ? $pum_rows : [], + $slice_post_ids + ); + if ( ! empty( $pum_result['errors'] ) ) { + $batch_result['errors'] = array_merge( $batch_result['errors'] ?? [], $pum_result['errors'] ); + } + wp_send_json_success( [ 'done' => ! $has_more, 'phase' => 'records', diff --git a/includes/class-dt-migration-export-file.php b/includes/class-dt-migration-export-file.php index 3fc630e..585fc70 100644 --- a/includes/class-dt-migration-export-file.php +++ b/includes/class-dt-migration-export-file.php @@ -37,7 +37,8 @@ public static function build_export( array $record_options = [] ) : array { $export_block['system_users'] = Disciple_Tools_Migration_System_Users::build_export_payload(); } - $records = []; + $records = []; + $post_user_meta = []; $allowed_records = $allowed['records'] ?? []; if ( ! empty( $allowed_records ) && is_array( $allowed_records ) ) { foreach ( $allowed_records as $post_type => $enabled ) { @@ -49,7 +50,9 @@ public static function build_export( array $record_options = [] ) : array { $min_id = isset( $opts['min_id'] ) ? absint( $opts['min_id'] ) : 0; $max_id = isset( $opts['max_id'] ) ? absint( $opts['max_id'] ) : 0; - $records[ $post_type ] = self::fetch_records( $post_type, $limit, $min_id, $max_id ); + $ids = self::get_record_ids( $post_type, $limit, $min_id, $max_id ); + $records[ $post_type ] = self::fetch_records_for_ids( $post_type, $ids ); + $post_user_meta[ $post_type ] = self::fetch_post_user_meta( $ids ); } } @@ -62,8 +65,9 @@ public static function build_export( array $record_options = [] ) : array { 'mode' => 'file', 'allowed_items' => $allowed, ], - 'export' => $export_block, - 'records' => $records, + 'export' => $export_block, + 'records' => $records, + 'post_user_meta' => $post_user_meta, ]; } @@ -79,19 +83,92 @@ public static function build_export( array $record_options = [] ) : array { */ public static function fetch_records( string $post_type, int $limit = 0, int $min_id = 0, int $max_id = 0 ) : array { $ids = self::get_record_ids( $post_type, $limit, $min_id, $max_id ); - $records = []; - foreach ( $ids as $post_id ) { - $post = DT_Posts::get_post( $post_type, $post_id, true, false ); - if ( ! is_wp_error( $post ) && is_array( $post ) ) { - if ( class_exists( 'Disciple_Tools_Migration_Import_Engine' ) ) { - $post = Disciple_Tools_Migration_Import_Engine::attach_migration_comments_to_record( $post_type, $post ); + return self::fetch_records_for_ids( $post_type, $ids ); + } + + /** + * Fetches records for a fixed list of post IDs. + * + * Switches the current user to 0 around each DT_Posts::get_post() call so the + * dt_post_user_meta query inside the theme returns no rows. This keeps + * exporter-specific private meta (tasks, private favorites/inputs/etc.) out of + * the per-record payload — full per-user private state is exported separately + * via {@see self::fetch_post_user_meta()}. + * + * @param string $post_type + * @param int[] $ids + * @return array + */ + private static function fetch_records_for_ids( string $post_type, array $ids ) : array { + $records = []; + $original_user_id = get_current_user_id(); + wp_set_current_user( 0 ); + try { + foreach ( $ids as $post_id ) { + $post = DT_Posts::get_post( $post_type, (int) $post_id, false, false ); + if ( ! is_wp_error( $post ) && is_array( $post ) ) { + if ( class_exists( 'Disciple_Tools_Migration_Import_Engine' ) ) { + $post = Disciple_Tools_Migration_Import_Engine::attach_migration_comments_to_record( $post_type, $post ); + } + $records[] = $post; } - $records[] = $post; } + } finally { + wp_set_current_user( $original_user_id ); } return $records; } + /** + * Dumps wp_dt_post_user_meta rows for the given post IDs. + * + * Carries every per-user private value (tasks, private favorites, private inputs, + * private link/multi_select/key_select/etc.) regardless of who created it. The + * source-side primary key id is stripped — re-imports MUST NOT re-use it. + * + * @param int[] $post_ids + * @return array + */ + public static function fetch_post_user_meta( array $post_ids ) : array { + if ( empty( $post_ids ) ) { + return []; + } + global $wpdb; + $post_ids = array_values( array_map( 'intval', $post_ids ) ); + $placeholders = implode( ',', array_fill( 0, count( $post_ids ), '%d' ) ); + + // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $rows = $wpdb->get_results( + $wpdb->prepare( + "SELECT post_id, user_id, meta_key, meta_value, date, category + FROM {$wpdb->dt_post_user_meta} + WHERE post_id IN ( $placeholders ) + ORDER BY post_id ASC, user_id ASC, id ASC", + $post_ids + ), + ARRAY_A + ); + // phpcs:enable + + if ( ! is_array( $rows ) ) { + return []; + } + + return array_map( + static function ( array $row ) : array { + return [ + 'post_id' => (int) $row['post_id'], + 'user_id' => (int) $row['user_id'], + 'meta_key' => (string) $row['meta_key'], + 'meta_value' => $row['meta_value'], + 'date' => $row['date'], + 'category' => $row['category'], + ]; + }, + $rows + ); + } + /** * Gets post IDs for a post type with optional limit and ID range. * Always ORDER BY ID ASC. diff --git a/includes/class-dt-migration-import-engine.php b/includes/class-dt-migration-import-engine.php index c64e1e8..3a2d6ef 100644 --- a/includes/class-dt-migration-import-engine.php +++ b/includes/class-dt-migration-import-engine.php @@ -821,6 +821,83 @@ public static function apply_deferred_group_connections() : array { * * @return int Number deleted, or -1 on error. */ + /** + * Imports per-user private meta (dt_post_user_meta) for a slice of post IDs. + * + * Replace semantics: deletes all existing dt_post_user_meta rows for the in-scope + * post IDs, then inserts the rows from the export whose post_id is in scope. + * The source-side user_id is remapped via {@see Disciple_Tools_Migration_System_Users::remap_user_id()}. + * + * Rows whose remapped user does not exist on the target are skipped with a logged warning. + * Rows whose post_id is not in scope are silently ignored (they belong to a different batch). + * + * @param array $rows + * @param int[] $post_ids_in_scope Post IDs covered by the current batch (already inserted). + * @return array{ inserted:int, errors: string[] } + */ + public static function import_post_user_meta_for_posts( array $rows, array $post_ids_in_scope ) : array { + $result = [ 'inserted' => 0, 'errors' => [] ]; + + $post_ids = array_values( array_unique( array_filter( array_map( 'intval', $post_ids_in_scope ) ) ) ); + if ( empty( $post_ids ) ) { + return $result; + } + + global $wpdb; + $placeholders = implode( ',', array_fill( 0, count( $post_ids ), '%d' ) ); + // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $wpdb->query( + $wpdb->prepare( + "DELETE FROM {$wpdb->dt_post_user_meta} WHERE post_id IN ( $placeholders )", + $post_ids + ) + ); + // phpcs:enable + + if ( empty( $rows ) ) { + return $result; + } + + $scope = array_flip( $post_ids ); + foreach ( $rows as $row ) { + $pid = isset( $row['post_id'] ) ? (int) $row['post_id'] : 0; + if ( $pid <= 0 || ! isset( $scope[ $pid ] ) ) { + continue; + } + $source_uid = isset( $row['user_id'] ) ? (int) $row['user_id'] : 0; + if ( $source_uid <= 0 ) { + continue; + } + $target_uid = Disciple_Tools_Migration_System_Users::remap_user_id( $source_uid ); + if ( $target_uid <= 0 || ! get_user_by( 'id', $target_uid ) ) { + $result['errors'][] = sprintf( + /* translators: 1: post ID, 2: source user ID */ + __( 'Skipped post_user_meta row (post #%1$d): no target user for source user %2$d.', 'disciple-tools-migration' ), + $pid, + $source_uid + ); + continue; + } + + $ok = $wpdb->insert( + $wpdb->dt_post_user_meta, + [ + 'user_id' => $target_uid, + 'post_id' => $pid, + 'meta_key' => (string) ( $row['meta_key'] ?? '' ), + 'meta_value' => $row['meta_value'] ?? '', + 'date' => $row['date'] ?? null, + 'category' => $row['category'] ?? null, + ] + ); + if ( $ok ) { + ++$result['inserted']; + } + } + + return $result; + } + public static function delete_posts_by_type( string $post_type ) : int { $query = new WP_Query( [ @@ -1264,6 +1341,40 @@ private static function normalize_multi_select_for_import( $value ) : array { return [ 'values' => $values, 'force_values' => true ]; } + /** + * Normalizes a link field from export format to DT_Posts update format. + * + * Export returns links as [{ type, value, meta_id }, ...]. + * DT_Posts::update_post expects { values: [ { type, value }, ... ], force_values?: true }. + * + * meta_id is stripped: it refers to the source-site postmeta row, and passing it would + * send the entry through the "update existing" branch and update the wrong row (or none). + * + * @param mixed $value Link data from export. + * @return array{ values: array, force_values: bool } + */ + private static function normalize_link_for_import( $value ) : array { + if ( is_array( $value ) && isset( $value['values'] ) ) { + return [ + 'values' => array_values( (array) $value['values'] ), + 'force_values' => ! empty( $value['force_values'] ), + ]; + } + $values = []; + if ( is_array( $value ) ) { + foreach ( $value as $item ) { + if ( ! is_array( $item ) || ! isset( $item['type'] ) || ! array_key_exists( 'value', $item ) ) { + continue; + } + $values[] = [ + 'type' => (string) $item['type'], + 'value' => $item['value'], + ]; + } + } + return [ 'values' => $values, 'force_values' => true ]; + } + /** * Extracts the value from a multi-select, location, or tags item. * @@ -1340,6 +1451,8 @@ private static function prepare_record_fields_for_import( array $record, string $connection_types = []; $multi_select_types = []; $user_select_types = []; + $link_types = []; + $private_field_types = []; if ( class_exists( 'DT_Posts' ) ) { $post_settings = DT_Posts::get_post_settings( $post_type, false ); $connection_types = (array) ( $post_settings['connection_types'] ?? [] ); @@ -1349,8 +1462,15 @@ private static function prepare_record_fields_for_import( array $record, string if ( ! isset( $fs['type'] ) ) { continue; } + // Private field values flow through the post_user_meta block, never through records. + if ( $fs['type'] === 'task' || ! empty( $fs['private'] ) ) { + $private_field_types[] = $fk; + continue; + } if ( $fs['type'] === 'user_select' ) { $user_select_types[] = $fk; + } elseif ( $fs['type'] === 'link' ) { + $link_types[] = $fk; } elseif ( in_array( $fs['type'], $values_based_types, true ) ) { $multi_select_types[] = $fk; } @@ -1361,12 +1481,17 @@ private static function prepare_record_fields_for_import( array $record, string if ( in_array( $key, $exclude, true ) ) { continue; } + if ( in_array( $key, $private_field_types, true ) ) { + continue; + } if ( in_array( $key, $connection_types, true ) ) { $fields[ $key ] = self::normalize_connection_for_import( $value ); } elseif ( in_array( $key, $multi_select_types, true ) ) { $fields[ $key ] = self::normalize_multi_select_for_import( $value ); } elseif ( in_array( $key, $user_select_types, true ) ) { $fields[ $key ] = self::normalize_and_remap_user_select_for_import( $value ); + } elseif ( in_array( $key, $link_types, true ) ) { + $fields[ $key ] = self::normalize_link_for_import( $value ); } else { $fields[ $key ] = self::normalize_field_value_for_import( $value ); } From 8620c48cabc2c00b7d88d00bf2e3173bf13394a8 Mon Sep 17 00:00:00 2001 From: corsacca Date: Wed, 6 May 2026 11:39:16 +0100 Subject: [PATCH 7/8] Fix deleting Past uploads --- admin/js/import.js | 57 ++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/admin/js/import.js b/admin/js/import.js index dd4385e..393c18a 100644 --- a/admin/js/import.js +++ b/admin/js/import.js @@ -543,6 +543,36 @@ $pfProceed = $( '.dt-migration-preflight-proceed' ); $pfClose = $( '.dt-migration-preflight-close' ); + // Recent-jobs Delete works on any page with the jobs table, even when no + // upload preview is visible. Register before the modal guard below. + $( document ).on( 'click', '.dt-migration-file-job-delete', function( e ) { + e.preventDefault(); + const $btn = $( this ); + const id = $btn.data( 'job-id' ); + if ( ! id || ! window.confirm( t( 'deleteFileJobConfirm', 'Delete this file migration job and its stored data?' ) ) ) { + return; + } + if ( typeof dtMigrationImport === 'undefined' ) { + return; + } + $btn.prop( 'disabled', true ); + $.post( dtMigrationImport.ajaxUrl, { + action: 'dt_migration_file_job_delete', + nonce: dtMigrationImport.nonce, + job_id: id + } ).done( function( r ) { + if ( r.success ) { + window.location.reload(); + return; + } + window.alert( ( r.data && r.data.message ) ? r.data.message : t( 'deleteFileJobFailed', 'Could not delete the job.' ) ); + $btn.prop( 'disabled', false ); + } ).fail( function() { + window.alert( t( 'deleteFileJobFailed', 'Could not delete the job.' ) ); + $btn.prop( 'disabled', false ); + } ); + } ); + if ( ! $modal.length || ! $( '.dt-migration-start-import' ).length ) { return; } @@ -607,33 +637,6 @@ $section.find( '.dt-migration-record-checkbox' ).prop( 'checked', checked ); } ); - $( document ).on( 'click', '.dt-migration-file-job-delete', function( e ) { - e.preventDefault(); - const $btn = $( this ); - const id = $btn.data( 'job-id' ); - if ( ! id || ! window.confirm( t( 'deleteFileJobConfirm', 'Delete this file migration job and its stored data?' ) ) ) { - return; - } - if ( typeof dtMigrationImport === 'undefined' ) { - return; - } - $btn.prop( 'disabled', true ); - $.post( dtMigrationImport.ajaxUrl, { - action: 'dt_migration_file_job_delete', - nonce: dtMigrationImport.nonce, - job_id: id - } ).done( function( r ) { - if ( r.success ) { - window.location.reload(); - return; - } - window.alert( ( r.data && r.data.message ) ? r.data.message : t( 'deleteFileJobFailed', 'Could not delete the job.' ) ); - $btn.prop( 'disabled', false ); - } ).fail( function() { - window.alert( t( 'deleteFileJobFailed', 'Could not delete the job.' ) ); - $btn.prop( 'disabled', false ); - } ); - } ); } $( document ).ready( init ); From 58855a8621831dfed62dcfa5bbc49186e3b15458 Mon Sep 17 00:00:00 2001 From: corsacca Date: Wed, 6 May 2026 11:39:33 +0100 Subject: [PATCH 8/8] Sync file and API strategies. --- admin/class-dt-migration-import-ajax.php | 16 +++++++++++ rest-api/rest-api.php | 35 ++++++++++++++++-------- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/admin/class-dt-migration-import-ajax.php b/admin/class-dt-migration-import-ajax.php index 4357cd6..4e910ba 100644 --- a/admin/class-dt-migration-import-ajax.php +++ b/admin/class-dt-migration-import-ajax.php @@ -276,6 +276,7 @@ public function handle_import_batch() : void { $code = wp_remote_retrieve_response_code( $records_res ); $rbody = json_decode( (string) wp_remote_retrieve_body( $records_res ), true ); $recs = $rbody['records'] ?? []; + $pum = $rbody['post_user_meta'] ?? []; $total = (int) ( $rbody['total'] ?? 0 ); $has_more = ! empty( $rbody['has_more'] ); @@ -288,6 +289,21 @@ public function handle_import_batch() : void { ] ); } + // Apply per-user private meta returned alongside this batch. + $batch_post_ids = []; + foreach ( $recs as $rec ) { + if ( isset( $rec['ID'] ) ) { + $batch_post_ids[] = (int) $rec['ID']; + } + } + $pum_result = Disciple_Tools_Migration_Import_Engine::import_post_user_meta_for_posts( + is_array( $pum ) ? $pum : [], + $batch_post_ids + ); + if ( ! empty( $pum_result['errors'] ) ) { + $batch_result['errors'] = array_merge( $batch_result['errors'] ?? [], $pum_result['errors'] ); + } + wp_send_json_success( [ 'done' => ! $has_more, 'phase' => 'records', diff --git a/rest-api/rest-api.php b/rest-api/rest-api.php index 563062d..238500b 100644 --- a/rest-api/rest-api.php +++ b/rest-api/rest-api.php @@ -366,24 +366,35 @@ public function records_batch( WP_REST_Request $request ) : WP_REST_Response { $ids = $wp_query->posts ?? []; $total = (int) ( $wp_query->found_posts ?? 0 ); - $records = []; - foreach ( $ids as $post_id ) { - $post = DT_Posts::get_post( $post_type, (int) $post_id, true, false ); - if ( ! is_wp_error( $post ) && is_array( $post ) ) { - if ( class_exists( 'Disciple_Tools_Migration_Import_Engine' ) ) { - $post = Disciple_Tools_Migration_Import_Engine::attach_migration_comments_to_record( $post_type, $post ); + $records = []; + $original_user_id = get_current_user_id(); + wp_set_current_user( 0 ); + try { + foreach ( $ids as $post_id ) { + $post = DT_Posts::get_post( $post_type, (int) $post_id, false, false ); + if ( ! is_wp_error( $post ) && is_array( $post ) ) { + if ( class_exists( 'Disciple_Tools_Migration_Import_Engine' ) ) { + $post = Disciple_Tools_Migration_Import_Engine::attach_migration_comments_to_record( $post_type, $post ); + } + $records[] = $post; } - $records[] = $post; } + } finally { + wp_set_current_user( $original_user_id ); } + $post_user_meta = class_exists( 'Disciple_Tools_Migration_Export_File' ) + ? Disciple_Tools_Migration_Export_File::fetch_post_user_meta( array_map( 'intval', $ids ) ) + : []; + return new WP_REST_Response( [ - 'records' => $records, - 'total' => $total, - 'offset' => $offset, - 'limit' => $limit, - 'has_more' => ( $offset + count( $records ) ) < $total, + 'records' => $records, + 'post_user_meta' => $post_user_meta, + 'total' => $total, + 'offset' => $offset, + 'limit' => $limit, + 'has_more' => ( $offset + count( $records ) ) < $total, ], 200 );