Eliminar el campo "Sitio web" de la información de contacto

9

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 por favor ayuda.

function remove_contactmethods( $contactmethods ) {
    unset($contactmethods['aim']);
    unset($contactmethods['yim']);
    unset($contactmethods['jabber']);
    return $contactmethods;
}
add_filter('user_contactmethods','remove_contactmethods',10,1);
MidhuN
fuente

Respuestas:

12

Respuesta revisada y actualizada:

No podemos usar el user_contactmethodsfiltro para eliminar el contenedor del sitio web, porque esta pieza está codificada en el user-edit.phparchivo y no forma parte del bucle de contactos de usuario filtrable , generado por:

wp_get_user_contact_methods( $profileuser )

Esconderlo con CSS

El elemento de fila del sitio web ahora tiene su propia .user-url-wrapclase:

<tr class="user-url-wrap">
    <th><label for="url"><?php _e('Website') ?></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 apuntar a la fila principal del #urlcampo, para su eliminación.

Pero ahora podemos apuntar fácilmente al contenedor 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' );

Ocultar otros campos

Hay clases de fila similares:

tr.user-{field}-wrap

disponible 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,
...

incluidos todos los campos de los métodos de contactos dinámicos del usuario .

Aquí solo reemplazamos la {field}parte con el nombre del campo correspondiente.

Capturas de pantalla

Antes de eliminar la fila del sitio web: antes de


Después de eliminar la fila del sitio web: Después

Birgire
fuente
44
Debería usar en .remove()lugar de.hide()
Bainternet
Esto no está funcionando para mí. Este código se debe poner en finctions.php ¿verdad?
MidhuN
Debes ser un no administrador cuando lo pruebes o comentes la iforación con la prueba de capacidad. Funciona functions.php, pero creo que es mejor tenerlo en un complemento para que no lo pierdas cuando cambies el tema.
Birgire
¿Qué tal estoapply_filters( "user_{$name}_label", $desc );
Brad Dalton
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 del sitio web tampoco forma parte de estos métodos de contacto dinámico . Sin embargo, sería útil tener estos filtros para todas las user-*-wrappartes ;-) @BradDalton
birgire
5

Resolví el problema con las funciones ob_ y DOMDocument. Es mejor que jQuery o CSS para proteger el formulario.

Uso este tipo de solución cada vez que no puedo acceder a una parte del contenido HTML a través de un gancho.

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();
}
Jérome Obbiet
fuente
Oye, esto es genial.
Michael Mizner
2

Ampliando en @ birgire y justificando la respuesta de @Patricia Walton, si solo agrega

add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');

solo desaparecerá de la página donde el administrador está editando un perfil. Para que también desaparezca cuando un usuario edita su propio perfil, agregue también

add_action('admin_head-profile.php','remove_website_row_wpse_94963');, Me gusta esto:

function remove_website_row_wpse_94963() {
    if(!current_user_can('manage_options')){
        // hide only for non-admins
        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');
afrendeiro
fuente
1
Te falta una tercera acción adicional para la nueva página de usuario:add_action('admin_head-user-new.php','remove_website_row_wpse_94963');
guidod
1

El código tampoco funcionaba para mí, pero el cambio de add_action para apuntar a profile.php sí funcionó.

function remove_website_row_wpse_94963() {
    if(!current_user_can('manage_options')){
        // hide only for non-admins
        echo "<script>jQuery(document).ready(function()    
            {jQuery('#url').parents('tr').remove();});</script>";
    }
}

add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');
Patricia Walton
fuente
No puedo ver cuál es el código que publicaste de forma diferente a @birgire one.
gmazzap
0

Ampliando la respuesta de @ birgire, escribí esto en una matriz para que sea un poco más fácil de leer:

function awb_remove_user_profile_fields_with_css() {
//Hide unwanted fields in the user profile
$fieldsToHide = [
    'rich-editing',
    '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',
    'syntax-highlighting',
    'url'

    ];

    //add the CSS
    foreach ($fieldsToHide as $fieldToHide) {
        echo '<style>tr.user-'.$fieldToHide.'-wrap{ display: none; }</style>';
    }

    //fields that don't follow the wrapper naming convention
    echo '<style>tr.user-profile-picture{ display: none; }</style>';

    //all subheadings
    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' );
Kenny
fuente