, , - and are * translated whole rather than assembled from fragments, so a translator sees * a sentence instead of a pile of clauses. Output goes through * wp_kses_post(), which permits that markup and nothing dangerous. */ if (!defined('ABSPATH')) exit; function wpbr_render_help_page() { if (!current_user_can('manage_options')) return; echo "
"; wpbr_admin_header_print(__('Help', 'wpbr-bulk-replace')); echo "
"; echo "

" . wp_kses_post(__('This tool takes a folder of new files, works out which existing post each one belongs to, lets you review and correct those decisions, then backs up and replaces the live files. Nothing touches the live site until you reach Backup & Replace, and every replacement keeps a backup you delete on your own schedule.', 'wpbr-bulk-replace')) . "

"; // ---------- Getting started ---------- echo "

" . esc_html__('Starting a batch', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('Bulk Replace opens the list of batches, each with a progress bar showing how far through it is. Click Add New Batch, give it a label, and Start Batch drops you into the wizard.', 'wpbr-bulk-replace')) . "

"; echo "

" . wp_kses_post(__('The trash icon on a batch deletes it, after a confirmation screen that lets you decide what goes with it — the staged copies of the uploaded files, the backups of the versions it replaced, and its Activity Log entries are each optional. Deleting a batch does not undo anything already done to the site: replaced files stay replaced. If a batch has processed files you might want to reverse, roll them back before deleting, because you lose that ability once the batch is gone.', 'wpbr-bulk-replace')) . "

"; echo "

" . wp_kses_post(__('Each batch is four steps: Upload → Match → Review & Resolve → Backup & Replace. Click any step in the bar at the top to jump to it — nothing is locked. Completed steps show a checkmark; Review and Backup & Replace show a red count when something needs you.', 'wpbr-bulk-replace')) . "

"; // ---------- Steps ---------- echo "

" . esc_html__('Step 1: Upload', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('Drag files onto the drop zone or click it to browse. PDF, DOC and DOCX are accepted. Uploads run one file at a time in the background with a real progress bar, so a large batch won’t hit PHP upload limits. Files already placed in the staging folder by FTP can be pulled in with the Pick Up Files button instead.', 'wpbr-bulk-replace')) . "

"; echo "

" . esc_html__('Step 2: Match', 'wpbr-bulk-replace') . "

"; echo "

" . esc_html__('Two things to set:', 'wpbr-bulk-replace') . "

"; echo "
    "; echo "
  • " . wp_kses_post(__('Post type — what kind of content these files belong to. Every public post type on the site is offered, so this might be Pages, Products, Staff, Events or anything else you have.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Meta field(s) — the custom field holding the file’s URL. Add more than one as chips and reorder them: the first field with a value on a given post wins. Useful when a site has a current field and a legacy fallback.', 'wpbr-bulk-replace')) . "
  • "; echo "
"; echo "

" . wp_kses_post(__('Then click Run Matching. Each filename is compared against every published post of that type — against the post title, and against the filename already attached to it — and scored.', 'wpbr-bulk-replace')) . "

"; echo "

" . wp_kses_post(__('If some of your files must never match certain posts however similar the wording, set up a variant group in Settings. A group names alternatives that are mutually exclusive — desktop / mobile, english / spanish, 2025 / 2026 — and a file showing one variant is never matched to a post showing another. Nothing is configured by default, and a group stays out of the way for any file it has no opinion about.', 'wpbr-bulk-replace')) . "

"; echo "

" . wp_kses_post(__('Re-running is safe. Rows you set by hand are left alone, as are anything marked Skip, New Page Needed, Confirmed (New Attachment), or already combined, replaced or verified. Only rows still carrying an automatic match get re-matched. There’s a Refresh Matching button on Review & Resolve too, which saves your pending edits first and then re-matches.', 'wpbr-bulk-replace')) . "

"; echo "

" . esc_html__('Step 3: Review & Resolve', 'wpbr-bulk-replace') . "

"; echo "

" . esc_html__('The main working screen. Each row shows the staged file, the post it matched, a confidence score, the destination filename, a status and a notes field.', 'wpbr-bulk-replace') . "

"; echo "
    "; echo "
  • " . wp_kses_post(__('Change a match by typing in the post box — results filter as you type. Picking one updates the destination filename automatically and sets the row to Matched.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Preview the staged file with the eye icon next to its name; open the matched post’s live page with the arrow icon next to the post box.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Filter by confidence, by status, or by conflicts. The two filter rows combine: picking Medium and Needs Review shows only rows that are both.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Custom Filter narrows by the matched post’s own fields — tick a field, pick a value, and you can review just one category, or one supplier, or one region, on a single screen.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Bulk Rename applies a filename template across every matched row. Tags: {title}, {id}, {original}, {ext}, {date}, {date:Ymd}, {date:Y}, {meta:field_name}.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Select rows to reveal bulk actions: Skip for Now, Confirm New Attachments, Delete, and Combine Files.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Combine Files merges two or more PDFs into one. Page order matters, so it opens a list first: reorder the files with the arrow buttons or by dragging, until they are in the order you want — top of the list is the first page. The originals stay in the batch marked as combined, and the final order is recorded in the merged row’s notes. It is off until you switch it on in Settings, where you can also see which merge methods your server has — that decides whether the merged file keeps its selectable text, so it is worth a look before you rely on it.', 'wpbr-bulk-replace')) . "
  • "; echo "
"; echo "

" . esc_html__('Statuses', 'wpbr-bulk-replace') . "

"; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo "
" . esc_html__('Status', 'wpbr-bulk-replace') . "" . esc_html__('What it means', 'wpbr-bulk-replace') . "
" . esc_html__('Matched', 'wpbr-bulk-replace') . "" . esc_html__('Has a post assigned and is ready to process.', 'wpbr-bulk-replace') . "
" . esc_html__('Needs Review', 'wpbr-bulk-replace') . "" . esc_html__('Low confidence or no match — wants a human decision.', 'wpbr-bulk-replace') . "
" . esc_html__('Confirmed (New Attachment)', 'wpbr-bulk-replace') . "" . esc_html__('The post has no file yet and you have approved creating one. Set by its own button, not the dropdown.', 'wpbr-bulk-replace') . "
" . esc_html__('Skip', 'wpbr-bulk-replace') . "" . esc_html__('Deliberately excluded. Hidden from the table unless you activate the Skip filter.', 'wpbr-bulk-replace') . "
" . esc_html__('New Page Needed', 'wpbr-bulk-replace') . "" . esc_html__('No post exists for this file yet; parked for separate content work.', 'wpbr-bulk-replace') . "
"; echo "

" . esc_html__('Staged, Combined, Replaced, Verified and Cleaned Up also appear on rows but are set by the tool rather than chosen.', 'wpbr-bulk-replace') . "

"; echo "

" . esc_html__('Posts with no file yet', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('If a matched post has nothing in the configured meta field, the row shows No existing file with a Confirm button instead of a filename. Confirming it means the tool will create a brand-new attachment and point the post’s field at it, rather than overwriting something. This is deliberately a separate approval because it is a bigger change than swapping a file.', 'wpbr-bulk-replace')) . "

"; echo "

" . esc_html__('Conflicts', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('If two files end up matched to the same post, they would overwrite each other — so Backup & Replace is blocked until you fix it. Conflicted rows are tinted, explain what they collide with, and have a Show them link that highlights the whole group. A Conflicts filter chip appears while any exist.', 'wpbr-bulk-replace')) . "

"; echo "

" . wp_kses_post(__('Separately, if two different posts share one file on the site, what happens depends on whether both are in this batch. If they are, each gets its own new copy named after itself instead of fighting over the shared one, and you will see a notice about it on the Backup & Replace step.', 'wpbr-bulk-replace')) . "

"; echo "

" . wp_kses_post(__('If the other post is not in this batch, that row is refused. Replacing the file would change a page you did not select, and nothing here will do that quietly. The run continues with every other row; the refused one names the page it shares with, its ID and the field it points through, so you can add it to the batch and replace both together, or give one of them its own file first.', 'wpbr-bulk-replace')) . "

"; echo "

" . esc_html__('Sending it to a reviewer', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('Download CSV opens a window with instructions and a copyable email before the download starts, so whoever you send it to knows exactly which columns to edit. Import File takes their CSV or XLSX back and matches rows by filename. Imports never overwrite work that is already combined, replaced or verified, and every import is listed in an Import history table with an Undo button — so a bad import is one click to reverse, however long ago you noticed.', 'wpbr-bulk-replace')) . "

"; echo "

" . esc_html__('Step 4: Backup & Replace', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('One table holding every resolved file, at whatever stage it has reached. The Stage chips at the top split it into not-yet-processed, processed, and verified.', 'wpbr-bulk-replace')) . "

"; echo "

" . esc_html__('The buttons enable based on what you select', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('Each action applies to the rows in your selection it can actually act on, and ignores the rest. Select everything and hit Backup & Replace and it processes the unprocessed ones, leaving anything already done untouched. The button shows how many it will affect when that differs from your selection, and the confirmation says how many are being left alone.', 'wpbr-bulk-replace')) . "

"; echo "
    "; echo "
  • " . wp_kses_post(__('Backup & Replace — rows not yet processed.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Roll Back — processed rows that still have a backup.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Mark Verified — processed rows not already verified.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Delete Backups — rows already marked verified.', 'wpbr-bulk-replace')) . "
  • "; echo "
"; echo "

" . esc_html__('A button grays out only when none of your selected rows qualify, and its tooltip says why.', 'wpbr-bulk-replace') . "

"; echo "

" . esc_html__('Processing a selection', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('Tick the rows you want and click Backup & Replace. You do not have to do the whole batch at once — run one file first, check it on the live site, then come back and do the rest. Running it repeatedly is fine; each pass only touches what you selected.', 'wpbr-bulk-replace')) . "

"; echo "

" . esc_html__('Before you run anything, the table shows you exactly what will happen to each file:', 'wpbr-bulk-replace') . "

"; echo "
    "; echo "
  • " . wp_kses_post(__('Replace file — the post already has a file, and it will be overwritten at the same path so the URL does not change.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Replace & rename — you entered a different filename in Rename to. The new file is written under that name, given its own Media Library entry, and the post is pointed at it. The old file stays on the server so anything already linking to it still works. This one can be rolled back: the post goes back to its original file and the renamed copy is removed.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('New attachment — the post has no file at all, so one is created and the post’s field points at it.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Add missing file — the post links to a file that is not actually on the server. The new file is written to the path the page already uses, and a Media Library entry is created or refreshed for it. The link keeps working and the URL does not change. There is nothing to back up in this case, so these rows cannot be rolled back.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . esc_html__('All of these are normal outcomes; none is a problem.', 'wpbr-bulk-replace') . "
  • "; echo "
  • " . wp_kses_post(__('Rename to — the name of the file that gets written. Worth a glance: if a filename here looks unrelated to the post, that post’s field is pointing somewhere odd and is worth checking before you overwrite it.', 'wpbr-bulk-replace')) . "
  • "; echo "
"; echo "

" . wp_kses_post(__('Each row carries an eye icon to preview the staged file and an arrow icon to open the post’s page in a new tab, so you can check what you are about to overwrite before committing. On the processed table there is also a document icon that opens the file currently live on that post — the quickest way to confirm a replacement actually took (clear your cache first, or open it in a private window).', 'wpbr-bulk-replace')) . "

"; echo "

" . esc_html__('For each file it backs up the current version, writes the new one, and refreshes the Media Library record.', 'wpbr-bulk-replace') . "

"; echo "

" . esc_html__('What a run looks like', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('Files go through a few at a time in the background. While that happens the buttons in the toolbar are replaced by a progress bar, and because that toolbar sticks to the top of the screen it stays visible however far down the table you scroll. Alongside the bar you get a percentage, a count, a rough time remaining once it has enough to estimate from, and the name of the file being worked on. Show details opens the full running log underneath.', 'wpbr-bulk-replace')) . "

"; echo "

" . wp_kses_post(__('The table updates as it goes rather than only at the end: each row’s Action pill flips to done, failed or skipped, the row tints to match, and its checkbox clears. So you can watch it work down the list, and a failure stands out immediately instead of being buried in the log.', 'wpbr-bulk-replace')) . "

"; echo "

" . wp_kses_post(__('Keep the tab open while it runs — the browser will warn you if you try to leave. If it does stop partway (closed tab, dropped connection, server hiccup), nothing is left half-done: every file either completed or was never touched. The outstanding ones simply show as not-yet-processed again, so you select them and run once more. The toolbar stays on Stopped with the log open rather than quietly going back to normal, so an interrupted run is obvious.', 'wpbr-bulk-replace')) . "

"; echo "

" . esc_html__('Rolling back', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('Select processed rows and click Roll Back. This genuinely reverses the change rather than just resetting a status:', 'wpbr-bulk-replace')) . "

"; echo "
    "; echo "
  • " . wp_kses_post(__('A replaced file has its previous version copied back from the backup, and its Media Library record refreshed.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('A newly created attachment is deleted and the post’s field cleared, putting it back to having no file.', 'wpbr-bulk-replace')) . "
  • "; echo "
"; echo "

" . wp_kses_post(__('The filters are: by action type, by a text search on filename or post title, and a Custom Filter on the post’s own fields — so you can process or roll back one category at a time. Filtering unticks anything that scrolls out of view, and Select All only takes what is currently shown, so you cannot act on rows you cannot see.', 'wpbr-bulk-replace')) . "

"; echo "

" . wp_kses_post(__('Where a backup still exists, Backup kept is a link — it opens the previous version of the file, so you can compare old against new before deciding whether to keep the replacement or roll it back.', 'wpbr-bulk-replace')) . "

"; echo "

" . esc_html__('The Backup column tells you per row whether it can be undone. A replaced file needs its backup to still exist — if you have already deleted its backup, that row says so and can no longer be rolled back. Newly created attachments can always be undone.', 'wpbr-bulk-replace') . "

"; echo "

" . esc_html__('Rollback restores the file, not anything else. If you edited the post afterwards, those edits stay. And rolling back a newly created attachment leaves that post with an empty file field again, which is correct but worth expecting.', 'wpbr-bulk-replace') . "

"; echo "

" . esc_html__('Verifying and cleaning up', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('Once you have checked a file on the live site, select it and click Mark Verified. That is just a record of your own check — it changes nothing on the site.', 'wpbr-bulk-replace')) . "

"; echo "

" . wp_kses_post(__('Delete Backups then removes the backups for verified rows. This is the one irreversible action in the tool: after it, those rows can no longer be rolled back. Rows you have not marked verified are refused, so cleaning up is always two deliberate steps. Backups are never removed on a timer — leave them as long as you like.', 'wpbr-bulk-replace')) . "

"; // ---------- Getting better over time ---------- echo "

" . esc_html__('Getting better over time', 'wpbr-bulk-replace') . "

"; echo "

" . esc_html__('Matching here is deterministic: the same files and the same posts produce the same scores, every run. It does not learn from your corrections, and it does not quietly change its mind between batches — which is what makes a re-run safe.', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('Your corrections are still not throwaway work within a batch: rows you set by hand are protected, so Refresh Matching never overwrites a decision you already made.', 'wpbr-bulk-replace')) . "

"; echo "

" . wp_kses_post(__('Carrying that knowledge between batches — remembering a correction so next year’s copy of the same file matches on its own, managing the shorthand your filenames use, and the terms to ignore — is what WP Bulk Replace Pro adds. There is a link to it on the Review & Resolve step.', 'wpbr-bulk-replace')) . "

"; // ---------- Activity log ---------- echo "

" . esc_html__('Activity Log', 'wpbr-bulk-replace') . "

"; echo "

" . wp_kses_post(__('Every file processed, rolled back, verified or cleaned up is recorded under Activity Log, along with matching runs and reviewer imports. The on-screen log during a run is convenient but disappears; this one persists, so you can check what happened to a particular file days later.', 'wpbr-bulk-replace')) . "

"; echo "

" . esc_html__('Filter by batch, action, result, or search a filename. Failed rows are tinted, and the counts at the top tell you at a glance whether a run was clean. If a file did not do what you expected, this is the first place to look — the message column carries the exact reason it was skipped or failed.', 'wpbr-bulk-replace') . "

"; echo "

" . esc_html__('Entries are kept until you clear them. There is a control at the bottom of the page to drop anything older than 30 or 90 days, or wipe it entirely; clearing the log never touches your files or batches.', 'wpbr-bulk-replace') . "

"; // ---------- Settings ---------- echo "

" . esc_html__('Settings', 'wpbr-bulk-replace') . "

"; echo "
    "; echo "
  • " . wp_kses_post(__('Filename when replacing — Keep overwrites each file in place so its URL never changes. Rename gives every file a consistent name from the template instead, which is the one you want when the existing filenames are a mess; the URL changes and the old file is left on the server. This only sets the default — any row can be overridden on the Review step.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Naming template — used when renaming, and for any post that has no file yet. Same tags as Bulk Rename.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Auto-accept threshold — at or above this a match is accepted; below it the row wants review. Default 0.65.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('High confidence threshold — cosmetic only; controls where the confidence indicator switches from medium to high. Default 0.85.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Rows per request — how much Backup & Replace does per request. Lower it on a slow server. Default 5.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Variant groups — alternatives that must never match each other, however similar the wording. Nothing is configured by default.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Staging and backups folders — leave blank for the defaults. Both need to be writable by PHP and by whatever account you upload with. To put backups outside the web root, set WPBR_BACKUPS_DIR in wp-config.php instead.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Backups location — shows where backups are kept and whether that folder can be read from the web. Check locations lists private folders the plugin can verify; you pick one and confirm. Existing backups are not moved and stay available for rollback.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Add a version to links to replaced files — on by default. Adds ?updated_on= and the date and time of the replacement to links to files this plugin replaced, so a browser or caching service fetches the new file instead of showing a saved copy. It reaches the links to documents (PDF, Word, Excel and similar files) that WordPress builds from your Media Library on public pages, and links your theme prints through the plugin. It does not change links typed into your content, images, audio or video, and nothing stored is changed. If a download or preview feature stops working for a file you replaced, turn it off.', 'wpbr-bulk-replace')) . "
  • "; echo "
  • " . wp_kses_post(__('Combine Files — show the PDF merge action. Needs a working merge method on the server; FPDI ships with the plugin and covers most cases.', 'wpbr-bulk-replace')) . "
  • "; echo "
"; echo "

" . esc_html__('Where files live', 'wpbr-bulk-replace') . "

"; echo "

"; /* translators: %s is an absolute server path. */ echo wp_kses_post(sprintf(__('Staging: %s', 'wpbr-bulk-replace'), esc_html(wpbr_staging_dir()))); echo "
"; /* translators: %s is an absolute server path. */ echo wp_kses_post(sprintf(__('Backups: %s', 'wpbr-bulk-replace'), esc_html(wpbr_backups_dir()))); echo "

"; // ---------- Troubleshooting ---------- echo "

" . esc_html__('If something looks wrong', 'wpbr-bulk-replace') . "

"; echo ""; echo ""; echo ""; $wpbr_troubleshooting = array( array( __('Everything matched to obviously wrong posts', 'wpbr-bulk-replace'), __('Check the meta field name is exactly right (it is case-sensitive) and that the post type actually has published posts using it. If the filenames and the titles share no words at all, matching has nothing to go on — rename the files closer to the titles, or set those rows by hand.', 'wpbr-bulk-replace'), ), array( __('A row says it matched a post ID with no title', 'wpbr-bulk-replace'), __('That post is unpublished or deleted. Pick a different one.', 'wpbr-bulk-replace'), ), array( __('Lots of rows show “No existing file”', 'wpbr-bulk-replace'), __('Either those posts genuinely have no file yet, or the wrong meta field is configured. Check one post in the editor before confirming a batch of new attachments.', 'wpbr-bulk-replace'), ), array( __('I clicked an action and nothing seemed to happen', 'wpbr-bulk-replace'), __('Look at the toolbar — the buttons are replaced by a progress bar while a run is going. If it finished too fast to notice, check the Activity Log for what it did.', 'wpbr-bulk-replace'), ), array( __('A file did not do what I expected', 'wpbr-bulk-replace'), __('Open the Activity Log and search its filename. The message column states exactly why it was skipped or failed.', 'wpbr-bulk-replace'), ), array( __('The Backup & Replace button is grayed out', 'wpbr-bulk-replace'), __('Nothing is ticked. Select at least one row.', 'wpbr-bulk-replace'), ), array( __('Backup & Replace will not show at all', 'wpbr-bulk-replace'), __('There are unresolved conflicts — the step shows which. Fix or skip them and it unblocks.', 'wpbr-bulk-replace'), ), array( __('A row says it cannot be rolled back', 'wpbr-bulk-replace'), __('Its backup was deleted during cleanup. The replacement stands; recovering the old file means finding it elsewhere.', 'wpbr-bulk-replace'), ), array( __('Scanned 0 files', 'wpbr-bulk-replace'), __('Check the files are in the staging path shown above and end in .pdf, .doc or .docx.', 'wpbr-bulk-replace'), ), array( __('Cannot write to the staging folder from FTP', 'wpbr-bulk-replace'), __('Your upload account and the web server’s PHP user may differ. Ask whoever runs the server to confirm both can write there.', 'wpbr-bulk-replace'), ), array( __('Combine Files fails', 'wpbr-bulk-replace'), __('The error names every merge method it tried. Failing that, merge the files in another tool and upload the result as a single file.', 'wpbr-bulk-replace'), ), array( __('An import made a mess', 'wpbr-bulk-replace'), __('Use Undo in the Import history table on Review & Resolve.', 'wpbr-bulk-replace'), ), array( __('I replaced a file but the old one still shows', 'wpbr-bulk-replace'), __('Usually the replacement worked and a browser, a caching plugin or a CDN is showing a saved copy. On the Backup & Replace step, click the document icon beside the matched post: it always opens the newest file. If that is the new file, clear your page cache and CDN and reload. Links typed into your content, images, audio and video do not get a version marker.', 'wpbr-bulk-replace'), ), array( __('A replaced file looks wrong on the site', 'wpbr-bulk-replace'), __('Clear your page cache and check in a private window. If it is genuinely wrong, the backup is still in the backups folder as long as you have not cleaned it up.', 'wpbr-bulk-replace'), ), ); foreach ($wpbr_troubleshooting as $wpbr_row) { echo ""; } echo "
" . esc_html__('Symptom', 'wpbr-bulk-replace') . "" . esc_html__('What to check', 'wpbr-bulk-replace') . "
" . esc_html($wpbr_row[0]) . "" . esc_html($wpbr_row[1]) . "
"; echo "

"; wpbr_help_link_echo('core.replace.old-file-showing', __('Why am I still seeing the old file after replacing it?', 'wpbr-bulk-replace')); echo "

"; // ---------- Review requests ---------- // Only once there is something to ask: before WP Bulk Replace has a // WordPress.org listing, this says nothing about reviews at all. $wpbr_preference = wpbr_advocacy_preference_html(); if ($wpbr_preference !== '') { echo "

" . esc_html__('Review requests', 'wpbr-bulk-replace') . "

"; echo "

" . esc_html__('Once you have used WPBR Bulk Replace successfully and come back to it or run a second batch, it may ask on the Batches screen whether you would review it on WordPress.org. It never asks in your first session, more than once a session, or over an error, a dialog or a run in progress. This choice is for everyone on this site.', 'wpbr-bulk-replace') . "

"; // Built from escaped parts by wpbr_advocacy_preference_html(), and held // to that shape again here. echo wp_kses($wpbr_preference, wpbr_advocacy_preference_allowed_html()); } echo "
"; }