Как удалить эти поля из раздела 'Профиль'?
Мне нужно удалить некоторые поля профиля со страницы 'Профиль' в зависимости от ролей пользователей. Для удаления выбора цветовой схемы я использовал remove_action("admin_color_scheme_picker", "admin_color_scheme_picker")
. Я хочу удалить следующие поля:
- Никнейм
- Отображать публично как
- Поля AIM, Yahoo, Google talk и О себе
- Раздел 'Показывать панель администратора' вместе с 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.

Для фильтра контактных методов: 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' );

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

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

Хотя фильтр 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 админ-бар становится частью шапки и, следовательно, его нельзя включить или выключить, так что, возможно, не стоит об этом беспокоиться.
Обновил пример кода, чтобы он был точнее и полнее. Были некоторые остаточные элементы.

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

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

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

Поскольку в 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
}

БУДЬТЕ ОСТОРОЖНЫ!!
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);
}
}

На форуме поддержки 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, если вы хотите расширить функционал.

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

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

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