¿Cómo eliminar estos campos de la sección 'Perfil'?
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:
- Apodo
- Mostrar nombre públicamente como
- Campos de AIM, Yahoo, Google talk y Acerca de ti
- 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.

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

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

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

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.

¡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.

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

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í

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
}

¡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);
}
}

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.

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.

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

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?
