Suppression du champ «Site Web» des coordonnées

9

Je souhaite supprimer le champ du site Web des coordonnées de l'utilisateur. J'utilise ce qui suit pour supprimer l'AIM, Jabber et Yahoo IM. Mais je ne suis pas en mesure de l'utiliser pour supprimer le site Web. Quelqu'un s'il vous plaît aider.

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

Réponses:

12

Réponse revisitée et mise à jour:

Nous ne pouvons pas utiliser le user_contactmethodsfiltre pour supprimer le wrapper du site Web, car cette pièce est codée en dur dans le user-edit.phpfichier et ne fait pas partie de la boucle de contacts utilisateur filtrable , générée par:

wp_get_user_contact_methods( $profileuser )

Le cacher avec CSS

L' élément de ligne du site Web a désormais sa propre .user-url-wrapclasse:

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

Auparavant, nous devions utiliser jQuery, pour cibler la ligne parent du #urlchamp, pour la suppression.

Mais maintenant, nous pouvons facilement cibler le wrapper du site Web et le masquer avec 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' );

Masquer d'autres champs

Il existe des classes de lignes similaires:

tr.user-{field}-wrap

disponible pour les champs:

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

y compris tous les champs des méthodes de contacts utilisateurs dynamiques .

Ici, nous remplaçons simplement la {field}pièce par le nom de champ correspondant.

Captures d'écran

Avant de supprimer la ligne du site Web: Avant


Après avoir supprimé la ligne du site Web: Après

Birgire
la source
4
Vous devriez utiliser à la .remove()place de.hide()
Bainternet
Ça ne marche pas pour moi. Ce code devrait être mis dans finctions.php à droite ??
MidhuN
Vous devez être un non-administrateur lorsque vous le testez ou commentez la ifphrase avec le test de capacité. Cela fonctionne functions.php, mais je pense qu'il vaut mieux l'avoir dans un plugin pour ne pas le perdre lorsque vous changez de thème.
birgire
Que diriez-vous de celaapply_filters( "user_{$name}_label", $desc );
Brad Dalton
Cela modifie uniquement les étiquettes, pour les méthodes de contact créées dynamiquement , mais pas les champs de texte d'entrée correspondants. Le champ du site Web ne fait pas non plus partie de ces méthodes de contact dynamiques . Il serait cependant utile d'avoir de tels filtres pour toutes les user-*-wrapparties ;-) @BradDalton
birgire
5

J'ai résolu le problème avec les fonctions ob_ et DOMDocument. C'est mieux que jQuery ou CSS pour protéger le formulaire.

J'utilise ce type de solution chaque fois que je ne peux pas accéder à une partie du contenu HTML via 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();
}
Jérome Obbiet
la source
Hé, c'est super.
Michael Mizner
2

Développer sur @ birgire et justifier la réponse de @Patricia Walton, si vous ajoutez seulement

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

il ne disparaîtra que de la page où l'administrateur modifie un profil. Pour le faire également disparaître lorsqu'un utilisateur modifie son propre profil, ajoutez également

add_action('admin_head-profile.php','remove_website_row_wpse_94963');, comme ça:

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
la source
1
Il vous manque un troisième add_action pour la nouvelle page utilisateur:add_action('admin_head-user-new.php','remove_website_row_wpse_94963');
guidod
1

Le code ne fonctionnait pas non plus pour moi, mais la modification de add_action pour pointer vers profile.php a fonctionné.

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
la source
Je ne vois pas en quoi le code que vous avez publié diffère de @birgire one.
gmazzap
0

En développant la réponse de @ birgire, j'ai écrit ceci dans un tableau donc c'est un peu plus facile à lire:

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
la source