Eliminar el campo "Sitio Web" de la información de contacto
Quiero eliminar el campo del sitio web de la información de contacto del usuario. Utilizo lo siguiente para eliminar AIM, Jabber y Yahoo IM. Pero no puedo usar esto para eliminar el sitio web. ¿Alguien puede ayudar?
function remove_contactmethods( $contactmethods ) {
// Eliminar métodos de contacto no deseados
unset($contactmethods['aim']);
unset($contactmethods['yim']);
unset($contactmethods['jabber']);
return $contactmethods;
}
add_filter('user_contactmethods','remove_contactmethods',10,1);
Respuesta revisada y actualizada:
No podemos usar el filtro user_contactmethods
para eliminar el envoltorio del sitio web, porque esta parte está codificada directamente en el archivo user-edit.php
y no forma parte del bucle de contactos de usuario que se puede filtrar, generado por:
wp_get_user_contact_methods( $profileuser )
Ocultarlo con CSS
El elemento de fila del sitio web ahora tiene su propia clase .user-url-wrap
:
<tr class="user-url-wrap">
<th><label for="url"><?php _e('Sitio web') ?></label></th>
<td>
<input type="url" name="url" id="url"
value="<?php echo esc_attr( $profileuser->user_url ) ?>"
class="regular-text code" />
</td>
</tr>
Anteriormente teníamos que usar jQuery para seleccionar la fila padre del campo #url
y eliminarla.
Pero ahora podemos seleccionar fácilmente el envoltorio del sitio web y ocultarlo con CSS:
function remove_website_row_wpse_94963_css()
{
echo '<style>tr.user-url-wrap{ display: none; }</style>';
}
add_action( 'admin_head-user-edit.php', 'remove_website_row_wpse_94963_css' );
add_action( 'admin_head-profile.php', 'remove_website_row_wpse_94963_css' );
Ocultando otros campos
Existen clases de fila similares:
tr.user-{field}-wrap
disponibles para los campos:
admin-color,
comment-shortcuts,
admin-bar-front,
user-login,
role,
super-admin,
first-name,
last-name,
nickname,
display-name,
email,
description,
pass1,
pass2,
sessions,
capabilities,
...
incluyendo todos los campos de los métodos dinámicos de contactos de usuario.
Aquí simplemente reemplazamos la parte {field}
con el nombre del campo correspondiente.
Capturas de pantalla
Antes de eliminar la fila del sitio web:
Después de eliminar la fila del sitio web:

Esto no funciona para mí. ¿Este código debería ir en functions.php, verdad?

Debes ser un usuario no administrador cuando lo pruebes o comentar la sentencia if
con la prueba de capacidad. Funciona en functions.php
, pero creo que es mejor tenerlo en un plugin para no perderlo cuando cambies el tema.

Esto solo modifica las etiquetas, para los métodos de contacto creados dinámicamente, pero no los campos de texto de entrada correspondientes. El campo de sitio web tampoco es parte de estos métodos de contacto dinámicos. Sin embargo, sería útil tener tales filtros para todas las partes user-*-wrap
;-) @BradDalton

Resolví el problema con las funciones ob_ y DOMDocument. Es mejor que jQuery o CSS para proteger el formulario.
Utilizo este tipo de solución cada vez que no puedo acceder a una parte del contenido HTML mediante un hook.
function remove_extra_field_profile()
{
$current_file_url = preg_replace( "#\?.*#" , "" , basename( $_SERVER['REQUEST_URI'] ) );
if( $current_file_url == "profile.php" )
{
add_action( 'wp_loaded', function(){ ob_start("profile_callback"); } );
add_action( 'shutdown', function(){ ob_end_flush(); } );
}
}
add_action( 'init', 'remove_extra_field_profile' );
function profile_callback( $html )
{
$profile_dom = new DOMDocument;
$profile_dom->loadHTML( $html );
$all_lines = $profile_dom->getElementsByTagname( 'tr' );
$excludes = array(
'user-rich-editing-wrap',
'user-admin-color-wrap',
'user-comment-shortcuts-wrap',
'show-admin-bar user-admin-bar-front-wrap',
'user-url-wrap',
'user-description-wrap'
);
$deletes = array();
foreach ( $all_lines as $line )
{
$tr_calss = $line->getAttribute("class");
if( in_array( $tr_calss, $excludes ) )
{
$deletes[] = $line;
}
}
$deletes[] = $profile_dom->getElementsByTagname( 'h2' )->item(0);
foreach ($deletes as $delete)
{
$delete->parentNode->removeChild( $delete );
}
return $profile_dom->saveHTML();
}

Ampliando la respuesta de @birgire y justificando la de @Patricia Walton, si solo agregas
add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');
solo desaparecerá de la página donde el administrador edita un perfil. Para que también desaparezca cuando un usuario edita su propio perfil, agrega además
add_action('admin_head-profile.php','remove_website_row_wpse_94963');
, así:
function remove_website_row_wpse_94963() {
if(!current_user_can('manage_options')){
// ocultar solo para no administradores
echo "<script>jQuery(document).ready(function(){jQuery('#url').parents('tr').remove();});</script>";
}
}
add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');
add_action('admin_head-profile.php','remove_website_row_wpse_94963');

El código tampoco me funcionaba, pero cambiando el add_action para que apunte a profile.php sí funcionó.
function remove_website_row_wpse_94963() {
if(!current_user_can('manage_options')){
// ocultar solo para no administradores
echo "<script>jQuery(document).ready(function()
{jQuery('#url').parents('tr').remove();});</script>";
}
}
add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');

Ampliando la respuesta de @birgire, escribí esto en un arreglo para que sea un poco más fácil de leer:
function awb_remove_user_profile_fields_with_css() {
// Ocultar campos no deseados en el perfil de usuario
$fieldsToHide = [
'rich-editing', // Edición enriquecida
'admin-color', // Color del administrador
'comment-shortcuts', // Atajos para comentarios
'admin-bar-front', // Barra de administración en el front-end
'user-login', // Nombre de usuario
'role', // Rol
'super-admin', // Super administrador
//'first-name', // Nombre (comentado)
//'last-name', // Apellido (comentado)
'nickname', // Apodo
'display-name', // Nombre público
//'email', // Email (comentado)
'description', // Biografía
//'pass1', // Contraseña 1 (comentado)
//'pass2', // Contraseña 2 (comentado)
'sessions', // Sesiones
'capabilities', // Capacidades
'syntax-highlighting', // Resaltado de sintaxis
'url' // Sitio web
];
// Añadir el CSS
foreach ($fieldsToHide as $fieldToHide) {
echo '<style>tr.user-'.$fieldToHide.'-wrap{ display: none; }</style>';
}
// Campos que no siguen la convención de nombres del wrapper
echo '<style>tr.user-profile-picture{ display: none; }</style>';
// Todos los subtítulos
echo '<style>#your-profile h2{ display: none; }</style>';
}
add_action( 'admin_head-user-edit.php', 'awb_remove_user_profile_fields_with_css' );
add_action( 'admin_head-profile.php', 'awb_remove_user_profile_fields_with_css' );
