Удаление поля "Веб-сайт" из контактной информации
Я хочу удалить поле веб-сайта из контактной информации пользователя. Я использую следующий код для удаления полей 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);
Пересмотренный и обновлённый ответ:
Мы не можем использовать фильтр 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}
соответствующим именем поля.
Скриншоты
Перед удалением строки веб-сайта:
После удаления строки веб-сайта:

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

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

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

Я решил проблему с функциями 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();
}

Дополняя ответ @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');

Код у меня тоже не работал, но изменение 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');

Расширяя ответ @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' );
