Tạo tên hiển thị duy nhất


13

Ngay bây giờ bạn có thể đặt Tên hiển thị của mình bất cứ điều gì bạn muốn, thậm chí bạn có thể mạo danh một quản trị viên. Có thể làm cho Tên hiển thị là duy nhất?

Câu trả lời:


7

Theo như tôi biết, tất cả những gì bạn có thể làm là lọc tên hiển thị thông qua pre_user_display_namevà kiểm tra xem nó đã tồn tại chưa. Thật không may WP_User_Query, không hỗ trợ truy vấn bởi display_name, vì vậy chúng tôi cũng phải thêm vào WHEREmệnh đề thông qua pre_user_query. Ngoài ra, không có cách nào thanh lịch mà tôi có thể nghĩ ra để xử lý trường hợp display_nameđã tồn tại ngoài việc không trả lại gì, vì chúng tôi không biết qua bộ lọc mà tên người dùng hiển thị tiềm năng này được đính kèm. hoặc có lẽ tôi chỉ mệt mỏi và thiếu một cái gì đó rõ ràng! Dù sao, đây là một bài kiểm tra nhanh tôi đã tạo:

class wpa82239_display_name {
    private $display_name;

    public function __construct(){
        add_filter( 'pre_user_display_name', array( $this, 'display_name_filter' ) );
    }

    public function display_name_filter( $display_name ){

        $this->display_name = $display_name;
        add_action( 'pre_user_query', array( $this, 'user_query_filter' ) );
        $args = array(
            'number' => 1,
            'fields' => 'ID'
        );
        $user_search = new WP_User_Query( $args );
        remove_action( 'pre_user_query', array( $this, 'user_query_filter' ) );

        if( 0 == $user_search->total_users )
            return $display_name;

        return null;
    }

    public function user_query_filter( $query ){
        global $wpdb;
        $query->query_where .= $wpdb->prepare(
            " AND $wpdb->users.display_name = %s",
            $this->display_name
        );
    }

}
$wpa82239_display_name = new wpa82239_display_name();

Xin chào Milo, cảm ơn vì giải pháp này nhưng thật vô ích nếu nó đơn giản bỏ cài đặt display_name. Có ý tưởng nào trong ngày mới và mới này không?
FLX

Tôi sẽ không nói nó hoàn toàn vô dụng. ở mặt trước, bạn có thể mặc định đăng nhập nếu tên hiển thị trống, ở mặt sau, bạn có thể thêm một chút javascript thông qua admin_footer để đưa ra cảnh báo rằng họ phải chọn một tên hiển thị duy nhất.
Milo

0

Nó khá bẩn, nhưng thực hiện công việc, chỉ cần đặt nó trong các chức năng chủ đề của bạn trên một trang web hoặc trong một tệp tin.php trong thư mục mu-plugins của bạn trên nhiều trang.

Tập lệnh cũng sẽ quét người dùng hiện tại (nếu trang web của bạn đã có nhiều) và bất kỳ tên hiển thị không duy nhất nào cũng sẽ được cập nhật và thay thế bằng tên người dùng.

Tôi biết điều này không hoàn toàn lý tưởng, nhưng mọi đề xuất để đối phó với người dùng hiện tại hoặc các cải tiến luôn được hoan nghênh.

 
    // Make nickname & display_name unique
    // and automatically change non unique nicks & display name to username
    // in case you already have existing users
    // by Ashok & Vaughan Montgomery
    /*
     * adding action when user profile is updated
     */
    add_action('personal_options_update', 'check_display_name');
    add_action('edit_user_profile_update', 'check_display_name');
    function check_display_name($user_id) {
            global $wpdb;
        // Getting user data and user meta data
            $err['display'] = $wpdb->get_var($wpdb->prepare("SELECT COUNT(ID) FROM $wpdb->users WHERE display_name = %s AND ID <> %d", $_POST['display_name'], $_POST['user_id']));
        $err['nick'] = $wpdb->get_var($wpdb->prepare("SELECT COUNT(ID) FROM $wpdb->users as users, $wpdb->usermeta as meta WHERE users.ID = meta.user_id AND meta.meta_key = 'nickname' AND meta.meta_value = %s AND users.ID <> %d", $_POST['nickname'], $_POST['user_id']));
        foreach($err as $key => $e) {
            // If display name or nickname already exists
            if($e >= 1) {
                $err[$key] = $_POST['username'];
                // Adding filter to corresponding error
                add_filter('user_profile_update_errors', "check_{$key}_field", 10, 3);
            }
        }
    }
    /*
     * Filter function for display name error
     */
    function check_display_field($errors, $update, $user) {
            $errors->add('display_name_error',('Sorry, Display Name is already in use. It needs to be unique.'));
            return false;
    }
    /*
     * Filter function for nickname error
     */
    function check_nick_field($errors, $update, $user) {
            $errors->add('display_nick_error',('Sorry, Nickname is already in use. It needs to be unique.'));
            return false;
    }
    /*
     * Check for duplicate display name and nickname and replace with username
     */
    function display_name_and_nickname_duplicate_check() {
        global $wpdb;
        $query = $wpdb->get_results("SELECT * FROM $wpdb->users");
        $query2 = $wpdb->get_results("SELECT * FROM $wpdb->users as users, $wpdb->usermeta as meta WHERE users.ID = meta.user_id AND meta.meta_key = 'nickname'");
        $c = count($query);
        for($i = 0; $i < $c; $i++) {
            for($j = $i+1; $j < $c; $j++) {
                if($query[$i]->display_name == $query[$j]->display_name){
                    wp_update_user(
                            array(
                                  'ID' => $query[$i]->ID,
                                  'display_name' => $query[$i]->user_login
                            )
                        );
                }
                if($query2[$i]->meta_value == $query2[$j]->meta_value){
                    update_user_meta($query2[$i]->ID, 'nickname', $query2[$i]->user_login, $prev_value);
                }
            }
        }
    }
    // Call the function
    display_name_and_nickname_duplicate_check();

/*
 * Calling the display_name_and_nickname_duplicate_check() again when a new user is registered
 */
add_action( 'user_register', 'check_nickname', 10, 1 );
function check_nickname() {
    display_name_and_nickname_duplicate_check();
}


0

Thử đi:

add_action('personal_options_update', 'check_display_name');
add_action('edit_user_profile_update', 'check_display_name');
function check_display_name($user_id) {
global $wpdb;
// Getting user data and user meta data
$err['display'] = $wpdb->get_var($wpdb->prepare("SELECT COUNT(ID) FROM $wpdb->users WHERE display_name = %s AND ID <> %d", $_POST['display_name'], $_POST['user_id']));
$err['nick'] = $wpdb->get_var($wpdb->prepare("SELECT COUNT(ID) FROM $wpdb->users as users, $wpdb->usermeta as meta WHERE users.ID = meta.user_id AND meta.meta_key = 'nickname' AND meta.meta_value = %s AND users.ID <> %d", $_POST['nickname'], $_POST['user_id']));
foreach($err as $key => $e) {
// If display name or nickname already exists
if($e >= 1) {
$err[$key] = $_POST['username'];
// Adding filter to corresponding error
add_filter('user_profile_update_errors', "check_{$key}_field", 10, 3);
}
}
}
/*
* Filter function for display name error
*/
function check_display_field($errors, $update, $user) {
$errors->add('display_name_error',__('Sorry, Display Name is already in use. It needs to be unique.'));
return false;
}
/*
* Filter function for nickname error
*/
function check_nick_field($errors, $update, $user) {
$errors->add('display_nick_error',__('Sorry, Nickname is already in use. It needs to be unique.'));
return false;
}
/*
* Check for duplicate display name and nickname and replace with username
*/
function display_name_and_nickname_duplicate_check() {
global $wpdb;
$query = $wpdb->get_results("select * from $wpdb->users");
$query2 = $wpdb->get_results("SELECT * FROM $wpdb->users as users, $wpdb->usermeta as meta WHERE users.ID = meta.user_id AND meta.meta_key = 'nickname'");
$c = count($query);
for($i = 0; $i < $c; $i++) {
for($j = $i+1; $j < $c; $j++) {
if($query[$i]->display_name == $query[$j]->display_name){
wp_update_user(
array(
'ID' => $query[$i]->ID,
'display_name' => $query[$i]->user_login
)
);
}
if($query2[$i]->meta_value == $query2[$j]->meta_value){
update_user_meta($query2[$i]->ID, 'nickname', $query2[$i]->user_login, $prev_value);
}
}
}
}
// Call the function
display_name_and_nickname_duplicate_check();

/*
* Calling the display_name_and_nickname_duplicate_check() again when a new user is registered
*/
add_action( 'user_register', 'check_nickname', 10, 1 );
function check_nickname() {
display_name_and_nickname_duplicate_check();
}

Liên kết: http://bappi-d-great.com/unique-display-name-and-nickname-in-wordpress/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.