¿Cómo eliminar estos campos de la sección 'Perfil'?

3 nov 2011, 12:36:53
Vistas: 42.2K
Votos: 22

Tengo que eliminar algunos campos del perfil de la página 'Perfil' según los roles de usuario. Para eliminar el selector de color usé remove_action("admin_color_scheme_picker", "admin_color_scheme_picker"). Quiero eliminar estos campos:

  1. Apodo
  2. Mostrar nombre públicamente como
  3. Campos de AIM, Yahoo, Google talk y Acerca de ti
  4. La sección 'Mostrar Barra de Administración' junto con las 2 casillas de verificación

Revisé el archivo 'user-edit.php' para ver si hay acciones/filtros que me permitan hacerlo, pero parece que no hay. ¿Alguien puede decirme cómo hacer esto? Cualquier ayuda sería apreciada. Gracias

EDICIÓN: Gracias @helenhousandi por la respuesta. Aunque ya lo había hecho de esta manera.

<?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('Opciones Personales')").next('.form-table').remove();
            jQuery("h3:contains('Opciones Personales')").remove();
            jQuery("h3:contains('Acerca de ti')").next('.form-table').remove();
            jQuery("h3:contains('Acerca de ti')").remove();
        </script>
<?php }
}
?>

¡Sé que esto es un poco más largo, pero funcionó! Creo que me quedaré con la respuesta de @helenhousandi.

5
Comentarios

¿Dónde debería ir esto? ¿functions.php?

Fabian Fabian
22 ene 2016 15:16:40

Sí. Puede ir en functions.php o en un archivo de plugin. Mientras los hooks estén correctos, funcionará desde cualquiera de los lugares.

Rutwick Gangurde Rutwick Gangurde
22 ene 2016 18:46:12

Ok, pero si lo pongo en el functions.php, ¿cómo devuelvo el javascript? ¿con return o echo?

Fabian Fabian
25 ene 2016 17:31:25

Parece que desde WordPress v4.4.1, el Apodo se ha convertido en un campo obligatorio y muestra ERROR: Por favor ingresa un apodo al actualizar un usuario cuando este campo está oculto pero no poblado, por lo que ya no puedes simplemente ocultarlo

icc97 icc97
7 abr 2016 01:08:38

Es 2022 y las secciones de perfil aún no están envueltas con un ID único.. bueno.

mike23 mike23
16 ago 2022 13:52:41
Todas las respuestas a la pregunta 7
3
20

Para el filtro de métodos de contacto: 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' );
3 nov 2011 13:08:03
Comentarios

Gracias... ¡entendido este! ¿Algo para las secciones 'Mostrar barra de administración' y 'Sobre ti'?

Rutwick Gangurde Rutwick Gangurde
3 nov 2011 13:48:12

Por favor actualiza esto si encuentras una solución... Acepto tu respuesta de todos modos. ¡Gracias!

Rutwick Gangurde Rutwick Gangurde
3 nov 2011 16:35:05

+1 porque hasta donde recuerdo, eliminar campos mediante PHP también evita que WordPress cree entradas vacías en la tabla usermeta.

Ashfame Ashfame
9 abr 2012 16:12:09
4
10

Aunque el filtro user_contactmethods es uno de los pocos para la pantalla de perfil de usuario, dado que los otros campos no son obligatorios en WordPress, podrías usar jQuery con .hide() y .remove() para eliminar efectivamente los que no deseas sin complicaciones al guardar la información. Claro, una persona sin JavaScript activado aún los vería, pero eso es una minoría pequeña y supongo que los cambios en esa información no afectarían realmente nada.

Un ejemplo de cómo eliminar todo el bloque de opciones personales (mostrar barra de administración y esquema de colores). Sé que no es exactamente lo que buscas, solo quería darte un ejemplo rápido que tengo a mano:

// eliminar el bloque de opciones personales
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
}

Además, una nota sobre la opción "Mostrar barra de administración": en la versión 3.3, la barra de administración se convierte en el encabezado y, por lo tanto, no se puede activar o desactivar, así que quizá no valga la pena preocuparse por ello.

Actualicé el ejemplo de código para que sea más preciso y completo. Había algunos restos innecesarios.

3 nov 2011 16:36:25
Comentarios

¡Gracias! ¡Esta es una buena solución! Lo que hice fue algo similar pero usé un gancho de acción diferente para que mi script solo se ejecute en profile.php. También necesitaba hacer esto para un rol personalizado específico definido en mi sistema. Actualizaré mi pregunta con la respuesta.

Rutwick Gangurde Rutwick Gangurde
12 nov 2011 13:10:15

Si agregas lo siguiente al jQuery también ocultará el Apodo y 'Mostrar nombre como' de la pregunta: $("#nickname,#display_name").parent().parent().remove();

icc97 icc97
1 feb 2012 10:16:46

También puedes usar el gancho edit_user_profile. Y no usar el método jQuery( document ).ready para ejecutar el código instantáneamente. Así

Giraldi Giraldi
30 may 2012 10:24:46

El apodo es obligatorio ahora desde WP v.4.4.1

icc97 icc97
7 abr 2016 01:09:42
0

Como no parece haber un buen hook de PHP para esto, terminé ocultando los campos con CSS y luego eliminándolos con 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' );

    // Selectores <tr>, cada uno conteniendo un campo
    $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" // Personalmente decidí eliminar también todas las etiquetas H2.
    );

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

    // Ocultar los campos con CSS, para que incluso si JavaScript está deshabilitado no se muestren. 
    echo "<style>{$selectors}{display:none;}</style>"; ?>

    <script type="text/javascript">
        jQuery( document ).ready(function( $ ){
           // Eliminar los <tr> seleccionados
           $( '<?= $selectors; ?>' ).remove();
           // Eliminar cualquier tabla vacía que pueda haber quedado
           $(".form-table:not(:has(tr))").remove();
        });
    </script>

  <?php
}
10 sept 2017 19:28:53
0

¡TEN CUIDADO!

1) Eliminar un campo puede no ser buena idea, ya que al actualizar, si no envías los campos esenciales al hook de actualización de WORDPRESS, podría establecer valores vacíos para esos campos. (Por ejemplo, en un formulario de envío debería existir algo como <input name="username".../>)
Creo que es mejor OCULTAR los campos visualmente a los usuarios, usando jQuery .hide(); y no con .remove();
EJEMPLO de código para ocultar los campos "NOMBRE PARA MOSTRAR" y "APODO":

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

2) Para ocultar la barra de administración, hay una opción especial en el menú de WordPress (en Ajustes). Para código personalizado, como por ejemplo:

add_action('after_setup_theme', 'remove_admin_bar');

function remove_admin_bar()
{
  if (!current_user_can('administrator') && !is_admin()) 
  {
    show_admin_bar(false);
  }
}
23 sept 2014 10:35:25
1

Desde el foro de soporte de WordPress puedes realizar la eliminación usando PHP. Esto remueve la sección "Acerca de ti":

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

El código reemplaza el encabezado 'About Yourself' con 'Password' y luego elimina todo lo que haya entre ese y la siguiente tabla que encuentre (que es la tabla de contraseña).

También el plugin WP Hide Dashboard hace un reemplazo similar con jQuery si deseas extender esa funcionalidad.

1 feb 2012 09:53:06
Comentarios

Para futuras referencias, podrías querer usar admin_head-profile.php y admin_footer-profile.php en su lugar

User User
18 mar 2012 16:28:50
1

Utiliza

add_action('admin_head', 'remove_profile_fields');

y agrega

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

antes del código JavaScript.

22 sept 2016 08:04:00
Comentarios

¡Una pequeña explicación sería genial!

bravokeyl bravokeyl
22 sept 2016 10:13:26
3
-5

No hay un filtro para deshabilitarlos. Revisa el código fuente (/wp-admin/user-edit.php) cuando necesites realizar este tipo de modificaciones. Podrías ocultarlos con JS pero aún así pueden hacerse visibles y los valores se actualizan al enviar el POST.

La única opción viable es modificar el núcleo manualmente. Solo asegúrate de manejar la actualización y omitir estos campos al recibir el POST.

3 nov 2011 14:23:32
Comentarios

¡Sí, ya revisé ese archivo! La solución con JS no parece muy segura. ¡Veré qué puedo hacer! ¡Gracias!

Rutwick Gangurde Rutwick Gangurde
3 nov 2011 16:34:08

Si la única solución que se te ocurre es hackear el núcleo, entonces quizás no deberías responder esa pregunta en particular. Tampoco necesitas sugerirle al que hizo la pregunta que mire el archivo ya mencionado, y tampoco es correcto afirmar que no hay ningún filtro - ¿seguro que leíste la pregunta y la respuesta anterior primero?

helenhousandi helenhousandi
3 nov 2011 16:53:31

@helenhousandi xoxo

EarnestoDev EarnestoDev
3 nov 2011 16:58:48