Como remover esses campos da seção 'Perfil'?

16

Preciso remover alguns campos de perfil da página 'Perfil' de acordo com as funções de usuário. Para remover o seletor de cores que eu usei remove_action("admin_color_scheme_picker", "admin_color_scheme_picker"). Quero remover estes campos:

  1. Apelido
  2. Exibir nome publicamente como
  3. Campos AIM, Yahoo, Google talk e Sobre você
  4. A seção 'Mostrar barra de administrador', juntamente com as 2 caixas de seleção

Examinei o arquivo 'user-edit.php' para ver se existem ações / filtros que me permitem fazê-lo, mas parece que não há. Alguém pode me dizer como fazer isso? Qualquer ajuda seria apreciada. obrigado

EDIT: Obrigado @helenhousandi pela resposta. Eu já tinha feito dessa maneira.

<?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 }
}
?>

Eu sei que isso é um pouco mais longo, mas funcionou! Acho que vou com a resposta de @ helenhousandi.

Rutwick Gangurde
fonte
Para onde isso deve ir? functions.php?
Fabian
Sim. Pode ir para functions.phpou um arquivo de plugin. Enquanto os ganchos estiverem certos, ele funcionará em qualquer um dos lugares.
Rutwick Gangurde
Ok, mas se eu colocá-lo no functions.php, como faço para retornar o javascript? com retorno ou eco?
Fabian
Parece que desde WordPress v4.4.1, alcunha tornou-se um campo obrigatório e dá ERRO: Por favor, digitar um apelido ao atualizar um usuário com este escondido, mas não povoada, então você não pode simplesmente escondê-lo mais
icc97

Respostas:

15

Para o filtro de métodos de contato 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
fonte
Obrigado ... consegui este! Alguma coisa para as seções 'Mostrar barra de administrador' e 'Sobre você'?
Rutwick Gangurde
Atualize isso se você encontrar uma solução ... No entanto, estou aceitando sua resposta. Obrigado!
Rutwick Gangurde
+1 porque, tanto quanto me lembro de remover os campos via PHP, também impede o WordPress de criar entradas em branco na tabela usermeta.
Ashfame 9/04/12
9

Embora o user_contactmethodsfiltro seja um dos poucos para a tela de perfil do usuário, já que os outros campos não são obrigatórios no WordPress, você pode usar o jQuery .hide()e .remove()se livrar efetivamente daqueles que não deseja, sem complicações em termos de salvar as informações . Claro, uma pessoa sem o JS ligado ainda os veria, mas isso é uma pequena minoria e acho que as informações que mudam lá realmente não afetam nada.

Um exemplo de remoção de toda a parte das opções pessoais (mostra a barra de administração e o esquema de cores). Sei que não é exatamente o que você está procurando, só queria dar um exemplo rápido que tenho em mãos:

// 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
}

Além disso, uma observação sobre a opção Mostrar barra de administrador: na versão 3.3, a barra de administrador está se tornando o cabeçalho e, portanto, não pode ser ativada ou desativada, portanto, pode não valer a pena se preocupar.

Atualizei o exemplo de código para ser mais preciso e completo. Tinha algumas sobras lá.

helenhousandi
fonte
Obrigado! Esta é uma boa solução! O que fiz foi algo semelhante, mas usei um gancho de ação diferente para que meu script funcionasse apenas profile.php. Eu também precisava fazer isso para uma função personalizada específica definida no meu sistema. Atualizando minha pergunta com a resposta.
Rutwick Gangurde
1
Se você adicionar o seguinte ao jQuery, ele também ocultará o apelido e o 'Nome de exibição como' da pergunta:$("#nickname,#display_name").parent().parent().remove();
icc97
Você também pode usar o gancho edit_user_profile. E não use o método jQuery (document) .ready para executar o código instantaneamente. Desta maneira
Giraldi 30/05
O apelido é obrigatório agora desde o WP v.4.4.1
icc97 06/04
2

Como parece não haver um bom gancho de php para isso, acabei escondendo os campos com CSS e os removemos com 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
fonte
1

No fórum de suporte do wordpress, você pode fazer a remoção usando PHP. Isso remove a seção Sobre você mesmo:

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');

O código substitui o cabeçalho 'Sobre você' por 'Senha' e remove qualquer coisa entre a tabela seguinte e a próxima que encontrar (que é a tabela de senhas).

Além disso, o plugin WP Hide Dashboard substitui o jQuery semelhante, se você deseja estender isso.

icc97
fonte
Para referência futura, você pode querer usar admin_head-profile.phpe, em admin_footer-profile.phpvez disso,
1

SEJA CUIDADOSO!!

1) A remoção de um campo pode não ser boa , como na atualização, se você não enviar os campos essenciais para o gancho de atualização do WORDPRESS, ele poderá definir valores vazios para esses campos! (por exemplo, no formulário de envio, deve existir, por exemplo <input name="username".../>)
. Acho que é melhor ocultar visualmente os usuários apenas com jquery .hide();e não com o .remove();
código EXEMPLO para ocultar os campos " DISPLAY NAME " e " NICKNAME ":

jQuery(document).ready(function( $ ){
    $("#nickname,#display_name").parent().parent().hide();
});

2) Para ocultar a barra de administração, existe uma opção especial no menu do wordpress (em Configurações) . para código personalizado, como ie

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
fonte
0

Usar

add_action('admin_head', 'remove_profile_fields');

e adicione

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

antes do JavaScript.

Akhil Sharma
fonte
Uma pequena explicação seria ótima!
bravokeyl
-4

Não há filtro para desativá-los. Veja a fonte ( /wp-admin/user-edit.php) quando precisar fazer coisas assim. Você pode ocultá-los com JS, mas eles ainda podem se tornar visíveis e os valores são atualizados no POST.

A única opção viável é invadir você mesmo o núcleo. Apenas lembre-se de lidar com a atualização e desconsidere esses campos no POST.

EarnestoDev
fonte
Sim, eu já verifiquei esse arquivo! A solução JS não parece muito segura. Verei o que posso fazer! Obrigado!
Rutwick Gangurde
3
Se a única solução em que você pode pensar é invadir o núcleo, talvez você não deva responder a essa pergunta específica. Você também não precisa sugerir ao solicitante da pergunta que examine o arquivo já mencionado e também não está correto ao afirmar que não há filtros - certamente você deve ter lido a pergunta e a resposta anterior primeiro?
precisa saber é o seguinte
@helenhousandi xoxo
EarnestoDev