• Решено moonkir

    (@moonkir)


    По каким колонкам BD выполняется поиск пользователей, через админку WP, в wp_users таблице.

    Объясню в чем проблема:
    При поиске пользователя в адмике WP по:
    user_login — находит
    user_nicename — не находит
    user_displayname — не находит

    в таблице BD wp_users:
    user_login — my_login
    user_nicename — пусто
    user_displayname — Имя фамилия

    Если руками заполнить в таблице BD wp_users:
    user_nicename — Имя фамилия
    То будет искать то найдет Имя или Фамилию

    Сделал вывод что по столбцу user_displayname не ищет.

    Проблема в том что у меня что то перезатирает user_nicename
    Не могу найти что.
    Хотел переделать поиск на другие поля или может подскажите варианты.

Просмотр 15 ответов — с 1 по 15 (всего 15)
  • Докопался до такого
    Протестировали все версии от 3.9 до 4.1.1

    Эта проблема появляется в 4.1 (как раз добавили интеграцию языков в дистрибутив)
    При добавлении пользователя средствами WP (добавить вручную или при регистрации)

    Добавляем пользователя:
    i.ivanov
    Иван
    Иванов
    ivanov@ivan.ov

    В БД wp_users

    ДО 4.1
    user_nicename — Иван Иванов

    ПОСЛЕ 4.1
    user_nicename — i-ivanov

    После 4.1 по фамилии Иванов функция поиска не отрабатывает — так как ищется по полю user_nicename — а оно уже на латинице.

    Вопрос — как искать теперь по имени или фамилии

    Как-то так:

    function fufufu( $search_columns ) {
        //по щучьему веленью, по моему хотенью, хочу искать во всех полях! :DD
        $search_columns = array( 'ID', 'user_login', 'user_email', 'user_url', 'user_nicename', 'display_name' );
        return $search_columns;
    }
    add_filter( 'user_search_columns', 'fufufu' );

    Где-нибудь внизу functions.php активной темы оформления добавьте или плагин свой соорудите. Если через тему, то лучше дочернюю делайте http://codex.wordpress.org/Дочерние_темы

    Окей, это безусловно выход с моей проблемы,спасибо, но что никого не волнует что с 4.1 не работает корректно поиск пользователей стандартными средствами?

    Пардон он работает — но не так как раньше.

    Я оставлю реплику на уровне логических размышлений. Если в поле user_nicename использовали «санитара» для трансляции в латиницу, то это, скорее всего, по соображениям безопасности. Иных, приятных разуму, оснований я не вижу.

    никого не волнует что с 4.1 не работает корректно поиск

    Видимо, редко кто использует блог для всех кто «умеет печатать» (monkey typing). Обычно блог состоит из одного, двух, авторов. Кого там искать-то? :DD

    офтоп
    Если вам это очень интересно, то смотрите исходный код. А может действительно это серьёзный баг и разработчики упустили его из виду? Напишите тикет и будете ждать как я. Уже два месяца https://core.trac.wordpress.org/ticket/30883 🙂 — причина моей регистрации здесь….
    Больно оно нужно было 😛
    Хотя, наверное, с десяток блогеров благодарны мне за подсказки.. А что, подсказка в пару строчек кода меня не отяготит… 2мес это 60дней/10блогеров — это 6 дней на блогера. Я крут! И чай с лимоном у меня всегда свежий! 😛

    У меня к примеру на WP корпоративный портал, 300 пользователей. К пользователям привязаны роли\группы.
    То найти кому фоточки добавить, роль сменить, информации по должности обновить.
    В общем поиск мне нужен был.

    Я не гуру в этих делах — но в чем проблема хватило думалки разобраться.

    TempAcc — спасибо Вам за подсказку.
    Тикет таки напишу…

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    user_login — my_login
    user_nicename — пусто
    user_displayname — Имя фамилия

    Если руками заполнить в таблице BD wp_users:
    user_nicename — Имя фамилия
    То будет искать то найдет Имя или Фамилию

    ДО 4.1
    user_nicename — Иван Иванов

    ПОСЛЕ 4.1
    user_nicename — i-ivanov

    Поле user_nicename используется в URL архивов автора. Оно получается из поля user_login путём применения функции sanitize_title() и содержит только символы, допустимые в URL. Заполнять его вручную не нужно.

    Так было и до 4.1, и после.

    Если у вас это поле пустое или в нём содержатся символы кириллицы — скорее всего, используется какой-то плагин для изменения процедуры регистрации.

    Единственное изменение в 4.1, которое могло повлиять на данную ситуацию, — [29819].

    Ранее, если при создании пользователя плагином в функцию wp_insert_user() передавался параметр user_nicename, он использовался как есть, и это могло привести к неработоспособным ссылкам.

    Сейчас из него удаляются символы, недопустимые в URL, как и при автоматическом заполнении поля.

    Так было и до 4.1, и после.

    В ручную я заполнил для теста.
    Я сегодня переставил все версии от 3.8 до 4.1.1
    Каждый раз ставился голый WP. На чистую базу. Без плагинов.
    Создавался пользователь через админку WP
    Транслитироваться user_nicename начал с 4.1.
    До 4.1 поле заполнялось кириллицей самим WP

    И искался пользователь по имени\фамилии.

    С 4.1 не ищется из за этого злополучного поля.

    Модератор Yuri

    (@yube)

    Добавляем пользователя:
    i.ivanov
    Иван
    Иванов
    ivanov@ivan.ov

    В БД wp_users

    ДО 4.1
    user_nicename — Иван Иванов

    Только что проверил на WP 3.5.2
    user_nicename — i-ivanov
    И нифига «Иван» не ищется.
    Что я делаю не так?
    http://joxi.ru/p27g43wF5YE327

    Я не могу сказать про 3.5.2
    на 3.8 Иван Иванов — либо поверьте на слово — либо я могу вам анимацию\видео сделать 🙂

    Модератор Yuri

    (@yube)

    а 3.5 — не ДО 4.1? 🙂 ОК, сейчас сделаю на 3.8.

    Модератор Yuri

    (@yube)

    Как и ожидалось
    i.ivanov => i-ivanov
    Ибо неоткуда взяться другому.

    if ( empty($user_nicename) )
    		$user_nicename = sanitize_title( $user_login );

    Я не знаю что сказать, поставил 3.8 3.9
    получил тот же результат что у Вас. Что за хрень я не понимаю.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Транслитироваться user_nicename начал с 4.1.
    До 4.1 поле заполнялось кириллицей самим WP

    Нет, это не так. Поле формируется на основе user_login, а не display_name. Символы кириллицы в логине по умолчанию недопустимы, поэтому и в user_nicename им взяться неоткуда.

    Даже если поставить плагин Allow Cyrillic Usernames, в user_nicename всё равно попадает не кириллица, а закодированный вариант %d0%b8%d0%b2%d0%b0%d0%bd-%d0%b8%d0%b2%d0%b0%d0%bd%, допустимый в URL.

    Наиболее правильное решение проблемы поиска по отображаемому имени — добавить display_name в список полей для поиска с помощью фильтра user_search_columns, как подсказал TempAcc.

    По умолчанию display_name не входит в этот список, потому что у этого поля нет индекса, и при большом количестве пользователей поиск может быть медленным.

Просмотр 15 ответов — с 1 по 15 (всего 15)
  • Тема «wp_users поиск» закрыта для новых ответов.