Cambie la babosa de autor de nombre de usuario a apodo

13

Hola a la comunidad, ¿
es posible cambiar el nombre de usuario predeterminado slug a nickname si está disponible?

Por defecto, la url es algo así como: http: //domain.tld/author/ (admin ), ¿
es posible reescribir y cambiar a http: //domain.tld/author/ (nickname ) así que si un usuario cambia su nickname desde la página de perfil, ¿la bala cambiará también al nuevo nombre dado por el usuario?

¡muchas gracias!
Philip

Philip
fuente
No creo que pueda hacerlo de manera realista, no hay query_var que encuentre publicaciones basadas en el apodo de un usuario, por lo tanto, no hay una variable apropiada para asignar el apodo en una regla de reescritura. Tendría que agregar su propio manejo de var de consulta para tratar consultas de apodo junto con cualquier código de reescritura (es posible en teoría, pero no creo que sea elegante en la práctica).
t31os

Respuestas:

16

Veo dos formas de resolver este problema: cambiando los datos que forman la URL del autor, o cambiando la URL del autor. Probablemente también debería manejar las redirecciones, por lo que las URL antiguas de los archivos de los usuarios siguen funcionando cuando un usuario cambia su apodo.

Cambiar la URL del autor

Hay dos partes en esta pregunta: manejar los enlaces entrantes con el apodo del autor en lugar de la ficha del autor, y generar URL de publicación del autor con el apodo en lugar de la ficha estándar.

La primera parte se resuelve enganchándose al requestfiltro, verificando si se trata de una solicitud de autor y buscando al autor por su apodo en lugar de babosa. Si encontramos un autor, cambiamos los parámetros de consulta para usar la 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 realiza enganchando el author_linkfiltro 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;
}

Cambiar los datos que forman la URL del autor

Una forma quizás más fácil sería actualizar el user_nicenamecampo que de otro modo no se usaría en la base de datos. Creo que se genera a partir del inicio de sesión del usuario y nunca cambió después de eso. Pero no soy un experto en gestión de usuarios, así que úselo bajo su 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 );
    }
}
Jan Fabry
fuente
Buena solución Todavía no lo he comprobado, pero creo que su enfoque es realmente bueno.
Anh Tran
¿Qué pasa con el autor duplicado nicenames? ¿Tenemos que preocuparnos por eso o WP se encarga de eso?
Drew Baker,
Como dijo @DrewBaker, podría haber un problema con las URL duplicadas si dos perfiles de usuario tienen nombres similares. Digamos que si un usuario 1 editó su nombre de usuario como John y hay otro usuario con un nombre similar, ambos perfiles de usuario tienen una URL de autor único como site.com/author/john. ¿Me puede decir si hay una solución para esto?
Netizen
Además, si hay un espacio entre el nombre, la URL no funcionará. Sucede con los nombres de usuario aleatorios creados con este código. Cuando probé el código de mi lado, genera nombres de usuario aleatorios como Nuevo usuario 654937 y la URL del autor se parece a site.com/author/Newuser654937/. Esa URL no funcionará hasta que cambiemos nuevamente el nombre del perfil y eliminemos los espacios. ¿Puede sugerir una solución?
Netizen
@IamSJ: No hay prevención automática contra nombres duplicados o caracteres no válidos. Tendrá que proporcionar esto usted mismo. Probablemente lo más fácil si lo haces por la segunda vía, cambiando el "nombre de pila".
Jan Fabry
-3

una manera fácil es el plugin Author Slug

También puedes usar 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;
}
bueltge
fuente
3
Desafortunadamente, no es la base de autores lo que el usuario está buscando cambiar.
t31os