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

16

Tengo que eliminar algunos campos de perfil de la página 'Perfil' de acuerdo con las funciones del usuario. Para quitar el selector de color que utilicé remove_action("admin_color_scheme_picker", "admin_color_scheme_picker"). Quiero eliminar estos campos:

  1. Apodo
  2. Mostrar nombre públicamente como
  3. Campos AIM, Yahoo, Google talk y Sobre 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. ¿Puede alguien decirme cómo hacer esto? Cualquier ayuda sería apreciada. Gracias

EDITAR: Gracias @helenhousandi por la respuesta. Sin embargo, 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('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 }
}
?>

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

Rutwick Gangurde
fuente
¿A dónde debería ir esto? funciones.php?
Fabian
Si. Puede ir a functions.phpun archivo de complemento. Mientras los ganchos sean correctos, funcionará desde cualquiera de los lugares.
Rutwick Gangurde
Ok, pero si lo pongo en functions.php, ¿cómo devuelvo el javascript? con retorno o eco?
Fabian
Parece que desde WordPress v4.4.1, el apodo se ha convertido en un campo obligatorio y proporciona ERROR: ingrese un apodo al actualizar a un usuario con esto oculto pero no poblado, por lo que no puede ocultarlo más
icc97

Respuestas:

15

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' );
Chris_O
fuente
Gracias ... tengo este! ¿Algo para las secciones 'Mostrar barra de administración' y 'Sobre ti'?
Rutwick Gangurde
Actualice esto si encuentra una solución ... Sin embargo, estoy aceptando su respuesta. ¡Gracias!
Rutwick Gangurde
+1 porque, por lo que puedo recordar, eliminar campos a través de PHP también impide que WordPress cree entradas en blanco en la tabla usermeta.
Ashfame
9

Aunque el user_contactmethodsfiltro es uno de los pocos para la pantalla de perfil de usuario, dado que los otros campos no son obligatorios en WordPress, puede usar jQuery's .hide()y .remove()deshacerse de los que no quiere sin complicaciones en términos de guardar la información . Claro, una persona sin JS aún los vería, pero esa es una pequeña minoría y supongo que la información que cambia allí en realidad no afectará nada.

Un ejemplo de eliminación de toda la pieza de opciones personales (mostrar barra de administración y combinación de colores). Sé que no es exactamente lo que estás buscando, solo quería darte un ejemplo rápido que tengo a mano:

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

Además, una nota sobre la opción Mostrar barra de administración: en 3.3 la barra de administración se está convirtiendo en el encabezado y, por lo tanto, no se puede activar o desactivar, por lo que no vale la pena preocuparse.

Actualicé el código de ejemplo para que sea más preciso y completo. Tenía algunas sobras allí.

helenhousandi
fuente
¡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 profile.php. También necesitaba hacer esto para un rol personalizado específico definido en mi sistema. Actualizando mi pregunta con la respuesta.
Rutwick Gangurde
1
Si agrega lo siguiente a jQuery, también ocultará el Apodo y el 'Nombre para mostrar como' de la pregunta:$("#nickname,#display_name").parent().parent().remove();
icc97
También puede usar el gancho edit_user_profile. Y no use el método jQuery (document) .ready para ejecutar el código instantáneamente. Me gusta esto
Giraldi
Se requiere apodo ahora desde WP v.4.4.1
icc97
2

Como parece que no hay un buen enlace php para esto, terminé ocultando los campos con CSS y luego los eliminé 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' );

    // <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
fuente
1

Desde el foro de soporte de WordPress puedes hacer la eliminación usando PHP. Esto elimina la sección Acerca de ti mismo:

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 'Acerca de usted mismo' con 'Contraseña' y luego elimina cualquier cosa entre eso y la siguiente tabla que encuentra (que es la tabla de contraseña).

Además, el plugin WP Hide Dashboard hace un reemplazo similar de jQuery si desea extender eso.

icc97
fuente
Para referencia futura, es posible que desee utilizar admin_head-profile.phpy en su admin_footer-profile.phplugar
1

¡¡TEN CUIDADO!!

1) Eliminar un campo puede no ser bueno , como en la actualización, si no envía los campos esenciales al enlace de actualización WORDPRESS, ¡entonces podría establecer valores vacíos para esos campos! (por ejemplo, al enviar el formulario, debería existir, es decir <input name="username".../>)
Creo que es mejor OCULTAR a los usuarios solo visualmente, con jquery .hide();y no con el .remove();
código EJEMPLO para ocultar los campos " DISPLAY NAME " y " NICKNAME ":

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 Configuración) . 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
fuente
0

Utilizar

add_action('admin_head', 'remove_profile_fields');

y añadir

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

antes de JavaScript.

Akhil Sharma
fuente
¡Una pequeña explicación sería genial!
bravokeyl
-4

No hay filtro para deshabilitarlos. Mire la fuente ( /wp-admin/user-edit.php) cuando necesite hacer cosas como esta. Puede ocultarlos con JS, pero aún pueden hacerse visibles y los valores se actualizan en POST.

La única opción viable es hackear el núcleo usted mismo. Solo asegúrese de manejar la actualización y no tenga en cuenta estos campos en POST.

EarnestoDev
fuente
Sí, ya revisé ese archivo! La solución JS no parece demasiado segura. ¡Veré lo que puedo hacer! ¡Gracias!
Rutwick Gangurde
3
Si la única solución que se te ocurre es piratear el núcleo, entonces quizás no deberías responder esa pregunta en particular. Tampoco necesita sugerirle al autor de la pregunta que mire el archivo ya mencionado, y tampoco está en lo correcto al afirmar que no hay ningún filtro, ¿seguramente debe haber leído la pregunta y la respuesta anterior primero?
helenhousandi 03 de
@helenhousandi xoxo
EarnestoDev