Bu sorunu çözmek için iki yol görüyorum: yazar URL'sini oluşturan verileri değiştirme veya yazar URL'sini değiştirme. Muhtemelen yönlendirmeleri de ele almalısınız, bu nedenle kullanıcı takma adlarındaki eski URL'ler bir kullanıcı takma adını değiştirdiğinde çalışmaya devam eder.
Yazar URL'sini değiştirme
Bu sorunun iki bölümü vardır: gelen bağlantıları yazar slug yerine yazar takma adıyla ele alın ve standart slug yerine takma adla yazar posta URL'leri oluşturun.
İlk bölüm, request
filtreye bağlanmak, yazarın isteği olup olmadığını kontrol etmek ve yazara slug yerine takma adla bakmak suretiyle çözülür . Bir yazar bulursak, yazar kimliğini kullanmak için sorgu parametrelerini değiştiririz.
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;
}
İkinci bölüm author_link
filtreye asılarak ve standart yazar kısmının (ile belirtilir $author_nicename
) takma adla değiştirilmesiyle yapılır.
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;
}
Yazar URL'sini oluşturan verileri değiştirme
user_nicename
Veritabanındaki aksi takdirde kullanılmayan alanı güncellemenin daha kolay bir yolu olabilir . Kullanıcı girişinden oluşturulduğunu ve bundan sonra hiç değişmediğini düşünüyorum. Ama ben kullanıcı yönetimi konusunda uzman değilim, bu yüzden kendi sorumluluğunuzdadır.
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 );
}
}