Esto es un poco complicado porque sanitize_user
permite espacios en los nombres de usuario, lo que significa que es difícil evitar agarrar la frase completa '@johndoe dijo que ...' en lugar de solo el nombre de usuario real '@johndoe' y no tiene un separador al final que ayuda. Para evitar eso, impuse el requisito de que los espacios en el nombre de usuario se reemplacen con '+'.
function look_for_author($login) {
if (!empty($login[1])) {
$lname = str_replace('+',' ',$login[1]);
$user = get_user_by('login',$lname);
if (!empty($user)) return ' <a href="'.get_author_posts_url($user->ID).'">'.$lname.'</a> ';
}
return ' '.$login[0].' ';
}
function hyperlink_authors( $content ){
$content = preg_replace_callback(
'/[\s>]+@([A-Za-z0-9_.\-*@\+]+)[^A-Za-z0-9_.\-*@\+]/',
'look_for_author',
$content
);
return $content;
}
add_filter( 'the_content', 'hyperlink_authors', 1 );
No esperaría que esta solución sea muy robusta, no sin muchos ajustes de la expresión regular. Y creo que sería mejor con un shortcode , pero ahí lo tienes.
Nota: Se me ocurrió que este sitio tiene una funcionalidad similar a la mención. Al escribir un comentario, puede notificar a otros usuarios escribiendo "@username", pero los nombres de usuario aquí pueden tener espacios como con WordPress. El problema de "espacios" aquí se resolvió requiriendo que los espacios se eliminen , en lugar de sustituirlos con signos "+". Esa podría ser otra forma de resolver el problema.