Ir al contenido

User Tags

Una etiqueta de usuario que se comporta como un rol —aparece en $user->roles y responde a current_user_can()— sin conceder permisos ni pesar como un rol. Librería PHP para WordPress, libre de empaquetar en cualquier plugin.

Versión1.2.1
RequiereWordPress 5.9+
PHP7.4+
LicenciaGPLv3
Actualizado2026-07-30

User Tags es una etiqueta que ante todo WordPress se comporta como un rol —aparece en $user->roles, responde a current_user_can(), la encuentra WP_User_Query— pero no concede ninguna capacidad y nunca se escribe en la opción autocargada {prefix}user_roles. Es el motor de tags que usa LeanRoles, publicado aparte para que cualquier plugin lo adopte. También se puede activar como plugin por sí solo, con las pantallas de administración encendidas.

El problema

WordPress no ofrece ninguna primitiva para decir «este usuario es cliente mayorista» sin concederle permisos: solo existen los roles. Por eso los plugins de membresía y comercio no paran de inventarlos. Cada rol inventado se copia en una opción que se deserializa y se mantiene en memoria en cada worker de PHP y en cada request — y los sitios que acaban con cuarenta roles son justo aquellos cuyo tráfico va casi siempre logueado, donde la caché de página nunca entra. Esta librería es la alternativa que falta.

Cómo se empaqueta

Copia el directorio en tu plugin —git subtree, submódulo o copia simple, lo que encaje con tu proceso— e incluye un solo fichero. Esa es toda la integración: no cargues nada más ni hagas autoload de src/. Como en Action Scheduler, la copia más nueva presente en el sitio es la que arranca.

require_once __DIR__ . '/libraries/user-tags/user-tags.php';

add_action( 'user_tags_ready', function () {
    user_tags_register( 'wholesale', array( 'name' => 'Wholesale customer' ) );
} );

if ( function_exists( 'user_tags_add' ) ) {
    user_tags_add( $user_id, 'wholesale' );
}Lenguaje del código: PHP (php)

A partir de ahí la etiqueta es indistinguible de un rol para todo lo demás: current_user_can( 'wholesale' ), in_array( 'wholesale', $user->roles, true ) y get_users( array( 'role' => 'wholesale' ) ) funcionan sin más.

Interfaz de administración opcional

Las pantallas se distribuyen con la librería pero solo se cargan si las pides, con un único filtro añadido en tiempo de include:

add_filter( 'user_tags_enable_admin', '__return_true' );Lenguaje del código: JavaScript (javascript)

Eso te da Usuarios → Tags para crear y editar tags con importación y exportación CSV, una columna y enlaces de filtro en el listado de usuarios, asignación y borrado en bloque, y casillas en el perfil de usuario. Nada aparece —ni siquiera se carga de disco— hasta que el filtro lo dice, y el menú siempre cuelga de Usuarios. Activada como plugin independiente, estas pantallas vienen ya encendidas.

Dónde viven los datos

Todo se guarda en estructuras que el core ya tiene: el catálogo en una taxonomía user_tag (fuera del autoload), la configuración por tag en termmeta, las asignaciones en term_relationships (con term_taxonomy_id indexado, así que «todos los que tienen la tag X» es un seek) y un espejo de lectura en usermeta que viaja en la caché de metadatos que WP_User_Query ya calienta, de modo que la ruta caliente no cuesta ninguna consulta extra. La taxonomía es la fuente de verdad; el espejo es derivado y reconstruible.

Sin tablas propias, sin dbDelta, sin versión de esquema, sin migraciones.

Pensada para convivir

Está diseñada explícitamente evitando los problemas que Action Scheduler —la referencia de librería empaquetable— acumuló con los años:

  • Nada de tablas propias: se apoya solo en estructuras del core, así que no hay esquema que migrar ni restos exóticos al desinstalar.
  • Cuando varios plugins la empaquetan, user_tags_diagnostics() dice qué copia está activa, qué fichero la registró y qué otras copias se vieron.
  • La arbitración de versiones (src/Versions.php) está congelada y su estado vive en $GLOBALS, para que una copia más nueva pueda leer lo que recogió una más vieja.
  • Detección por funcionalidad —user_tags_supports( 'user-query' )— en vez de comparar cadenas de versión.
  • No impone ninguna interfaz de administración: incluye pantallas opcionales que solo se cargan si un plugin lo pide, y siempre bajo «Usuarios».

01

Se comporta como un rol

Aparece en $user->roles, responde a current_user_can() y la encuentra WP_User_Query, sin conceder ninguna capacidad.

02

No pesa en memoria

Nunca se escribe en la opción autocargada {prefix}user_roles, así que no se deserializa en cada worker ni en cada request.

03

Interfaz opcional bajo Usuarios

Pantallas que solo se cargan con un filtro: crear y editar tags, importar y exportar CSV, columna y filtros en el listado y asignación en bloque.

04

Sin tablas ni migraciones

Se apoya solo en taxonomía, termmeta y usermeta del core; sin dbDelta, sin versión de esquema, sin migraciones.

05

Pensada para empaquetarse

Como Action Scheduler: la copia más nueva gana, con diagnóstico de copias y detección por funcionalidad.

git subtree add --prefix libraries/user-tags https://github.com/davefx/user-tags.git 1.2.1 --squash

O descarga el ZIP e instálalo desde Plugins → Añadir nuevo.