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

16

Я должен удалить некоторые поля профиля со страницы «Профиль» в соответствии с ролями пользователей. Для снятия палитры цветов я использовал 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('Personal Options')").next('.form-table').remove();
            jQuery("h3:contains('Personal Options')").remove();
            jQuery("h3:contains('About Yourself')").next('.form-table').remove();
            jQuery("h3:contains('About Yourself')").remove();
        </script>
<?php }
}
?>

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

Рутвик Гангурде
источник
Куда это должно идти? functions.php?
Фабиан
Да. Это может пойти functions.phpили файл плагина. Пока крючки верны, он будет работать в любом месте.
Рутвик Гангурде
Хорошо, но если я положу его в functions.php, как мне вернуть javascript? с возвратом или эхом?
Фабиан
Похоже, что начиная с WordPress v4.4.1, псевдоним стал обязательным полем и дает ОШИБКУ: введите псевдоним при обновлении пользователя с этим скрытым, но не заполненным, так что вы не можете просто его скрыть
icc97

Ответы:

15

Для фильтра контактных методов 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' );
Chris_O
источник
Спасибо ... получил это! Что-нибудь для разделов «Показать панель администратора» и «О себе»?
Рутвик Гангурде
Пожалуйста, обновите это, если вы найдете решение ... Я принимаю ваш ответ, хотя. Благодарность!
Рутвик Гангурде
+1, потому что, насколько я помню, удаление полей через PHP также не позволяет WordPress создавать пустые записи в таблице usermeta.
Ashfame
9

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

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

// remove personal options block
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
}

Также обратите внимание на опцию Show Admin Bar: в 3.3 панель администратора становится заголовком и, следовательно, не может быть включена или выключена, поэтому о ней не стоит беспокоиться.

Я обновил пример кода, чтобы он был более точным и полным. Там были остатки.

helenhousandi
источник
Благодарность! Это хорошее решение! То, что я делал, было чем-то похожим, но я использовал другой хук действий, чтобы мой скрипт работал только на profile.php. Мне также нужно было сделать это для определенной пользовательской роли, определенной в моей системе. Обновление моего вопроса с ответом.
Рутвик Гангурде
1
Если вы добавите следующее в jQuery, оно также скроет псевдоним и «Отображаемое имя как» из вопроса:$("#nickname,#display_name").parent().parent().remove();
icc97
Вы также можете использовать хук edit_user_profile. И не используйте метод jQuery (document) .ready для мгновенного запуска кода. Как это
Хиральди
Псевдоним требуется сейчас, так как WP v.4.4.1
icc97
2

Поскольку для этого, похоже, нет подходящего 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> selectors, each containing a field
    $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" // Personally I decided to remove all H2 tags too.
    );

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

    // Hide the fields with css, so even if javascript is disabled they wont show up. 
    echo "<style>{$selectors}{display:none;}</style>"; ?>

    <script type="text/javascript">
        jQuery( document ).ready(function( $ ){
           // Remove selected <tr>'s
           $( '<?= $selectors; ?>' ).remove();
           // Remove any empty table that may have been left over
           $(".form-table:not(:has(tr))").remove();
        });
    </script>

  <?php
}
tobbe
источник
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, если вы хотите его расширить.

icc97
источник
Для дальнейшего использования, вы можете использовать admin_head-profile.phpи admin_footer-profile.phpвместо этого
1

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

1) Удаление поля может быть не очень хорошим , как при обновлении, если вы не отправите необходимые поля в ловушку обновления WORDPRESS, тогда для этих полей могут быть установлены пустые значения! (например, при отправке формы должно существовать, т. е. <input name="username".../>)
Я думаю, что лучше скрывать от пользователей только визуально, с помощью jquery, .hide();а не с .remove();
кодом EXAMPLE, чтобы скрыть поля « DISPLAY NAME » и « NICKNAME »:

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);
  }
}
T.Todua
источник
0

использование

add_action('admin_head', 'remove_profile_fields');

и добавить

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

до JavaScript.

Ахил Шарма
источник
Небольшое объяснение было бы здорово!
Бравокейл
-4

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

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

EarnestoDev
источник
Да, я уже проверил этот файл! Решение JS не кажется слишком безопасным. Я посмотрю что я могу сделать! Благодарность!
Рутвик Гангурде
3
Если единственное решение, которое вы можете придумать, это взломать ядро, то, возможно, вам не следует отвечать на этот конкретный вопрос. Вам также не нужно предлагать задающему вопрос взглянуть на уже упомянутый файл, и вы также не правы, утверждая, что фильтров вообще нет - наверняка вы сначала прочитали вопрос и более ранний ответ?
helenhousandi
@helenhousandi xoxo
EarnestoDev