Удаление поля "Веб-сайт" из контактной информации

8 апр. 2013 г., 09:28:18
Просмотры: 17.8K
Голосов: 13

Я хочу удалить поле веб-сайта из контактной информации пользователя. Я использую следующий код для удаления полей AIM, Jabber и Yahoo IM. Но я не могу использовать его для удаления поля веб-сайта. Пожалуйста, помогите.

function remove_contactmethods( $contactmethods ) {
    // Удаляем ненужные контактные методы
    unset($contactmethods['aim']);
    unset($contactmethods['yim']);
    unset($contactmethods['jabber']);
    return $contactmethods;
}
add_filter('user_contactmethods','remove_contactmethods',10,1);
0
Все ответы на вопрос 5
6
14

Пересмотренный и обновлённый ответ:

Мы не можем использовать фильтр user_contactmethods для удаления обёртки сайта, потому что этот элемент жёстко закодирован в файле user-edit.php и не является частью фильтруемого цикла контактов пользователя, генерируемого с помощью:

wp_get_user_contact_methods( $profileuser )

Скрытие с помощью CSS

Элемент строки веб-сайта теперь получил свой собственный класс .user-url-wrap:

<tr class="user-url-wrap">
    <th><label for="url"><?php _e('Сайт') ?></label></th>
    <td>
        <input type="url" name="url" id="url" 
               value="<?php echo esc_attr( $profileuser->user_url ) ?>" 
               class="regular-text code" />
    </td>
</tr>

Ранее нам приходилось использовать jQuery, чтобы найти родительскую строку поля #url для удаления.

Но теперь мы можем легко найти обёртку веб-сайта и скрыть её с помощью CSS:

function remove_website_row_wpse_94963_css()
{
    echo '<style>tr.user-url-wrap{ display: none; }</style>';
}
add_action( 'admin_head-user-edit.php', 'remove_website_row_wpse_94963_css' );
add_action( 'admin_head-profile.php',   'remove_website_row_wpse_94963_css' );

Скрытие других полей

Существуют аналогичные классы для строк:

tr.user-{field}-wrap

доступные для полей:

admin-color,
comment-shortcuts,
admin-bar-front,
user-login,
role,
super-admin,
first-name, 
last-name, 
nickname, 
display-name, 
email,
description, 
pass1, 
pass2, 
sessions, 
capabilities,
...

включая все поля из динамических методов контактов пользователя.

Здесь мы просто заменяем часть {field} соответствующим именем поля.

Скриншоты

Перед удалением строки веб-сайта: До удаления


После удаления строки веб-сайта: После удаления

8 апр. 2013 г. 09:52:18
Комментарии

Вместо .hide() следует использовать .remove()

Bainternet Bainternet
8 апр. 2013 г. 10:18:17

У меня это не работает. Этот код нужно поместить в functions.php, верно??

MidhuN MidhuN
8 апр. 2013 г. 10:25:42

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

birgire birgire
8 апр. 2013 г. 10:34:50

Как насчёт этого apply_filters( "user_{$name}_label", $desc );

Brad Dalton Brad Dalton
11 июл. 2015 г. 01:51:34

Это изменяет только метки для динамически создаваемых контактных методов, но не соответствующие текстовые поля ввода. Поле веб-сайт также не является частью этих динамических контактных методов. Было бы удобно иметь такие фильтры для всех частей с user-*-wrap ;-) @BradDalton

birgire birgire
11 июл. 2015 г. 02:15:01

Так и думал. Хорошая возможность предложить улучшение.

Brad Dalton Brad Dalton
11 июл. 2015 г. 03:11:05
Показать остальные 1 комментариев
1

Я решил проблему с функциями ob_ и DOMDocument. Это решение лучше, чем jQuery или CSS для защиты формы.

Я использую такой подход каждый раз, когда не могу получить доступ к части HTML-контента через хук.

function remove_extra_field_profile()
{
    // Получаем текущий URL файла без параметров запроса
    $current_file_url = preg_replace("#\?.*#", "", basename($_SERVER['REQUEST_URI']));

    // Проверяем, находимся ли мы на странице профиля
    if($current_file_url == "profile.php")
    {
        // Запускаем буферизацию вывода с callback-функцией
        add_action('wp_loaded', function(){ ob_start("profile_callback"); });
        // Завершаем буферизацию при завершении работы
        add_action('shutdown', function(){ ob_end_flush(); });
    }
}
add_action('init', 'remove_extra_field_profile');


function profile_callback($html)
{
    // Создаем объект DOMDocument для работы с HTML
    $profile_dom = new DOMDocument;
    $profile_dom->loadHTML($html);

    // Получаем все строки таблицы (элементы tr)
    $all_lines = $profile_dom->getElementsByTagname('tr');

    // Массив классов элементов, которые нужно удалить
    $excludes = array(
        'user-rich-editing-wrap',
        'user-admin-color-wrap',
        'user-comment-shortcuts-wrap',
        'show-admin-bar user-admin-bar-front-wrap',
        'user-url-wrap',
        'user-description-wrap'
    );

    $deletes = array();

    // Проходим по всем строкам таблицы
    foreach ($all_lines as $line) 
    {
        $tr_calss = $line->getAttribute("class");

        // Если класс строки есть в списке исключений, добавляем в массив на удаление
        if(in_array($tr_calss, $excludes))
        {
            $deletes[] = $line;
        }
    }

    // Также добавляем заголовок h2 для удаления
    $deletes[] = $profile_dom->getElementsByTagname('h2')->item(0);

    // Удаляем все отмеченные элементы
    foreach ($deletes as $delete) 
    {
        $delete->parentNode->removeChild($delete);
    }

    // Возвращаем модифицированный HTML
    return $profile_dom->saveHTML();
}
24 мая 2016 г. 22:02:42
Комментарии

Эй, это просто отлично.

Michael Mizner Michael Mizner
8 дек. 2017 г. 02:46:08
1

Дополняя ответ @birgire и обосновывая ответ @Patricia Walton, если вы добавите только

add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');

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

add_action('admin_head-profile.php','remove_website_row_wpse_94963');, вот так:

function remove_website_row_wpse_94963() {
    if(!current_user_can('manage_options')){
        // скрываем только для не-администраторов
        echo "<script>jQuery(document).ready(function(){jQuery('#url').parents('tr').remove();});</script>";
    }
}
add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');
add_action('admin_head-profile.php','remove_website_row_wpse_94963');
24 окт. 2013 г. 14:52:46
Комментарии

Вам не хватает третьего add_action для страницы создания нового пользователя: add_action('admin_head-user-new.php','remove_website_row_wpse_94963');

guidod guidod
6 апр. 2020 г. 16:28:25
1

Код у меня тоже не работал, но изменение add_action на указание profile.php сработало.

function remove_website_row_wpse_94963() {
    if(!current_user_can('manage_options')){
        // скрываем только для не-администраторов
        echo "<script>jQuery(document).ready(function()    
            {jQuery('#url').parents('tr').remove();});</script>";
    }
}

add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');
2 сент. 2013 г. 20:30:04
Комментарии

Я не вижу, чем ваш код отличается от кода @birgire.

gmazzap gmazzap
2 сент. 2013 г. 21:24:04
0

Расширяя ответ @birgire, я оформил это в виде массива для лучшей читаемости:

function awb_remove_user_profile_fields_with_css() {
// Скрываем ненужные поля в профиле пользователя
$fieldsToHide = [
    'rich-editing',      // Визуальный редактор
    'admin-color',       // Цветовая схема админки
    'comment-shortcuts', // Горячие клавиши для комментариев
    'admin-bar-front',   // Панель администратора на фронтенде
    'user-login',        // Логин пользователя
    'role',              // Роль пользователя
    'super-admin',       // Суперадминистратор
    //'first-name',      // Имя (раскомментировать для скрытия)
    //'last-name',       // Фамилия (раскомментировать для скрытия)
    'nickname',          // Никнейм
    'display-name',      // Отображаемое имя
    //'email',           // Email (раскомментировать для скрытия)
    'description',       // Биографическая информация
    //'pass1',           // Новый пароль (раскомментировать для скрытия)
    //'pass2',           // Повторите пароль (раскомментировать для скрытия)
    'sessions',          // Сессии
    'capabilities',      // Возможности
    'syntax-highlighting', // Подсветка синтаксиса
    'url'                // Веб-сайт
    ];

    // Добавляем CSS стили
    foreach ($fieldsToHide as $fieldToHide) {
        echo '<style>tr.user-'.$fieldToHide.'-wrap{ display: none; }</style>';
    }

    // Поля, не следующие стандартному соглашению об именовании
    echo '<style>tr.user-profile-picture{ display: none; }</style>';

    // Все подзаголовки
    echo '<style>#your-profile h2{ display: none; }</style>';
}
add_action( 'admin_head-user-edit.php', 'awb_remove_user_profile_fields_with_css' );
add_action( 'admin_head-profile.php',   'awb_remove_user_profile_fields_with_css' );
28 янв. 2018 г. 05:27:27