WordPress Internal @ Sebutan


8

Saya sedang mencari cara untuk menautkan ke halaman penulis dalam satu instalasi WordPress hanya dengan meletakkan simbol @ di depan nama pengguna seseorang dalam sebuah pos .... sama seperti di twitter.

Contoh:

Jika nama pengguna adalah "Bill256" dan saya menulis "@ Bill256" itu akan ditautkan ke halaman penulisnya.

Jawaban:


13

Ini sedikit rumit karena sanitize_usermemungkinkan spasi dalam nama pengguna, yang berarti sulit untuk menghindari mengambil seluruh frasa '@johndoe mengatakan bahwa ...' sebagai lawan dari hanya nama pengguna yang sebenarnya '@johndoe' dan Anda tidak memiliki pemisah pada akhirnya yang akan Tolong. Untuk menghindari itu saya memberlakukan persyaratan bahwa spasi di nama pengguna diganti dengan '+'.

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 );

Saya tidak akan mengharapkan solusi ini menjadi sangat kuat, bukan tanpa banyak mengutak-atik regex. Dan saya pikir Anda akan lebih baik dengan kode pendek , tapi begitulah .

Catatan: Terlintas di benak saya bahwa situs ini memiliki fungsi mirip-suka yang serupa. Saat menulis komentar, Anda dapat memberi tahu pengguna lain dengan menulis "@namapengguna" tetapi nama pengguna di sini dapat memiliki spasi seperti dengan WordPress. Masalah "spasi" di sini diselesaikan dengan mengharuskan ruang hanya dihapus , alih-alih diganti dengan tanda "+". Itu bisa menjadi cara lain untuk menyelesaikan pendekatan masalah.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.