ทำให้ชื่อที่แสดงไม่ซ้ำกัน


13

ตอนนี้คุณสามารถสร้างชื่อที่แสดงในสิ่งที่คุณต้องการคุณสามารถปลอมตัวเป็นผู้ดูแลระบบได้ เป็นไปได้ไหมที่จะทำให้ชื่อที่แสดงนั้นไม่ซ้ำ

คำตอบ:


7

เท่าที่ฉันทราบทุกสิ่งที่คุณทำได้คือกรองชื่อที่แสดงผ่านpre_user_display_nameและตรวจสอบว่ามีอยู่แล้ว แต่น่าเสียดายที่WP_User_Queryไม่สนับสนุนการสอบถามโดยdisplay_nameเพื่อให้เรายังมีการเพิ่มข้อผ่านWHERE pre_user_queryนอกจากนี้ยังไม่มีวิธีที่สวยงามที่ฉันสามารถจัดการกับกรณีที่display_nameมีอยู่แล้วกลับไม่มีอะไรเลยเนื่องจากเราไม่ทราบผ่านตัวกรองสิ่งที่ผู้ใช้นี้ชื่อที่แสดงที่เป็นไปได้ที่แนบมานี้ หรือบางทีฉันแค่เหนื่อยและขาดอะไรบางอย่างที่ชัดเจน! อย่างไรก็ตามนี่คือการทดสอบอย่างรวดเร็วที่ฉันสร้างขึ้น:

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

สวัสดี Milo ขอขอบคุณสำหรับการแก้ปัญหานี้ แต่มันก็ไร้ประโยชน์ถ้าเพียงแค่ยกเลิกการแสดงผล display_name มีแนวคิดใดบ้างในวันที่สดใสและใหม่?
FLX

ฉันจะไม่พูดว่ามันไร้ประโยชน์อย่างสมบูรณ์ ในส่วนหน้าคุณสามารถตั้งค่าเริ่มต้นให้ลงชื่อเข้าใช้หากชื่อที่แสดงว่างเปล่าบนส่วนหลังคุณสามารถเพิ่มจาวาสคริปต์ผ่านทาง admin_footer เพื่อแจ้งเตือนว่าพวกเขาจะต้องเลือกชื่อที่แสดงที่ไม่ซ้ำกัน
Milo

0

มันค่อนข้างสกปรก แต่ทำงานได้เพียงวางไว้ในฟังก์ชั่นธีมของคุณ php ในเว็บไซต์เดียวหรือในไฟล์ functions.php ภายในโฟลเดอร์ mu-plugins ของคุณในเว็บไซต์หลายไซต์

สคริปต์จะสแกนผู้ใช้ที่มีอยู่ (หากเว็บไซต์ของคุณมีอยู่แล้วจำนวนมาก) และชื่อที่แสดงที่ไม่ซ้ำกันใด ๆ จะได้รับการอัปเดตและแทนที่ด้วยชื่อผู้ใช้

ฉันรู้ว่าสิ่งนี้ไม่เหมาะอย่างยิ่ง แต่ข้อเสนอแนะใด ๆ สำหรับการจัดการกับผู้ใช้ที่มีอยู่หรือการปรับปรุงยินดีต้อนรับเสมอ

 
    // 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

ลองสิ่งนี้:

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

ลิงก์: http://bappi-d-great.com/unique-display-name-and-nickname-in-wordpress/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.