Это немного сложно, потому что sanitize_user
допускает пробелы в именах пользователей, а это означает, что трудно избежать захвата всей фразы «@johndoe сказал, что ...», а не просто фактического имени пользователя «@johndoe», и в конце у вас нет разделителя, который бы Помогите. Чтобы избежать этого, я наложил требование заменить пробелы в имени пользователя на «+».
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 );
Я не ожидал бы, что это решение будет очень надежным, не без особой настройки регулярного выражения. И я думаю, что вам будет лучше с коротким кодом , но вы идете.
Примечание: мне пришло в голову, что этот сайт имеет похожую функциональность, похожую на упоминание. При написании комментария вы можете уведомить других пользователей, написав "@username", но здесь имена пользователей могут содержать пробелы, как в WordPress. Проблема «пробелов» здесь была решена путем требования, чтобы пробелы просто удалялись , а не заменялись знаками «+». Это может быть еще один способ решения проблемы.