The 1.1.0 admin-UI redesign: the keyword model becomes a link group (equal interchangeable phrases sharing one URL, one group cap, and per-group nofollow/new-tab), managed from a native Tools → Autolink list (REST-backed modal, search/sort/pagination, bulk actions) with the structural rules rebuilt on the Settings API (chip inputs, term targeting). An in-place update from 1.0.0 is carried over transparently by a self-healing migrator — no lockout, no lost data.
Added
- A domain glossary (
CONTEXT.md) defining the project's ubiquitous language (Autolink, Link group, Phrase, Group cap, Post cap, Term targeting). - Architecture decision records for the planned admin UI redesign: a server-rendered admin UI with a REST-backed modal (ADR 0001), a Settings/Tools split of the admin information architecture (ADR 0002), and the self-healing in-place upgrade routine that carries released 1.0.0 sites onto the link-group model despite the brief's "no migration" premise (ADR 0003).
- Reciprocal cross-navigation between the two Autolink admin screens, plus quick links on the Plugins screen (ADR 0002): Settings → Autolink links to the Tools link-group manager, the Tools manager links back to Settings for administrators only (an editor who cannot reach the
manage_options-gated Settings page never sees the link), and the plugin's action-links row on the Plugins screen carries both a Link groups and a Settings link.
Changed
- Replaced the keyword model with the link group model: a set of equal, interchangeable phrases that share one URL, one group cap, and their own nofollow and new-tab behaviour. The option
kntnt_autolink_keywordsis renamed tokntnt_autolink_link_groupsand the capabilitykntnt_autolink_manage_keywordstokntnt_autolink_manage_link_groups. An in-place update from 1.0.0 is repaired by a version-keyed upgrade routine that re-grants the renamed capability and folds the legacy keyword entries into link groups, so an updated site is never locked out of the Tools manager and keeps its data. - Moved the per-link
nofollowand new-tab behaviour from the global structural rules onto each link group. - Tools → Autolink now lists link groups in a native
WP_List_Table(Phrases · URL · Group cap) with an add/edit<dialog>modal and Edit/Delete row actions, saving over a REST API (kntnt-autolink/v1) secured withX-WP-Nonceand a capability check; the table body re-renders server-side after each change with no full page reload. - The Tools → Autolink list gained native search (matching a group by any phrase or its URL), sortable Phrases (by first phrase) and Group cap columns, and pagination — all resolved server-side and preserved across an add, edit or delete, since the REST re-render carries the current search, sort and page. A
kntnt_autolink_per_pagefilter tunes how many groups a page shows. - The Tools → Autolink list gained row selection with bulk Delete and bulk Set group cap… actions. Both apply over a capability-then-nonce gated REST bulk route (
POST kntnt-autolink/v1/link-groups/bulk) and re-render the table without a full page reload, preserving the current search, sort and page; bulk set-cap honours the same positive-integer rule as the per-group cap. A no-JS fallback handles each bulk action through a native confirmation screen (the set-cap screen carrying a number field), nonce-protected before any irreversible delete. - Relocated the structural rules to their own Settings → Autolink page, realising the Tools/Settings menu split.
- Rebuilt the Settings → Autolink page on the native WordPress Settings API (
register_setting, threeadd_settings_sectiongroups — Targeting, Link behaviour & limits, Content eligibility — and anadd_settings_fieldper control), saving throughoptions.php. Post types and deny tags use a new reusable chip input (vanilla ES2022, no build step): post types are a closed selector limited to the registered public post types, deny tags are free-text chips prefilled with theh1–h6, a, code, pre, script, styledefaults. Each field carries a grey help line. The chip widget degrades without JavaScript to a plain comma/newline textarea that still saves; the sanitise callback rejects post types outside the registered public set and coerces the post cap to a positive integer. - Added a term-targeting control to the Settings → Autolink Targeting section: a repeatable stack of
[ taxonomy ▾ ] [ term chips ]rows with an Add taxonomy button. The term chips autocomplete against the selected taxonomy through a newmanage_options-gated REST route (GET kntnt-autolink/v1/terms), extending the chip widget through itsregisterSource/data-suggestseam (no fork). Selections persist through the Settings API as thetermsmap (taxonomy → term ids) and reload into the control. Behaviour is include-only: a post is autolinked when it is one of the enabled post types and carries any of the chosen terms; with no terms selected, every post of the enabled post types is processed — the section help text states this. The control degrades without JavaScript to a per-taxonomy textarea of term ids. - Renamed the
kntnt_autolink_keywordsfilter tokntnt_autolink_link_groups(now passingLink_Group[]); thekntnt_autolink_link_attributescontext now carriesgroup_idandmatched_textinstead ofkeyword_idandbase.
Full changelog: https://github.com/Kntnt/kntnt-autolink/blob/v1.1.0/CHANGELOG.md