=== HUBLO Duplicate Content Auditor ===
Contributors: hublowp
Tags: duplicate content, content audit, merge posts, redirect, seo
Requires at least: 6.2
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 1.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Find the posts competing with each other, see which should win, and what you would lose by retiring the other.

== Description ==

Sites that publish for years end up competing with themselves: the 2019 guide
and the 2023 rewrite, the category page and the pillar post, three
near-identical round-ups. You know they are in there. What you do not know is
which one to keep, and what you would quietly lose by deleting the other.

This plugin answers both, and changes nothing until you say so.

= How it works =

1. **Scan.** Every post is compared against every other post that could
plausibly match it.
2. **Compare.** For each overlapping pair: which version is stronger, on what
evidence, and what only the other one contains.
3. **Plan.** A merge and redirect plan you can export and act on — by hand,
with a redirect plugin you already use, or with Pro.

= What you get =

* **Every overlapping pair, ranked.** Sorted by how much they overlap, banded
near identical, strong or partial.
* **A canonical suggestion that shows its working.** Content length,
publication date, comment activity, inbound internal links, featured image and
slug quality are scored side by side, so you can see why one version was
suggested — and disagree.
* **What you would lose.** The question before any merge is what only the
other version has. The audit lists exactly those sections.
* **A redirect plan before anything is created.** Source path, target path,
status code.
* **CSV export.** The duplicate report and the redirect plan, in a shape other
redirect plugins can import.

Similarity detection that assumes spaces between words fails badly on
Japanese, Chinese and Korean. This plugin detects the script and switches from
word shingles to character shingles, so CJK content is compared properly
instead of producing noise.

= What it will not do =

* **Read-only.** It never merges, deletes, rewrites, trashes or redirects
anything. Every destructive step stays with you.
* **Nothing leaves your server.** No external service is contacted, no
analytics, no telemetry.
* **No account, no API key.** Install it and use it.
* **Tidy.** Scan data lives in three tables of its own, which are removed when
you uninstall.

= This plugin, and the Pro plugin =

Free is a complete job: find the overlap, understand it, decide, export the
plan. It is not a trial — nothing expires and no feature stops working. A
separate Pro plugin, distributed outside WordPress.org and not bundled here,
carries the plan out.

**This plugin, free, does all of the analysis:**

* Finds every overlapping pair and ranks them
* Shows why one version is suggested, signal by signal
* Shows what only the other version contains
* Previews the merge and the redirect
* Exports the whole plan as CSV

**Pro carries the plan out**, inside WordPress:

* Performs the merge
* Creates the 301 redirects
* Rewrites internal links pointing at the retired post
* Revision backup, rollback and conflict detection

Matches are banded — near identical, strong overlap, partial overlap —
because a bare percentage is harder to act on than a category.

= Try it without installing =

A WordPress Playground blueprint ships with this plugin. When the directory
offers a Live Preview for it, that preview boots a temporary WordPress in your
browser, seeded with posts that overlap on purpose, and opens straight on the
results. Nothing is installed on your own site.

Full documentation, worked examples and the Free/Pro comparison:
https://hublo-wp.com/free-plugins/duplicate-content-auditor/

== Installation ==

1. Install from the Plugins screen, or upload the folder to `/wp-content/plugins/`.
2. Activate it.
3. Open **Duplicate Audit** in the admin menu.
4. Set your post types and similarity threshold, then press **Scan for duplicates**.

== Frequently Asked Questions ==

= Does it delete, merge or redirect anything? =

No. It never writes to your content. It produces a plan and exports it; acting
on the plan is your decision, with your tools.

= What similarity threshold should I use? =

60% is a sensible default. Raise it if you are seeing loose matches that are
not really duplicates; lower it if you suspect overlap the audit is not
catching.

= Why are short posts matching each other? =

Very short texts share phrasing by coincidence. Set a minimum word count in
Settings — 100 words removes most false matches.

= How does it stay fast on a large site? =

Comparing every post against every other post grows quadratically. Instead
each post gets a fixed-length fingerprint, and only posts whose fingerprints
collide are compared in full.

= Is the canonical suggestion authoritative? =

No, and it does not pretend to be. The scoring table is shown in full
precisely so you can see the reasoning and override it.

= Does it work on Japanese, Chinese or Korean content? =

Yes. Similarity detection that assumes spaces between words fails on unspaced
scripts, so the plugin detects the script and switches to character shingles.

= Does it need an account or an API key? =

No. Nothing leaves your server, and there is nothing to sign up for.

= What happens if I uninstall it? =

Its three tables and its options are removed. Your content is untouched,
because it was never modified in the first place.

== Screenshots ==

1. How many of your posts overlap, and how badly — before you open a single pair.
2. Every overlapping pair, ranked by similarity and banded near identical, strong or partial.
3. The canonical suggestion shows its working: length, age, comment activity, inbound internal links, featured image and slug quality, scored side by side so you can disagree with it.
4. The sections that exist only in the version you are about to retire — the question worth answering before any merge.
5. The redirect the retired post would need: source path, target path, status code — shown before anything is created.
6. Japanese, Chinese and Korean posts are compared with character shingles instead of word shingles, so unspaced scripts match properly instead of producing noise.
7. Post types, similarity threshold, minimum word count and exclusions — set the scope before the scan, not after.
8. Export the duplicate report and the redirect plan as CSV, in a shape other redirect plugins can import. Nothing is applied to your site by this plugin.
9. Where this plugin finishes — an exported plan — and what the separate Pro plugin would do with it.

== External services ==

This plugin does not contact any external service on its own. Nothing is sent
from your site in the background.

The "Upgrade to Pro" button is an ordinary link. If **you** click it, your
browser opens https://hublo-wp.com/buy/duplicate-content-auditor, operated by
HUBLO. While the Pro edition is on sale, that address takes you to Stripe's
hosted checkout, where Stripe takes the payment; this plugin never sees or
handles card details. The link carries no query
string: your site address, your email address, your installation identifier
and your scan results are never appended to it and never leave your site.
Nothing happens until you click.

The Pro edition is a separate plugin distributed outside WordPress.org. This
plugin never downloads it, never installs it and never updates it. It fetches
no executable code from anywhere. After purchase you download the Pro ZIP in
your browser and install it yourself via Plugins > Add New > Upload Plugin.

* Purchase service: https://hublo-wp.com/buy/duplicate-content-auditor - operated by HUBLO
* Payment processing: Stripe - https://stripe.com/privacy
* Terms: https://hublo-wp.com/terms/
* Privacy: https://hublo-wp.com/hublo-privacy-policy/
* Refunds: https://hublo-wp.com/refund-policy/

== Changelog ==

= 1.0.0 =
* First release.
* Near-duplicate detection with CJK-aware shingling.
* Canonical suggestion with visible scoring, section comparison, redirect plan and CSV export.

== Upgrade Notice ==

= 1.0.0 =
First release.
