Cambiar el Slug del Autor de Nombre de Usuario a Apodo

21 dic 2010, 22:14:56
Vistas: 27.6K
Votos: 16

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

1
Comentarios

No creo que sea realista hacerlo, no hay un query_var que pueda encontrar publicaciones basadas en el apodo de un usuario, por lo tanto no hay una variable apropiada para mapear el apodo en una regla de reescritura. Tendrías que agregar tu propio manejo de query_var para manejar consultas de apodos junto con cualquier código de reescritura (es posible en teoría, pero no creo que sea elegante en la práctica).

t31os t31os
22 dic 2010 11:27:17
Todas las respuestas a la pregunta 3
6
18

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 );
    }
}
7 ene 2011 15:58:40
Comentarios

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

Anh Tran Anh Tran
7 ene 2011 17:34:36

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

Drew Baker Drew Baker
23 may 2013 21:38:20

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?

Netizen Netizen
28 dic 2013 10:14:30

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?

Netizen Netizen
28 dic 2013 10:17:40

@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".

Jan Fabry Jan Fabry
29 dic 2013 13:43:00

Puedo hacer que los slugs cambien, pero todo da error 404 incluso después de actualizar los enlaces permanentes. ¿Alguien ha resuelto este problema?

EHerman EHerman
17 ene 2015 23:21:31
Mostrar los 1 comentarios restantes
0

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

20 nov 2011 19:07:41
1
-3

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;
}
22 dic 2010 02:08:14
Comentarios

Desafortunadamente, no es la base de autor lo que el usuario busca cambiar.

t31os t31os
22 dic 2010 11:24:00