| 开发者 | jethalal |
|---|---|
| 更新时间 | 2026年11月8日 11:30 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.1 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
/old-page) and the
Target URL (where visitors should go: a path such as /new-page, or a full
address)./blog/*, or Regex./old-page?utm_source=newsletter, is redirected too and keeps the parameters. If
the Source itself contains a ?, that query string must match exactly.
In a Wildcard rule, write $1 (or *) in the Target where the part the star
matched should go: Source /blog/*, Target /news/$1 sends /blog/2024/hello to
/news/2024/hello. In a Regex rule $1, $2 and so on are what the brackets
caught.
A rule is refused, with the reason, if its regex does not compile, if its Source is
an address on another site, or if it would send an address to itself.
Use Test on a rule to see where it sends visitors and Edit to change it.
Click the Yes/No in a rule's Enabled column to switch that rule off or on.
Enable all, Disable all and Delete all act on every rule, on every page of
the list; when the list is narrowed by a search or a group they act on every rule
that matches, and say so. Tick rules to enable, disable, delete or change the type
of just those.
Other tabs and tools
source, target, type (a header row is fine). A file
with a header row may also carry match, group and enabled columns.Yes. Click Import from Redirection on the Redirects tab. Ordinary and regex redirects are copied with their status code and whether they were enabled. Redirection's conditional rules (login state, referrer, role and similar) and actions that are not redirects, such as error pages, are not imported; the import tells you how many it skipped and why. Addresses that already have a rule are left alone, so running it twice adds nothing.
For each missing address that is requested: the address, the page that linked to it, the visitor's IP address, how many times it has been requested and when it was last seen. All of it is stored in your own site's database and sent nowhere. An entry stays until you dismiss it or clear the log on the 404 Monitor tab. The plugin adds a paragraph about this to the suggestions under Settings → Privacy, for your site's privacy policy.
Rules are checked only on the front end, and only when a page is requested. The 404 monitor records a miss after WordPress has already decided the page is not found.
/old-page?utm_source=newsletter was not redirected by the rule for /old-page.
It is now, and the parameters travel to the target. A rule whose Source itself
contains a ? still has to match that query string exactly./café never matched, and a rule made from the 404 log for
/my%20old%20page was stored as /myoldpage and redirected that address instead.
Rules are now stored and compared as the address they name. Rules you already
have go on catching what they caught./blog/* to /news/$1 sent every visitor to a literal /news/$1. Both $1 and
* now work in a wildcard rule's Target.# or a named group, and a Target containing %20 or
other percent-encoding, are stored as typed./new/$1 used to send visitors to a literal "/new/$1".hrm_ prefix, which is shorter than WordPress.org accepts.
Functions, options, cron hooks and the plugin's own actions and filters are
now harvify_redirect_*; global constants are HARVIFY_REDIRECT_*; classes
are Harvify_Redirect_*.harvify-redirect/v1. The old
hrm/v1 namespace is GONE and there is no compatibility alias — any code
calling it will 404 until updated. Also renamed: the admin script and style
handle hrm-admin is now harvify-redirect-admin, and the localized
JavaScript object hrmSettings is now harvifyRedirectSettings.Contributors field now names the correct WordPress.org account.License URI header, which the readme was missing.$file while loading its includes. WordPress runs
include_once on that file from INSIDE its own uninstall_plugin() function, so the
assignment overwrote WordPress's $file -- core then fired its uninstall action under a
nonsense name, the cleanup callback was never reached, and wp_harvify_redirects,
wp_harvify_404_log and the daily-alert cron survived deletion forever. The loader variable is
now prefixed. Cleanup is verified by a committed gate that deletes the plugin with the network
cut and then checks the tables are gone.translators: comment and produced a MissingTranslatorsComment
ERROR -- a rejected submission -- in the artifact nobody had ever checked. The comment now sits
above a statement, where the rewrite preserves it.Link: ...; rel="blocked-by" header pointing at the rule's target.
The dispatcher now asks "is this a redirect?" rather than "is this 410?", so no future status
can repeat this.groups column is a reserved word; renamed to redirect_group).