| 开发者 | artherslin |
|---|---|
| 更新时间 | 2026年6月3日 17:57 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.0 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
wp-content) as a single archive, and restore them in a guided 3-step wizard.
It is designed for shared hosting environments and uses WordPress APIs for database backup/restore, with archive compression handled by ZipArchive or WordPress’ bundled PclZip.
Key features
meta.json, and wp-content/ into a single archive you can download or restore later.upload_max_filesize / post_max_size limits by uploading your archive in small chunks, with retries and integrity checks.ZipArchive to PclZip compression when needed.museder-restoreone folder (or ZIP) to the /wp-content/plugins/ directory via FTP or through the “Upload Plugin” screen in your WordPress admin.Each backup archive includes:
database.ndjson — a structured export of your WordPress database (plugin-owned format).meta.json — metadata about when and how the backup was created.wp-content/ — your themes, plugins, and uploads.No. RestoreOne may document or implement technical compatibility with certain third-party archive or migration formats so you can move data between tools on your own server. That compatibility is not an endorsement, partnership, or affiliation with those projects unless explicitly stated elsewhere by the authors.
Yes. For safety and compatibility, single files larger than 2GB are skipped during backup. This means they will not be included in the backup ZIP and will not be restored. Sites larger than 2GB in total size can still be backed up and restored successfully as long as each individual file is smaller than 2GB. When files are skipped, the backup completion message shows the skip reasons and examples.
Museder RestoreOne does not require mysqldump. Database backup/restore is implemented in pure PHP using WordPress database APIs.
If your server does not have the ZipArchive PHP extension, the plugin will automatically use WordPress’ built-in PclZip library to create and extract archives.
PclZip can be slower and more memory- or disk-sensitive on very large sites than ZipArchive. If a host blocks reading WordPress core’s wp-admin/includes/class-pclzip.php (for example via open_basedir), backup or restore may fail with a clear error in Logs — use the museder_restoreone_core_admin_include_path filter if your layout is non-standard (see FAQ below).
Large archive uploads use the plugin’s authenticated REST API (museder-restoreone/v2). Chunk bytes are streamed from the HTTP request body (php://input) only for that request, assembled into temporary files under your WordPress uploads area, and never forwarded to third-party URLs. Multipart uploads use PHP’s normal uploaded-file handling instead. All chunk routes require manage_options and a valid REST nonce.
Scheduled backups depend on WordPress cron (or your host’s system cron if DISABLE_WP_CRON is enabled). Email notifications depend on your server’s wp_mail configuration (SMTP plugin, host mail relay, etc.). If cron or mail is blocked, use Settings → Send Test Email, check Logs, and configure host cron / mail as needed.
Very large restores may hit PHP time limits, web server timeouts, or disk space constraints on shared hosting. The Restore wizard supports validate and dry run steps so you can verify an archive before a full execute. For huge sites, prefer a staging clone or WP-CLI-driven restore where your host allows long-running PHP.
All logs are stored under:
wp-content/uploads/museder-restoreone/logs/
You can view or download the latest logs directly from the Logs page in the Museder RestoreOne admin menu.
Optional safe mode (chosen in the Restore screen) saves a snapshot of the active plugin list and sets an admin notice so you can verify the site before clearing the marker. RestoreOne does not automatically deactivate or reactivate other plugins; you manage plugins in WordPress as usual. Exit Safe Mode only clears the marker and the stored snapshot.
No. This plugin runs entirely on your server and does not send backup contents or site data to any external API or cloud service as part of the free base plugin. The Offline readiness / local rules scan on the Dashboard uses local heuristics only (no remote AI service is invoked by the shipped free build).
Sometimes. To help scheduled tasks run promptly, the plugin may send a short, non-blocking HTTP request to your own site's wp-cron.php (a local loopback). That stays on your server, does not transmit backup contents to third parties, and is a common WordPress pattern. If DISABLE_WP_CRON is enabled, your host may rely on system cron instead.
No. Backup download and upload endpoints are protected by time-limited tokens and secret keys generated inside your WordPress site. Only users with access to your WordPress admin can generate valid links, and each link expires after a short period of time.
Not as a formally supported configuration in this release. The plugin is built and QA’d primarily for single-site WordPress. Multisite networks may behave differently across subsites, uploads paths, and roles; use on Multisite only after your own testing on a staging copy of the network.
Yes, advanced sites can override the detected languages directory with the museder_restoreone_languages_dir filter. Return an absolute path without a trailing slash, or return an empty string to skip language-directory handling.
Yes, advanced sites can override the detected must-use plugins directory with the museder_restoreone_mu_plugins_dir filter. Return an absolute path without a trailing slash, or return an empty string if your site does not use a must-use plugins directory.
Most sites do not need any changes. For unusual server layouts where core admin API files cannot be found automatically, developers can use the museder_restoreone_core_admin_include_path filter to return a readable absolute path for the requested core file. Invalid or unreadable values are ignored and the plugin falls back to its default resolution.
.restore-auth-* runtime auth files from backup ZIP export so imported archives cannot overwrite destination auth state.wp_ajax_nopriv_museder_restoreone_exit_safe_mode and authorize exit via the same verify_restore_progress_request path as progress polling when admin session is lost after DB import.completedRestoreJobId and ensure poll completionMeta carries jobId for token grants.payload.job parsing so Step 3 no longer gets stuck at “100% / Waiting for action” after the backend has already completed and cleaned active jobs./wp-json routes to query-style ?rest_route= URLs, detects “HTTP 200 HTML” non-JSON responses, and adds a read-only admin-ajax restore_final_status endpoint as a final completion source.wp-config.php salt replacement during restore (including post-complete read grants).Exit Safe Mode now accepts post-complete restore-token grant fallback when nonce/session continuity is broken after restore, preventing generic red error toasts.wp-login.php?redirect_to=...restore...) to keep reauth return paths pinned to Restore page resume flow instead of drifting to host-specific admin routes.permalink_structure and rewrite_rules across DB import, then flush rewrite rules to keep /wp-json pretty routes available alongside ?rest_route= fallback.*_user_roles, *_capabilities, *_user_level) instead of broad prefix key renames that could fail with duplicate option_name entries on populated targets.*.museder-restoreone-partial file and atomically renames on completion so WordPress core files are never left half-written when a time slice ends (fixes admin critical errors mid-restore on shared hosting).wp-config.php until the file stage completes; on populated hosts with db_then_files, backup mode now merges live DB credentials and table prefix instead of overwriting mid-restore (fixes database connection errors after reload).define() values with nested calls (e.g. Docker getenv_docker()) are preserved without PHP parse errors.ZipArchive::close() so the closed archive is readable before verification runs.map_restore_service_status_to_job() so reload during an active restore resumes monitoring instead of resetting to “Ready to start”.wp_config_mode: keep so wp-config.php is not overwritten when the database is skipped.uploads/museder-restoreone/ from uploads heuristics (reduces test-site false “populated” classification).MusederRestoreOneUI.handleSummaryResponse first (wizard unlock without page reload).job_status, restore_tick) so polling works when the WordPress login cookie is invalidated mid-restore.MEDIA_PATHS_RECONCILE_DONE.restore_job_status mapping after DB import.zip_archive_has_wp_core() public so preflight can detect full-site archives without a fatal error (BUG-SUN-001).bootstrap_root(); add esc_attr() stub; define trailingslashit before ABSPATH (BUG-SUN-003, BUG-SUN-004).museder-restoreone-restore-bootstrap.php (copy to site root) for loopback file slices before WordPress core exists.ZipArchive handle on the same .zip file (PclZip and ZipArchive were both mutating the archive, making close() extremely slow on large sites and risking central-directory corruption).zip_archive_has_entry() — forward slashes, optional ./ prefix, and ZipArchive::FL_NOCASE when available) so false “verification failed” results are less likely to trigger a full repack.wp_ajax_museder_restoreone_* actions, REST routes under museder-restoreone/v1 + v2, and admin_post_museder_restoreone_* downloads (capability + nonce / referer expectations); nginx reverse-proxy smoke in front of the stock Apache WordPress image; ZIP clean install + Plugin Check; Multisite 2-site stack + network uninstall option/cron verification; mail pipeline smoke (wp_mail / Email_Handler::test_email reaches PHPMailer); PHPCS tooling (phpcs.xml.dist + tools/phpcs Composer kit) with run-phpcs-summary.sh.docs/2026-05-06__v2.7.261__readme-key-features__admin-ui-map.md maps readme Key features to admin page= slugs for manual review.ob_clean() instead of ob_end_clean() so they flush stray bytes without popping the whole output-buffer stack (same idea for REST chunk prepare_request_environment()). Behavior for real browsers is unchanged; this avoids breaking nested buffers in automated tests and CLI.upload_id limited to UUID v4 (same format as wp_generate_uuid4()); status / chunk / finalize / abort and temp directory helpers reject garbage ids; cleanup skips non-UUID folders under v2-uploads.museder_restoreone_get_chunk_path() second argument now uses museder_restoreone_safe_path_join() (no traversal via relative fragments).safe_join() final check uses directory-prefix boundary (aligned with other path helpers).MusederRestoreOneAddon (primary) with MusederRestoreOnePro kept as an alias for backward compatibility; strings unchanged.[data-bl-theme="dark"] selectors in admin-style.css that were escaped incorrectly so dark-theme list/table header styles apply.uninstall.php processes sites in batches to reduce memory spikes on large networks (readme Privacy note updated).docs/2026-05-06__v2.7.260__端點矩陣__REST-AJAX-AdminPost.md — hook → capability → nonce / permission_callback matrix for reviewers.museder_restoreone_safe_path_join() now uses a trailing-slash directory prefix check; log path resolution and admin download handlers (logs, reports, restore-job database.sql) validate realpath() + prefix to avoid ambiguous strpos matches.MusederRestoreOnePro / admin UI modal); Dashboard “AI” strings describe local / offline scan behavior only.wp-cron.php, local assets/vendor JS/CSS), Privacy / uninstall aligned with uninstall.php, FAQ on third-party format compatibility (no endorsement).uninstall.php (options, transients, job-lock rows, museder_restoreone_* crons only — no backup/log/report file deletion). create-package.sh ships uninstall.php in the ZIP.tools/functional-test/ adds REST permission smoke, safe_path_join traversal checks, external-URL scan script, and uninstall manifest verification (still not included in the WordPress.org ZIP).assets/vendor/chart.4.5.1.min.js alongside chart.4.5.1.js; expanded assets/vendor/README.txt (versions, licenses, sources).museder_restoreone_get_backup_path() now compares backup directory roots with a trailing-slash boundary after realpath() normalization, preventing ambiguous prefix matches between similarly named directories.php://input, cron and mail dependencies, and large-archive restore limits; Privacy notes optional local build/version log heartbeat after upgrades.tools/functional-test/ scripts (not shipped in the WordPress.org ZIP) to reproduce small-site, large-site, PclZip-forced, chunk REST smoke, and cron listing checks via Docker/WP-CLI.templates/restore-page.php (Restore admin screen uses page-restore.php only) to avoid mixed-language placeholder strings in the distributed tree.museder_restoreone_core_admin_include_path for non-standard WordPress directory layouts; invalid or unreadable filtered paths are ignored.wp_upload_dir(), plugin path helpers) and graceful fallbacks.museder_restoreone_languages_dir, museder_restoreone_mu_plugins_dir) instead of WP_LANG_DIR / WPMU_PLUGIN_DIR.museder_restoreone_get_core_admin_include_path() and avoids ABSPATH path concatenation; missing core helpers fail gracefully instead of fataling.includes/class-chunk-handler-v2.php) permission_check now uses the same two-step REST nonce pattern as v2 restore (check_permissions): X-WP-Nonce then rest_nonce parameter, empty token vs wp_verify_nonce as separate WP_Error branches; HTTP 401 for invalid/missing nonce and shared museder_restoreone_invalid_nonce / museder_restoreone_forbidden codes with v2 restore.permission_check nonce failures now return 401 with museder_restoreone_invalid_nonce (aligned with v2 restore; same user-facing message).index.php sentinels under includes/, includes/wpress/, templates/, assets/ (+ assets/css/, assets/js/), and languages/ to avoid directory listing on misconfigured hosts.includes/vendor/pclzip copy, so the broader plugin-check.ruleset.xml scan is not dominated by third-party PHPCS violations in bundled library code.tests/ or tools/docker/ refer to the public development repository only; those paths are not part of the distributed plugin ZIP from WordPress.org.wp_die() branches use per-status literal response codes with inline esc_html() / esc_html__() so OutputNotEscaped passes under Plugin Check.tests/php-regression/final_review_248_regression.php uses esc_html() on CLI output and wraps checks in museder_restoreone_final_review_248_regression_run() to satisfy prefix / escaping static analysis.tools/docker/setup.sh): exclude root .DS_Store from the plugin tarball so Plugin Check does not flag hidden files in wp-content/plugins.wp_die() via the response args array (avoids OutputNotEscaped on a dynamic third-argument integer).DROP TABLE / replace(); disallowed names are skipped and logged.get_ai_recommendations() checks class_exists( 'Museder_Restoreone_AI_Service' ) before calling it (avoids fatal if an add-on filter is misconfigured).addon_not_active, addon_service_missing) instead of pro_required.check_permissions validates X-WP-Nonce / _wpnonce in two steps (empty check, then wp_verify_nonce), matching the AI REST controller pattern.museder_restoreone_refresh_nonce now requires a valid existing nonce before issuing a new one; admin JS sends the current nonce on refresh.remaining / dailyScans from the hosted build (local preview only; no trialware-style limits in API responses).add_option() job locks now use an explicitly prefixed $option_key built from OPTION_LOCK_PREFIX at the call site (addresses static analysis / human review feedback on dynamic option names).class_exists() guard on cloud upload.check_admin_referer() runs immediately after resolving the log basename and before reading the file from disk.check_ajax_referer() calls in admin AJAX handlers (UI, restore, logs, settings, email) so tooling and reviewers can see nonce verification in each handler.admin-post): For nonce-based links, check_admin_referer() now runs before reading $_GET['file']; signed-token downloads unchanged. Clearer error when the filename is missing after a valid nonce.Museder_Restoreone_Restore_Report::download() plus check_admin_referer( 'museder_restoreone_download_report' ), path confinement under the reports directory, and safe streaming headers.add_option() lock keys (no invalid PHPCS ignore).data-bl-theme="dark") — Restore Center step cards, glass cards, and status colors align with theme tokens (--text-dark, --surface, --glass-*).var(--text-muted) so body copy follows the active theme.wp-cron.php loopback requests. Code — trigger_restore_job() formatting in class-restore-handler.php; AI REST API namespace aligned to museder-restoreone/v1 for consistency with the plugin slug.backup_lite_after_restore and backup_lite_after_restore_safe_mode hooks allow other plugins to integrate with restore workflow.