Відповіді:
Наскільки мені відомо, все, що ви можете зробити, - це відфільтрувати відображуване ім'я через pre_user_display_name
та перевірити, чи воно вже існує. На жаль WP_User_Query
, не підтримує запит display_name
, тому ми також мусимо додати до WHERE
пункту via 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();
Це досить брудно, але виконайте роботу, просто розмістіть його у своїй темі function.php на одному веб-сайті або у файлі function.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();
}
Спробуйте це:
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/