Comment supprimer ces champs de la section 'Profil'?

16

Je dois supprimer certains champs de profil de la page «Profil» en fonction des rôles d'utilisateur. Pour retirer le sélecteur de couleur que j'ai utilisé remove_action("admin_color_scheme_picker", "admin_color_scheme_picker"). Je souhaite supprimer ces champs:

  1. Surnom
  2. Afficher le nom publiquement en tant que
  3. Champs AIM, Yahoo, Google Talk et À propos de vous
  4. La section "Afficher la barre d'administration" avec les 2 cases à cocher

J'ai parcouru le fichier 'user-edit.php' pour voir s'il y a des actions / filtres qui me permettent de le faire, mais il semble que non. Quelqu'un peut-il me dire comment faire cela? Toute aide serait appréciée. Merci

EDIT: Merci @helenhousandi pour la réponse. Je l'avais déjà fait de cette façon.

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

Je sais que c'est un peu plus long, mais ça a marché! Je pense que j'irai avec la réponse de @ helenhousandi.

Rutwick Gangurde
la source
Où cela devrait-il aller? functions.php?
Fabian
Oui. Il peut aller vers functions.phpou un fichier de plugin. Tant que les crochets sont droits, cela fonctionnera à partir de l'un ou l'autre des endroits.
Rutwick Gangurde
Ok, mais si je le mets dans le functions.php, comment puis-je retourner le javascript? avec retour ou écho?
Fabian
Il semble que depuis WordPress v4.4.1, le pseudo est devenu un champ obligatoire et donne l' ERREUR: veuillez entrer un pseudo lors de la mise à jour d'un utilisateur avec ce caché mais non renseigné, vous ne pouvez donc plus le masquer
icc97

Réponses:

15

Pour le filtre des méthodes de contact 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
la source
Merci ... a obtenu celui-ci! Quelque chose pour les sections «Afficher la barre d'administration» et «À propos de vous»?
Rutwick Gangurde
Veuillez le mettre à jour si vous trouvez une solution ... J'accepte cependant votre réponse. Merci!
Rutwick Gangurde
+1 car, pour autant que je me souvienne, la suppression de champs via PHP empêche également WordPress de créer des entrées vides dans la table usermeta.
Ashfame
9

Bien que le user_contactmethodsfiltre soit l'un des rares pour l'écran du profil utilisateur, puisque les autres champs ne sont pas requis dans WordPress, vous pouvez utiliser jQuery .hide()et .remove()vous débarrasser efficacement de ceux dont vous ne voulez pas sans complications en termes de sauvegarde des informations . Bien sûr, une personne sans JS sur les verrait toujours, mais c'est une petite minorité et je suppose que les informations qui y changent n'affecteront en fait rien.

Un exemple de suppression de l'ensemble des options personnelles (afficher la barre d'administration et le jeu de couleurs). Je sais que ce n'est pas exactement ce que vous cherchez, je voulais juste vous donner un exemple rapide que j'ai sous la main:

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

En outre, une note sur l'option Afficher la barre d'administration: dans 3.3, la barre d'administration devient l'en-tête et ne peut donc pas être activée ou désactivée, donc cela ne vaut pas la peine de s'inquiéter.

J'ai mis à jour l'exemple de code pour être plus précis et complet. Il y avait des restes là-dedans.

helenhousandi
la source
Merci! C'est une bonne solution! Ce que j'ai fait était quelque chose de similaire, mais j'ai utilisé un crochet d'action différent pour que mon script ne fonctionne que sur profile.php. J'ai également dû le faire pour un rôle personnalisé spécifique défini dans mon système. Mise à jour de ma question avec la réponse.
Rutwick Gangurde
1
Si vous ajoutez ce qui suit à la requête jQuery, cela masquera également le pseudo et le "Nom d'affichage en tant que" de la question:$("#nickname,#display_name").parent().parent().remove();
icc97
Vous pouvez également utiliser le crochet edit_user_profile. Et n'utilisez pas la méthode jQuery (document) .ready pour exécuter le code instantanément. Comme ça
Giraldi
Un pseudo est requis depuis WP v.4.4.1
icc97
2

Comme il ne semble pas y avoir de bon crochet php pour cela, j'ai fini par cacher les champs avec CSS puis les supprimer avec 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
la source
1

Depuis le forum de support wordpress, vous pouvez effectuer la suppression à l'aide de PHP. Cela supprime la section À propos de vous:

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

Le code remplace l'en-tête «About Yourself» par «Password», puis supprime tout ce qui se trouve entre cela et la table suivante qu'il trouve (qui est la table des mots de passe).

De plus, le plugin WP Hide Dashboard fait un remplacement jQuery similaire si vous souhaitez l'étendre.

icc97
la source
Pour référence future, vous souhaiterez peut-être utiliser admin_head-profile.phpet à la admin_footer-profile.phpplace
1

FAITES ATTENTION!!

1) La suppression d'un champ peut ne pas être bonne , comme lors de la mise à jour, si vous n'envoyez pas les champs essentiels au hook de mise à jour WORDPRESS, cela peut définir des valeurs vides pour ces champs! (par exemple, lors de la soumission du formulaire, il devrait exister <input name="username".../>).
Je pense qu'il vaut mieux CACHER visuellement aux utilisateurs uniquement, avec jquery .hide();et non avec le .remove();
code EXAMPLE pour masquer les champs " DISPLAY NAME " et " NICKNAME ":

jQuery(document).ready(function( $ ){
    $("#nickname,#display_name").parent().parent().hide();
});

2) Pour masquer la barre d'administration, il existe une option spéciale dans le menu wordpress (dans Paramètres) . pour le code personnalisé, comme 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
la source
0

Utilisation

add_action('admin_head', 'remove_profile_fields');

et ajouter

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

avant JavaScript.

Akhil Sharma
la source
Une petite explication serait super!
bravokeyl
-4

Il n'y a pas de filtre pour les désactiver. Regardez la source ( /wp-admin/user-edit.php) lorsque vous devez faire des choses comme ça. Vous pouvez les masquer avec JS mais ils peuvent toujours être rendus visibles et les valeurs sont mises à jour sur POST.

La seule option viable consiste à pirater le noyau vous-même. Assurez-vous simplement de gérer la mise à jour et de ne pas tenir compte de ces champs sur POST.

EarnestoDev
la source
Oui, j'ai déjà vérifié ce fichier! La solution JS ne semble pas trop sécurisée. Je vais voir ce que je peux faire! Merci!
Rutwick Gangurde
3
Si la seule solution à laquelle vous pouvez penser est de pirater le cœur, alors vous ne devriez peut-être pas répondre à cette question particulière. Vous n'avez également pas besoin de suggérer au demandeur de consulter le fichier déjà mentionné, et vous avez également tort de déclarer qu'il n'y a pas de filtres du tout - vous devez sûrement avoir lu la question et la réponse précédente en premier?
helenhousandi
@helenhousandi xoxo
EarnestoDev