Saya melihat dua cara untuk mengatasi masalah ini: mengubah data yang membentuk URL penulis, atau mengubah URL penulis. Anda mungkin harus menangani pengalihan juga, jadi URL lama ke arsip pengguna tetap berfungsi saat pengguna mengubah nama panggilan mereka.
Mengubah URL penulis
Ada dua bagian untuk pertanyaan ini: menangani tautan masuk dengan nama panggilan penulis, bukan penulis slug, dan menghasilkan url posting penulis dengan nama panggilan bukan standar slug.
Bagian pertama diselesaikan dengan menghubungkan ke request
filter, memeriksa apakah itu permintaan penulis, dan mencari penulis dengan nama panggilan alih-alih siput. Jika kami menemukan penulis, kami mengubah parameter kueri untuk menggunakan ID penulis.
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;
}
Bagian kedua dilakukan dengan menghubungkan ke author_link
filter dan mengganti bagian penulis standar (ditunjukkan oleh $author_nicename
) dengan nama panggilan.
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;
}
Mengubah data yang membentuk URL penulis
Cara yang mungkin lebih mudah adalah dengan memperbarui bidang yang tidak digunakan user_nicename
dalam database. Saya pikir itu dihasilkan dari login pengguna dan tidak pernah berubah setelah itu. Tapi saya bukan ahli dalam manajemen pengguna, jadi gunakan dengan risiko Anda sendiri.
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 );
}
}