Tôi thấy có hai cách để giải quyết vấn đề này: thay đổi dữ liệu hình thành URL tác giả hoặc thay đổi URL tác giả. Có lẽ bạn cũng nên xử lý các chuyển hướng, vì vậy các URL cũ để lưu trữ người dùng tiếp tục hoạt động khi người dùng thay đổi tên hiệu của họ.
Thay đổi URL tác giả
Có hai phần cho câu hỏi này: xử lý các liên kết đến với biệt danh tác giả thay vì sên tác giả và tạo các url bài viết của tác giả với biệt danh thay vì sên tiêu chuẩn.
Phần đầu tiên được giải quyết bằng cách móc vào request
bộ lọc, kiểm tra xem đó có phải là yêu cầu của tác giả hay không và tìm kiếm tác giả bằng biệt danh thay vì sên. Nếu chúng tôi tìm thấy một tác giả, chúng tôi thay đổi các tham số truy vấn để sử dụng ID tác giả.
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;
}
Phần thứ hai được thực hiện bằng cách móc vào author_link
bộ lọc và thay thế phần tác giả tiêu chuẩn (được chỉ định bởi $author_nicename
) bằng tên hiệu.
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;
}
Thay đổi dữ liệu hình thành URL tác giả
Một cách có thể dễ dàng hơn là cập nhật trường không được sử dụng user_nicename
trong cơ sở dữ liệu. Tôi nghĩ rằng nó được tạo ra từ đăng nhập người dùng và không bao giờ thay đổi sau đó. Nhưng tôi không phải là một chuyên gia về quản lý người dùng, vì vậy hãy tự chịu rủi ro khi sử dụng nó.
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 );
}
}