Releases: davefx/user-tags
Release list
1.3.4
The plugin name is User Tags again.
It had been changed to User Tags Lib to claim a wordpress.org permalink — the directory derives the permalink from the plugin name, once and permanently. The library is not being listed there separately, so the name was buying nothing, and the header justified itself with a reason that no longer applied.
The text domain stays user-tags-lib. That one is not about the directory: user-tags belongs to an unrelated plugin, and two plugins loading translations under a single domain on the same site surfaces as somebody else's strings appearing in these screens.
1.3.3
Clears the wordpress.org Plugin Check, which CI now runs against the tree git archive produces.
The findings were annotations rather than defects. php://temp is a memory stream, so the sniff demanding WP_Filesystem was matching a function name rather than a destination. Every handler on the tag screen runs after the dispatcher's check_admin_referer() and capability check, which PHPCS cannot follow across the call. The profile's submitted tags are sanitised per element by the loop that reads them, and dropped unless the catalogue recognises them. Each is now marked as such, with the reason.
One real change: the export's what parameter is unslashed and sanitised on the way in rather than only compared against a literal.
Tested up to: 7.1 — the directory treats a stale value as an error and hides the plugin from search until it is current.
1.3.2
Packaging for the wordpress.org directory. Nothing behaves differently.
The plugin name in the header is now User Tags Lib. wordpress.org turns the plugin name into the permalink, once and permanently — a slug cannot be changed after approval — and user-tags belongs to another plugin. user-tags-lib is the slug the text domain was already named for, so the two now agree, which is what the translation platform needs in order to serve anything at all.
The library calls itself User Tags everywhere a slug is not involved.
readme.txt gains an Installation section and a changelog that reaches the stable tag.
1.3.1
A standalone copy now counts as standalone even when it lost a version tie.
1.3.0 said every registered copy was considered. It was not: duplicates are kept in a separate list, and two plugins carrying the identical version means one of them is recorded there rather than given a seat. If the one that lost the tie happened to be the plugin the site owner had installed, its screens disappeared with nothing to explain why.
Found by installing it three ways — standalone, bundled, and both at once — rather than by reading the code.
200 tests.
1.3.0
Activated as a plugin, it now registers its screens by itself.
Installing User Tags from wordpress.org previously left the site with no interface at all: the screens sat behind user_tags_enable_admin, a filter only a bundling plugin knew to set. The listing would have shipped something that appears to do nothing.
The default is now whether a copy is installed as a plugin in its own right — its directory sitting directly inside wp-content/plugins rather than further down inside somebody else's plugin. Bundled-only installs still default to off, which is the case the filter was added for, and a bundling plugin still opts in the same way:
add_filter( 'user_tags_enable_admin', '__return_true' );Every registered copy is considered, not only the one that booted: if the plugin is active, its screens should not vanish because another plugin happened to bundle a newer copy that runs instead.
user_tags_diagnostics() reports standalone.
199 tests.
1.2.2
The admin screen's page slug is user-tags again.
Renaming the text domain to user-tags-lib in 1.2.0 had swallowed Menu::SLUG, because they were the same string. The menu link pointed at users.php?page=user-tags-lib, and anyone following a bookmark or a link built from the documented slug got Sorry, you are not allowed to access this page.
No test caught it — they all went through Menu::url(), which was internally consistent with the mistake. One now pins the slug itself, and records why the two are different things: one is a URL, the other has to match a wordpress.org slug.
195 tests.
1.2.1
No functional change.
The escaping and N+1 invariants that covered the admin surfaces moved here with the screens — removing them from the consuming plugin without adding them here would have been a silent loss of the checks that matter most about display code.
readme.txt added in wordpress.org submission format. That listing is what gives the translation platform a slug to build against, which is the only reason the text domain is user-tags-lib.
194 tests.
1.2.0
Optional admin screens. They ship with the library but load only if you ask:
add_filter( 'user_tags_enable_admin', '__return_true' );Users → Tags for creating and editing tags with CSV import and export, a column and filter links on the users list, bulk assign and remove, and checkboxes on the user profile. Nothing appears — and nothing is even read from disk — until the filter says so.
They live in this package rather than a separate one on purpose. Two bundleable packages with independent version numbers produce a compatibility matrix: a site could run the screens from one release against the data layer of another, because two plugins bundled different pairs. One package cannot drift out of step with itself.
The menu always sits under Users.
Translations. languages/ carries the .pot and a Spanish translation. The library loads them itself on init, preferring wp-content/languages/plugins/ so a site override or the wordpress.org platform wins over the bundled copy.
Breaking: the text domain is now user-tags-lib. It has to match a wordpress.org slug for that platform to have anything to translate, and user-tags is already taken there. The entry file also carries plugin headers now, so it can be activated on its own — which is the only reason Action Scheduler's own strings ever reach a site.
If you translate this library's strings yourself, move from user-tags to user-tags-lib. Nothing else changed.
187 tests.
1.1.0
Relicensed to GPL-3.0-or-later.
The LICENSE file previously carried only the notice rather than the licence text, so GitHub reported the repository as having no detectable licence. It now carries the full GPL-3 text, and user-tags.php carries the copyright notice the licence asks for.
No functional change.
Compatibility note. Copies already obtained under 1.0.x keep their GPL-2.0-or-later grant. A plugin licensed "GPLv2 or later" can bundle this version; one licensed GPLv2-only cannot.
git subtree add --prefix libraries/user-tags \
https://github.com/davefx/user-tags.git 1.1.0 --squash1.0.1
Reword the slug-collision message so it explains the refusal rather than referring to a product tier.
No functional change. The message a caller sees when a tag slug is already taken by a real role now says why it is refused:
"%s" is already a real role. A tag cannot shadow one: choose another slug, or delete the role first.
Install
git subtree add --prefix libraries/user-tags \
https://github.com/davefx/user-tags.git 1.0.1 --squash