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 request
filtro, 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_link
filtro 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_nicename
campo 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 );
}
}