Veo dos formas de resolver este problema: cambiar los datos que forman la URL del autor o cambiar la URL del autor. Es probable que también deba manejar las redirecciones, por lo que las URL antiguas a los archivos de usuarios siguen funcionando cuando un usuario cambia su apodo.
Cambiando la URL del autor
Hay dos partes en esta pregunta: maneje los enlaces entrantes con el apodo del autor en lugar de la bala del autor, y genere las direcciones URL de publicación del autor con el apodo en lugar de la bala estándar.
La primera parte se resuelve enganchándola al filtro request
, verificando si se trata de una solicitud de autor y buscando al autor por apodo en lugar de babosa. Si encontramos un autor, cambiamos los parámetros de consulta para usar el ID de 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 conectando el 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 tal vez más fácil sería actualizar el campo user_nicename
de lo contrario no utilizado en la base de datos. Creo que se genera desde el inicio de sesión del usuario y nunca se cambia después de eso. Pero no soy un experto en administració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 );
}
}