En WordPress, puedes registrar múltiples autores, y cada uno tendrá su propia URL. El problema es que esta URL muestra el nombre de usuario del autor, lo que representa un riesgo de seguridad para tu sitio WordPress. Como el nombre de usuario está expuesto, los atacantes podrían usarlo para intentar iniciar sesión o forzar su entrada en tu sitio.
Para solucionar este problema, podemos enmascarar la URL del autor con un ID aleatorio como UUID. De esta manera, la URL del autor no revelará el nombre de usuario del autor y será más segura.

Veremos dos enfoques: la manera difícil, donde escribimos el código nosotros mismos, y la manera fácil, donde usamos un plugin.
La Manera Difícil
Inténtalo primero en un entorno de prueba.
Para empezar, crea un nuevo archivo PHP, por ejemplo uuid-slug.php
, dentro del directorio /wp-content/plugins/
o /wp-content/mu-plugins/
, para cargarlo como un plugin de uso obligatorio. Este archivo contendrá los encabezados del plugin…
/**
* Archivo de arranque del plugin.
*
* Este archivo es leído por WordPress para mostrar la información del plugin en el área de administración.
*
* @wordpress-plugin
* Plugin Name: Slug de Autor UUID
* Plugin URI: https://github.com/esgeeks/wp-author-uuid-slug
* Description: Usa UUID para la URL del autor.
* Version: 1.0.0
* Requires at least: 6.0
* Requires PHP: 7.4
* Author: Esgeeks
* Author URI: https://github.com/esgeeks
*/
…y la lógica necesaria para implementar URLs de autor basadas en UUID. En este caso, proporcionaremos una entrada simple en el editor de perfil de usuario para agregar el UUID.
add_action('show_user_profile', 'add_uuid_field_to_profile');
add_action('edit_user_profile', 'add_uuid_field_to_profile');
function add_uuid_field_to_profile($user)
{
$uuid = get_user_meta($user->ID, '_uuid', true);
?>
<table class="form-table">
<tr>
<th><label for="user_uuid"><?php esc_html_e('UUID', 'esgeeks'); ?></label></th>
<td>
<input
type="text"
name="user_uuid"
id="user_uuid"
value="<?php echo esc_attr($uuid); ?>"
class="regular-text"
<?php echo !current_user_can('manage_options') ? 'readonly' : ''; ?>
/>
<p class="description">
<?php
if (current_user_can('manage_options')) {
esc_html_e('Introduce o actualiza el UUID para este usuario.', 'esgeeks');
} else {
esc_html_e('Este UUID es de solo lectura para los usuarios que no son administradores.', 'esgeeks');
}
?>
</p>
</td>
</tr>
</table>
<?php
}
add_action('personal_options_update', 'save_uuid_field');
add_action('edit_user_profile_update', 'save_uuid_field');
function save_uuid_field($user_id)
{
if (!current_user_can('manage_options', $user_id)) {
return false;
}
$new_uuid = isset($_POST['user_uuid']) ? sanitize_text_field($_POST['user_uuid']) : '';
if (!empty($new_uuid) && is_uuid($new_uuid)) {
update_user_meta($user_id, '_uuid', $new_uuid);
} else {
delete_user_meta($user_id, '_uuid');
}
}
function is_uuid($value)
{
$pattern = '/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i'; // Patrón UUID.
return (bool) preg_match($pattern, $value);
}
Por razones de seguridad, esta entrada solo estará activa y editable para los usuarios con el permiso manage_options
, por lo que solo los administradores podrán agregar o actualizar el UUID para los usuarios. Los usuarios sin los permisos adecuados verán la entrada como de solo lectura.
Cambiar la URL del Autor
A continuación, necesitamos modificar la URL del autor para usar el UUID en lugar del nombre de usuario del autor. Esto se puede lograr implementando el filtro author_link
, como se muestra a continuación:
add_filter('author_link', 'change_author_url', 10, 3);
function change_author_url($link, $author_id, $author_nicename)
{
$uuid = get_user_meta($author_id, '_uuid', true);
if (is_string($uuid)) {
return str_replace('/' . $authorSlug, '/' . $uuid, $link);
}
return $link;
}
Esta implementación actualizará la URL generada para el autor, afectando tanto al tema del front-end como a la interfaz de administración.
Manejo de Consultas para Archivos de Autor
Como hemos modificado la estructura de URL para las URL de archivo de autor, también necesitamos manejar las consultas correspondientes. Sin esto, WordPress devolvería un error 404 No Encontrado porque no reconocería cómo consultar autores por sus metadatos _uuid
.
Para implementar esta funcionalidad, podemos utilizar el gancho pre_get_posts
como se muestra a continuación:
add_action('pre_get_posts', 'author_uuid_query');
function author_uuid_query($query) {
/**
* Si la estructura de enlaces permanentes está configurada como simple, el autor debe ser consultado
* por la ID del usuario.
*/
if ((bool) get_option('permalink_structure') === false) {
return;
}
$author_name = $query->query_vars['author_name'] ?? '';
if (! is_string($author_name) || ! is_uuid($author_name)) {
$query->is_404 = true;
$query->is_author = false;
$query->is_archive = false;
return;
}
$users = get_users([
'meta_key' => '_uuid',
'meta_value' => $author_name,
]);
if (count($users) <= 0) {
$query->is_404 = true;
$query->is_author = false;
$query->is_archive = false;
return;
}
$user = $users[0];
if (! $user instanceof WP_User) {
$query->is_404 = true;
$query->is_author = false;
$query->is_archive = false;
return;
}
$query->set('author_name', $user->user_nicename);
}
El código anterior verifica si la estructura de enlaces permanentes está configurada en algo que no sea la configuración predeterminada “Simple”. Excluimos el manejo de consultas para la estructura de enlaces permanentes “Simple” porque WordPress usa la ID del autor (?author=) en lugar del author_name
en este caso.
Cambiar el Slug del Autor en la API REST
El nombre de usuario del usuario también se expone en el punto final de la API REST /wp-json/wp/v2/users
. Para mejorar la seguridad, lo modificaremos reemplazando el nombre de usuario con el UUID. Esto se puede lograr implementando el gancho rest_prepare_user
como se muestra a continuación:
add_filter('rest_prepare_user', 'change_user_slug_in_rest_api', 10, 2);
function change_user_slug_in_rest_api($response, $user)
{
$data = $response->get_data();
if (is_array($data)) {
$uuid = get_user_meta($author_id, '_uuid', true);
if (is_string($uuid)) {
$data['slug'] = $uuid;
}
}
$response->set_data($data);
return $response;
}
Con esta implementación, la URL del autor ahora utilizará el UUID en lugar del nombre de usuario. Cualquier intento de acceder a la URL del autor utilizando el nombre de usuario original dará como resultado un error 404 no encontrado.
Si bien esta solución funciona eficazmente para sitios más pequeños o aquellos con usuarios limitados, puede volverse engorroso de administrar cuando se trata de una gran cantidad de usuarios. En tales casos, implementar UUID manualmente para cada usuario sería lento e impráctico.
Por lo tanto, exploremos un enfoque alternativo que ofrece una solución más simplificada.
La Manera Fácil
Para una solución más simple, utilizaremos un plugin llamado Feature Flipper. Este plugin proporciona varias funciones de seguridad, incluida la capacidad de ofuscar nombres de usuario usando UUID.
Puedes instalar el plugin directamente desde la sección Plugins en tu panel de WordPress. Después de la instalación y activación, navega a Ajustes > Features > Security y habilita la opción Obfuscate usernames with random identifier
.

Una vez que hayas guardado la configuración, el plugin generará automáticamente UUID para todos los usuarios existentes en tu sitio. Además, asignará UUID a cualquier usuario nuevo al registrarse.
Conclusión
Implementar UUID para las URL de autor es una medida de seguridad eficaz que ayuda a proteger tu sitio WordPress ocultando los nombres de usuario de los autores. Este enfoque reduce significativamente el riesgo de ataques de fuerza bruta e intentos de acceso no autorizados.