Как удалить поле "Биография" на странице профиля пользователя в админке

13 янв. 2012 г., 16:09:34
Просмотры: 16.2K
Голосов: 18

Я хочу удалить или скрыть поле ввода Биографии на странице профиля. Как это сделать? Я уже убрал некоторые контактные методы с этой страницы, но не уверен, как избавиться от биографии.

0
Все ответы на вопрос 5
5
22

В WordPress нет специального хука для управления пользователями — это задача с низким приоритетом. Придется использовать буферизацию вывода (да, не самое элегантное решение).

Вот простой пример, как это можно реализовать:

add_action( 'personal_options', array ( 'T5_Hide_Profile_Bio_Box', 'start' ) );

/**
 * Перехватывает часть с биографией в буфере вывода и удаляет её.
 */
class T5_Hide_Profile_Bio_Box
{
    /**
     * Вызывается на хуке 'personal_options'.
     *
     * @return void
     */
    public static function start()
    {
        $action = ( IS_PROFILE_PAGE ? 'show' : 'edit' ) . '_user_profile';
        add_action( $action, array ( __CLASS__, 'stop' ) );
        ob_start();
    }

    /**
     * Удаляет блок биографии из буферизированного контента.
     *
     * @return void
     */
    public static function stop()
    {
        $html = ob_get_contents();
        ob_end_clean();

        // удаляем заголовок
        $headline = __( IS_PROFILE_PAGE ? 'О себе' : 'О пользователе' );
        $html = str_replace( '<h2>' . $headline . '</h2>', '', $html );

        // удаляем строку таблицы
        $html = preg_replace( '~<tr>\s*<th><label for="description".*</tr>~imsUu', '', $html );
        print $html;
    }
}

Вы можете скачать этот код в виде отдельного плагина: Плагин Remove Bio Box.

Теперь поля пароля находятся в разделе Контактная информация… Если вам это не нравится, добавьте заголовок в методе stop() — и не забудьте про поддержку интернационализации (I18n). ;)

14 янв. 2012 г. 06:58:11
Комментарии

Это очень полезно для меня и именно то, что я искал. Спасибо!

Marc Marc
16 янв. 2012 г. 10:45:53

Отлично. Не знал о константе IS_PROFILE_PAGE :)

Anh Tran Anh Tran
19 янв. 2012 г. 11:31:08

Не работает в версии 4.6.1

realtebo realtebo
15 нояб. 2016 г. 16:09:22

@realtebo Да, теперь <h3> стал <h2>. Я исправил код.

fuxia fuxia
16 нояб. 2016 г. 00:17:53

Это кажется слишком грубым способом решения проблемы, так как это влияет на производительность. Мое CSS-решение ниже гораздо проще и эффективнее, без заметного влияния на производительность.

Phill Healey Phill Healey
27 апр. 2021 г. 14:12:02
0

Самое простое и легковесное решение — использовать CSS, чтобы просто скрыть это из вида.

.user-description-wrap {
   display: none;
}
1 нояб. 2018 г. 00:36:30
3

После недавнего изменения класса это работает:

add_action( 'personal_options', array ( 'T5_Hide_Profile_Bio_Box', 'start' ) );

/**
 * Захватывает часть с биографией в буфере вывода и удаляет её.
 *
 * @author Thomas Scholz, <info@toscho.de>
 *
 */
class T5_Hide_Profile_Bio_Box
{
    /**
     * Вызывается на хуке 'personal_options'.
     *
     * @return void
     */
    public static function start()
    {
        $action = ( IS_PROFILE_PAGE ? 'show' : 'edit' ) . '_user_profile';
        add_action( $action, array ( __CLASS__, 'stop' ) );
        ob_start();
    }

    /**
     * Удаляет блок биографии из буферизированного контента.
     *
     * @return void
     */
    public static function stop()
    {
        $html = ob_get_contents();
        ob_end_clean();

        // удаляем заголовок
        $headline = __( IS_PROFILE_PAGE ? 'О себе' : 'О пользователе' );
        $html = str_replace( '<h3>' . $headline . '</h3>', '', $html );

        // удаляем строку таблицы
        $html = preg_replace( '~<tr class="user-description-wrap">\s*<th><label for="description".*</tr>~imsUu', '', $html );
        print $html;
    }
}
13 мая 2015 г. 19:21:19
Комментарии

Я просто предлагаю изменить это $headline = __( IS_PROFILE_PAGE ? 'About Yourself' : 'About the user' ) на это $headline = ( IS_PROFILE_PAGE ? __('About Yourself') : __('About the user' ));

realtebo realtebo
15 нояб. 2016 г. 16:13:49

Также: заголовок теперь находится в теге <h2>

realtebo realtebo
15 нояб. 2016 г. 16:15:21

Это кажется слишком грубым способом решения проблемы, так как это снижает производительность. Мое решение на основе css, приведенное ниже, гораздо проще и эффективнее без заметного влияния на производительность

Phill Healey Phill Healey
27 апр. 2021 г. 14:12:14
2

На основе предыдущих ответов, вот что я использую для удаления ненужных частей страницы пользователя:

$pagesToAffect = [
    '/wp-admin/user-edit.php',
    '/wp-admin/profile.php'
];

if (isset($PHP_SELF) && in_array($PHP_SELF, $pagesToAffect)) {
    add_action('admin_head', [UserProfileCleaner::class, 'start']);
    add_action('admin_footer', [UserProfileCleaner::class, 'finish']);
    add_filter('user_contactmethods',[UserProfileCleaner::class, 'hideInstantMessaging'],10000,1);
}

class UserProfileCleaner {
    public static function start() {
        ob_start(function($buffer) {
            // Персональные настройки
            if (!IS_PROFILE_PAGE) {
                $startHeading = 'Personal Options';
                $pattern = "@<(h[0-9]) ?[^>]*?>".preg_quote(_x($startHeading))."</\\1 ?>@is";
                preg_match($pattern, $buffer, $start, PREG_OFFSET_CAPTURE);

                $endHeading = 'Name';
                $pattern = "@<(h[0-9]) ?[^>]*?>".preg_quote(_x($endHeading))."</\\1 ?>@is";
                preg_match($pattern, $buffer, $end, PREG_OFFSET_CAPTURE);

                if (isset($start[0][1]) && isset($end[0][1]) && $start[0][1]<$end[0][1]) {
                    $buffer = substr($buffer, 0, $start[0][1]).substr($buffer,$end[0][1]);
                }
            }

            $buffer = self::removeSectionHeading($buffer, 'Name');
            $buffer = self::removeSectionHeading($buffer, 'Contact Info');

            $buffer = self::removeSectionHeading($buffer, 'Additional Capabilities');
            $buffer = self::removeSectionRow($buffer, 'Capabilities');

            $buffer = self::removeSectionHeading($buffer, 'Forums');

            // О пользователе / Био
            $heading = IS_PROFILE_PAGE ? 'About Yourself' : 'About the user';
            $buffer = self::removeStandardSection($buffer, $heading);

            // Yoast
            $heading = 'Yoast SEO Settings';
            $buffer = self::removeStandardSection($buffer, $heading);

            $heading = 'Memberships';
            $pattern = "@<(h[0-9]) ?[^>]*?>".preg_quote(_x($heading))."</\\1 ?>.*?</p>@is";
            $buffer = preg_replace($pattern, "", $buffer, 1);

            return $buffer;
        });
    }

    private static function removeStandardSection($buffer, $heading) {
        $pattern = "@<(h[0-9]) ?[^>]*?>".preg_quote(_x($heading))."</\\1 ?>.*?</table>@is";
        return preg_replace($pattern, "", $buffer, 1);
    }

    private static function removeSectionHeading($buffer, $heading) {
        $pattern = "@<(h[0-9]) ?[^>]*?>".preg_quote(_x($heading))."</\\1 ?>@is";
        return preg_replace($pattern, "", $buffer, 1);
    }

    function removeSectionRow($buffer, $heading) {
        $pattern = "@<tr ?[^>]*?>[^<]*?<th ?[^>]*?>[^<]*?".preg_quote(_x($heading))."[^<]*?</th ?[^>]*?>.*?</tr ?>@is";
        return preg_replace($pattern, "", $buffer, 1);
    }

    public static function finish() {
        ob_end_flush();
    }

    public static function hideInstantMessaging( $contactmethods ) {
        unset($contactmethods['googleplus']);
        unset($contactmethods['twitter']);
        unset($contactmethods['facebook']);
        return $contactmethods;
    }
}

Решение по-прежнему зависит от структуры HTML, но работает в моём случае.

2 февр. 2017 г. 05:40:54
Комментарии

Как я могу удалить поле "Веб-сайт" из user-new.php? Я добавил страницу в $pagesToAffect и убрал website как строку, но оно всё ещё там.

Jason Jason
24 сент. 2017 г. 12:55:34

Это кажется очень грубым способом решения проблемы, так как это добавляет нагрузку на производительность. Мое CSS-решение гораздо проще и эффективнее без заметного влияния на производительность.

Phill Healey Phill Healey
27 апр. 2021 г. 14:12:29
1

Если добавить приведенный ниже код в файл functions.php, это удалит раздел биографии для всех языков многоязычного сайта:

//удаляем биографию
function remove_plain_bio($buffer) {
    $titles = array('#<h3>'._x('About Yourself').'</h3>#','#<h3>'._x('About the user').'</h3>#');
    $buffer=preg_replace($titles,'<h3>'._x('Password').'</h3>',$buffer,1);
    $biotable='#<h3>'._x('Password').'</h3>.+?<table.+?/tr>#s';
    $buffer=preg_replace($biotable,'<h3>'._x('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');
31 мая 2013 г. 12:52:20
Комментарии

Это кажется слишком грубым способом решения проблемы, так как это добавляет нагрузку на производительность. Мой CSS-вариант гораздо проще и эффективнее, без заметного влияния на производительность

Phill Healey Phill Healey
27 апр. 2021 г. 14:12:35