Как удалить эти поля из раздела 'Профиль'?

3 нояб. 2011 г., 12:36:53
Просмотры: 42.2K
Голосов: 22

Мне нужно удалить некоторые поля профиля со страницы 'Профиль' в зависимости от ролей пользователей. Для удаления выбора цветовой схемы я использовал remove_action("admin_color_scheme_picker", "admin_color_scheme_picker"). Я хочу удалить следующие поля:

  1. Никнейм
  2. Отображать публично как
  3. Поля AIM, Yahoo, Google talk и О себе
  4. Раздел 'Показывать панель администратора' вместе с 2 чекбоксами

Я просмотрел файл 'user-edit.php' в поисках действий/фильтров, которые позволили бы мне это сделать, но похоже, их нет. Может кто-нибудь подсказать, как это сделать? Буду благодарен за любую помощь. Спасибо

РЕДАКТИРОВАНО: Спасибо @helenhousandi за ответ. Хотя я уже сделал это таким способом.

<?php
add_action('admin_footer-profile.php', 'remove_profile_fields');
function remove_profile_fields()
{
    if(current_user_can('custom_role'))
    { ?>
        <script type="text/javascript">
            jQuery("h3:contains('Личные настройки')").next('.form-table').remove();
            jQuery("h3:contains('Личные настройки')").remove();
            jQuery("h3:contains('О себе')").next('.form-table').remove();
            jQuery("h3:contains('О себе')").remove();
        </script>
<?php }
}
?>

Я знаю, что это немного длиннее, но это работает! Думаю, я воспользуюсь ответом @helenhousandi.

5
Комментарии

Куда это нужно поместить? В functions.php?

Fabian Fabian
22 янв. 2016 г. 15:16:40

Да. Можно добавить в functions.php или файл плагина. Главное, чтобы хуки были правильно указаны — тогда код будет работать из любого места.

Rutwick Gangurde Rutwick Gangurde
22 янв. 2016 г. 18:46:12

Хорошо, но если я помещу это в functions.php, как мне вернуть javascript? С помощью return или echo?

Fabian Fabian
25 янв. 2016 г. 17:31:25

Похоже, что начиная с WordPress v4.4.1, поле "Никнейм" стало обязательным и выдает ОШИБКА: Пожалуйста, введите никнейм при обновлении пользователя, если это поле скрыто, но не заполнено, поэтому теперь его нельзя просто скрыть

icc97 icc97
7 апр. 2016 г. 01:08:38

Уже 2022 год, а разделы профиля всё ещё не обёрнуты в уникальный ID.. ну ладно.

mike23 mike23
16 авг. 2022 г. 13:52:41
Все ответы на вопрос 7
3
20

Для фильтра контактных методов: user_contactmethods:

function update_contact_methods( $contactmethods ) {

    unset( $contactmethods['aim'] );
    unset( $contactmethods['jabber'] );
    unset( $contactmethods['yim'] );

    return $contactmethods;

}
add_filter( 'user_contactmethods', 'update_contact_methods' );
3 нояб. 2011 г. 13:08:03
Комментарии

Спасибо... этот момент понял! Что насчет разделов "Показывать панель администратора" и "О себе"?

Rutwick Gangurde Rutwick Gangurde
3 нояб. 2011 г. 13:48:12

Пожалуйста, обновите этот ответ, если найдете решение... Я принимаю ваш ответ в любом случае. Спасибо!

Rutwick Gangurde Rutwick Gangurde
3 нояб. 2011 г. 16:35:05

+1, потому что, насколько я помню, удаление полей через PHP также предотвращает создание WordPress пустых записей в таблице usermeta.

Ashfame Ashfame
9 апр. 2012 г. 16:12:09
4
10

Хотя фильтр user_contactmethods является одним из немногих для экрана профиля пользователя, так как другие поля не обязательны в WordPress, вы можете использовать jQuery методы .hide() и .remove(), чтобы эффективно убрать те, которые вам не нужны, без сложностей с сохранением информации. Конечно, пользователи без JS всё равно увидят эти поля, но их меньшинство, и я предполагаю, что изменение этой информации ни на что не повлияет.

Пример удаления всего блока личных настроек (показ админ-бара и цветовой схемы). Я знаю, что это не совсем то, что вам нужно, просто хотел привести быстрый пример, который есть под рукой:

// удаление блока личных настроек
if( is_admin() ){
    remove_action( 'admin_color_scheme_picker', 'admin_color_scheme_picker' );
    add_action( 'personal_options', 'prefix_hide_personal_options' );
}

function prefix_hide_personal_options() {
  ?>
    <script type="text/javascript">
        jQuery( document ).ready(function( $ ){
            $( '#your-profile .form-table:first, #your-profile h3:first' ).remove();
        } );
    </script>
  <?php
}

Также заметка об опции "Показывать админ-бар": в версии 3.3 админ-бар становится частью шапки и, следовательно, его нельзя включить или выключить, так что, возможно, не стоит об этом беспокоиться.

Обновил пример кода, чтобы он был точнее и полнее. Были некоторые остаточные элементы.

3 нояб. 2011 г. 16:36:25
Комментарии

Спасибо! Это отличное решение! Я сделал что-то похожее, но использовал другой хук, чтобы мой скрипт работал только на profile.php. Мне также нужно было сделать это для определенной пользовательской роли в моей системе. Обновил вопрос с ответом.

Rutwick Gangurde Rutwick Gangurde
12 нояб. 2011 г. 13:10:15

Если добавить следующий код в jQuery, это также скроет поле "Никнейм" и "Отображаемое имя" из вопроса: $("#nickname,#display_name").parent().parent().remove();

icc97 icc97
1 февр. 2012 г. 10:16:46

Вы также можете использовать хук edit_user_profile. И не использовать метод jQuery( document ).ready для мгновенного выполнения кода. Вот так

Giraldi Giraldi
30 мая 2012 г. 10:24:46

Никнейм теперь обязателен, начиная с WP версии 4.4.1

icc97 icc97
7 апр. 2016 г. 01:09:42
0

Поскольку в PHP, похоже, нет подходящего хука для этого, я решил скрыть поля с помощью CSS, а затем удалить их с помощью JS.

add_action( 'admin_head', 'remove_default_profile_fields' );

function remove_default_profile_fields() {

    global $pagenow;

    if( 'profile.php' != $pagenow) return;

    remove_action( 'admin_color_scheme_picker', 'admin_color_scheme_picker' );

    // <tr> селекторы, каждый из которых содержит поле
    $tr = array(
        "tr.user-rich-editing-wrap",
        "tr.user-comment-shortcuts-wrap",
        "tr.user-first-name-wrap",
        "tr.user-last-name-wrap",
        "tr.user-admin-bar-front-wrap",
        "tr.user-profile-picture",
        "tr.user-user-login-wrap",
        "tr.user-display-name-wrap",
        "h2" // Лично я решил удалить все теги H2 тоже.
    );

    $selectors = implode(", ", $tr);

    // Скрываем поля с помощью CSS, чтобы они не отображались, даже если JavaScript отключен.
    echo "<style>{$selectors}{display:none;}</style>"; ?>

    <script type="text/javascript">
        jQuery( document ).ready(function( $ ){
           // Удаляем выбранные <tr>
           $( '<?= $selectors; ?>' ).remove();
           // Удаляем любую оставшуюся пустую таблицу
           $(".form-table:not(:has(tr))").remove();
        });
    </script>

  <?php
}
10 сент. 2017 г. 19:28:53
0

БУДЬТЕ ОСТОРОЖНЫ!!

1) Удаление поля может быть не лучшей идеей, так как при обновлении, если вы не отправите обязательные поля в хуке обновления WORDPRESS, он может установить пустые значения для этих полей! (например, в форме отправки должен существовать <input name="username".../>)
Я считаю, что лучше просто СКРЫТЬ поля от пользователей визуально, используя jQuery .hide();, а не .remove();
ПРИМЕР кода для скрытия полей "ОТОБРАЖАЕМОЕ ИМЯ" и "НИКНЕЙМ":

jQuery(document).ready(function( $ ){
    $("#nickname,#display_name").parent().parent().hide();
});

2) Чтобы скрыть административную панель, в WordPress есть специальная опция в меню (в Настройках). Для кастомного кода, например:

add_action('after_setup_theme', 'remove_admin_bar');

function remove_admin_bar()
{
  if (!current_user_can('administrator') && !is_admin()) 
  {
    show_admin_bar(false);
  }
}
23 сент. 2014 г. 10:35:25
1

На форуме поддержки WordPress вы можете выполнить удаление с помощью PHP. Этот код удаляет раздел "О себе":

if (! function_exists('remove_plain_bio') ){
    function remove_plain_bio($buffer) {
        $titles = array('#<h3>About Yourself</h3>#','#<h3>About the user</h3>#');
        $buffer=preg_replace($titles,'<h3>Password</h3>',$buffer,1);
        $biotable='#<h3>Password</h3>.+?<table.+?/tr>#s';
        $buffer=preg_replace($biotable,'<h3>Password</h3> <table class="form-table">',$buffer,1);
        return $buffer;
    }

    function profile_admin_buffer_start() { ob_start("remove_plain_bio"); }

    function profile_admin_buffer_end() { ob_end_flush(); }
}
add_action('admin_head', 'profile_admin_buffer_start');
add_action('admin_footer', 'profile_admin_buffer_end');

Код заменяет заголовок "About Yourself" на "Password", а затем удаляет все, что находится между ним и следующей таблицей (которая является таблицей пароля).

Также плагин WP Hide Dashboard делает аналогичную замену с помощью jQuery, если вы хотите расширить функционал.

1 февр. 2012 г. 09:53:06
Комментарии

Для будущих ссылок вы можете использовать admin_head-profile.php и admin_footer-profile.php

User User
18 мар. 2012 г. 16:28:50
1

Используйте

add_action('admin_head', 'remove_profile_fields');

и добавьте

jQuery(document).ready(function(e) {

перед JavaScript-кодом.

22 сент. 2016 г. 08:04:00
Комментарии

Небольшое пояснение было бы замечательно!

bravokeyl bravokeyl
22 сент. 2016 г. 10:13:26
3
-5

Нет фильтра для их отключения. Посмотрите исходный код (/wp-admin/user-edit.php), если вам нужно выполнить подобные действия. Вы можете скрыть их с помощью JS, но их всё равно можно сделать видимыми, а значения обновляются при POST-запросе.

Единственный жизнеспособный вариант — самостоятельно изменить ядро. Просто убедитесь, что вы обрабатываете обновление и игнорируете эти поля при POST-запросе.

3 нояб. 2011 г. 14:23:32
Комментарии

Да, я уже проверил этот файл! JS-решение не кажется слишком безопасным. Посмотрю, что можно сделать! Спасибо!

Rutwick Gangurde Rutwick Gangurde
3 нояб. 2011 г. 16:34:08

Если единственное решение, которое ты можешь предложить — это хак ядра, то, возможно, тебе не стоит отвечать на этот конкретный вопрос. Тебе также не нужно предлагать автору вопроса посмотреть уже упомянутый файл, и ты также ошибаешься, утверждая, что там вообще нет фильтров — неужели ты не прочитал вопрос и предыдущий ответ перед этим?

helenhousandi helenhousandi
3 нояб. 2011 г. 16:53:31

@helenhousandi xoxo

EarnestoDev EarnestoDev
3 нояб. 2011 г. 16:58:48