Cambiar el Slug del Autor de Nombre de Usuario a Apodo
Hola a la comunidad,
¿es posible cambiar el slug por defecto del nombre de usuario al apodo si está disponible?
Por defecto la URL es algo como: http://dominio.tld/autor/(admin),
¿es posible reescribir y cambiar a http://dominio.tld/autor/(apodo) de modo que si un usuario cambia su apodo desde la página de perfil, el slug también cambiará al nuevo nombre dado por el usuario?
¡muchas gracias!
Philip

Veo dos formas de resolver este problema: cambiando los datos que forman la URL del autor, o cambiando la URL del autor. Probablemente deberías manejar redirecciones también, para que las URLs antiguas a los archivos de usuario sigan funcionando cuando un usuario cambie su apodo.
Cambiando la URL del autor
Hay dos partes en esta pregunta: manejar enlaces entrantes con el apodo del autor en lugar del slug del autor, y generar URLs de publicaciones de autor con el apodo en lugar del slug estándar.
La primera parte se resuelve enganchando al filtro request
, verificando si es una solicitud de autor, y buscando el autor por apodo en lugar de por slug. Si encontramos un autor, cambiamos los parámetros de la consulta para usar el ID del autor.
add_filter( 'request', 'wpse5742_request' );
function wpse5742_request( $query_vars )
{
if ( array_key_exists( 'author_name', $query_vars ) ) {
global $wpdb;
$author_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key='nickname' AND meta_value = %s", $query_vars['author_name'] ) );
if ( $author_id ) {
$query_vars['author'] = $author_id;
unset( $query_vars['author_name'] );
}
}
return $query_vars;
}
La segunda parte se hace enganchando al filtro author_link
y reemplazando la parte estándar del autor (indicada por $author_nicename
) con el apodo.
add_filter( 'author_link', 'wpse5742_author_link', 10, 3 );
function wpse5742_author_link( $link, $author_id, $author_nicename )
{
$author_nickname = get_user_meta( $author_id, 'nickname', true );
if ( $author_nickname ) {
$link = str_replace( $author_nicename, $author_nickname, $link );
}
return $link;
}
Cambiando los datos que forman la URL del autor
Una forma quizás más fácil sería actualizar el campo user_nicename
en la base de datos, que normalmente no se usa. Creo que se genera a partir del login del usuario y nunca se cambia después de eso. Pero no soy un experto en gestión de usuarios, así que úsalo bajo tu propio riesgo.
add_action( 'user_profile_update_errors', 'wpse5742_set_user_nicename_to_nickname', 10, 3 );
function wpse5742_set_user_nicename_to_nickname( &$errors, $update, &$user )
{
if ( ! empty( $user->nickname ) ) {
$user->user_nicename = sanitize_title( $user->nickname, $user->display_name );
}
}

Buena solución. Aún no lo he verificado, pero creo que tu enfoque es realmente bueno.

¿Qué pasa con los nicenames de autor duplicados? ¿Necesitamos preocuparnos por eso o WordPress se encarga de ello?

Como dijo @DrewBaker, podría haber un problema con URLs duplicadas si dos perfiles de usuario tienen nombres similares. Por ejemplo, si un usuario 1 editó su nombre de usuario como John y hay otro usuario con un nombre similar, ambos perfiles tendrían una única URL de autor como site.com/author/john.
¿Puedes decirme si hay una solución para esto?

Además, si hay un espacio entre el nombre, la URL no funcionará. Esto ocurre con los nombres de usuario aleatorios creados con este código. Cuando probé el código en mi entorno, genera nombres de usuario aleatorios como "Nuevo usuario 654937" y la URL del autor se ve como sitio.com/autor/Nuevousuario654937/. Esa URL no funcionará hasta que cambiemos nuevamente el nombre del perfil y eliminemos los espacios. ¿Puedes sugerir una solución para esto?

@IamSJ: No hay prevención automática contra nombres duplicados o caracteres no válidos. Tendrás que proporcionar esto tú mismo. Probablemente la forma más fácil sea hacerlo a través del segundo método, cambiando el "nicename".

Usa este plugin: http://wordpress.org/extend/plugins/display-name-author-permalink/
Aunque no está probado para la versión 3.2.1, yo lo he estado usando sin problemas.
Si recibes un error de encabezado al activar el plugin, encontrarás una solución aquí: http://wordpresscloaker.com/blog/how-to-fix-wordpress-plugin-does-not-have-a-valid-header-error.html

Una manera sencilla es el plugin Author Slug
También puedes usar un código pequeño:
add_action('init', 'set_new_author_base');
function set_new_author_base() {
global $wp_rewrite;
$author_slug = 'new_slug';
$wp_rewrite->author_base = $author_slug;
}
