web-dev-qa-db-fra.com

Désactiver la modification du profil utilisateur pour un utilisateur

Je cherche actuellement sur Internet comment désactiver l'option de modification de profil dans Wordpress pour un utilisateur et je n'ai pas trouvé de solution. Le problème est que je veux que 95% des utilisateurs puissent modifier leurs profils (adresse, téléphone, ...), mais il y a 5% de plus que je ne veux pas qu'ils aient accès à la section des profils. La meilleure solution pour moi consiste à sélectionner manuellement les utilisateurs que je souhaite désactiver, mais j'ai aussi pensé à créer un rôle ou un groupe d'utilisateurs pour le gérer.

Il n'y a pas de plugin pour cela et la seule chose que j'ai trouvée est le code suivant mais il ne fonctionne pas.

add_action('admin_init', 'user_profile_fields_disable');

function user_profile_fields_disable() {

    global $pagenow;

    // apply only to user profile or user edit pages
    if ($pagenow!=='profile.php' && $pagenow!=='user-edit.php') {
        return;
    }

    // do not change anything for the administrator
    if (current_user_can('administrator')) {
    return;
    }
    if (current_user_can('custom_role') {
      add_action( 'admin_footer', 'user_profile_fields_disable_js' );
    }      
}
/**
 * Disables selected fields in WP Admin user profile (profile.php, user-edit.php)
 */
function user_profile_fields_disable_js() {
?>
    <script>
        jQuery(document).ready( function($) {
            var fields_to_disable = ['email', 'role'];
            for(i=0; i<fields_to_disable.length; i++) {
                if ( $('#'+ fields_to_disable[i]).length ) {
                    $('#'+ fields_to_disable[i]).attr("disabled", "disabled");
                }
            }
        });
    </script>
<?php
}

Vous devez remplacer "custom_role" par le nom du rôle que j'ai attribué à l'utilisateur. Ce code est-il obsolète ou mauvais? Une idée de comment le résoudre?


Merci beaucoup G.M.! C'était une excellente solution et parfaite. J'ai oublié de dire que j'utilise le plugin Woocommerce et j'ai toujours le problème de l'édition de profil dans la page "mon compte".

Pourriez-vous ajouter quelque chose au plugin ci-dessus pour supprimer le lien "modifier"? Cela ne me dérange pas que l'utilisateur puisse lire son profil mais ne permet pas de l'éditer.

Voici ce dont je parle (certains champs sont en espagnol): enter image description here

Merci encore pour votre travail!

1
prepu

Si vous souhaitez supprimer complètement la possibilité pour un utilisateur d'accéder au profil, vous pouvez:

  1. Donner à l’administrateur la possibilité de choisir quel utilisateur peut accéder au profil et lequel non
  2. Supprimer le lien de profil du menu et de la barre d'administration
  3. Assurez-vous que le profil n'est pas accessible, même en cas d'accès direct, en tapant manuellement l'adresse.

Étape 1.

Le premier point est assez facile avec 'personal_options' , 'edit_user_profile_update' hooks:

add_action( 'personal_options', 'rpa_profile_ban_field' );
add_action( 'edit_user_profile_update', 'rpa_profile_ban_field_save' );

function rpa_profile_ban_field( \WP_User $user ) {
  $current = wp_get_current_user();
  if ( ! is_admin() || $user->ID === $current->ID ) return;
  if ( ! user_can( $current, 'edit_users' ) ) return;
  $target = new WP_User( $user->ID ); 
  if ( $target->exists() &&  ! user_can( $target, 'edit_users' ) ) {
    $banned = (int) get_user_meta( $user->ID, '_profile_banned', TRUE );
  ?>
  <table class="form-table"><tbody><tr>
  <th scope="row">Profile Ban</th><td>
  <input<?php checked(1, $banned); ?> name="_profile_banned" value="1" type="checkbox">
  Ban user to enter profile?
  </td></tr></tbody></table>
  <?php
  }
}

function rpa_profile_ban_field_save( $userid ) {
  $current = wp_get_current_user();
  if ( ! is_admin() || $user->ID === $current->ID ) return;
  if ( ! user_can( $current, 'edit_users' ) ) return;
  $target = new WP_User( $userid );
  if ( ! $target->exists() || user_can( $target, 'edit_users' ) ) return; 
  $ban = filter_input( INPUT_POST, '_profile_banned', FILTER_SANITIZE_NUMBER_INT );
  if ( (int) $ban > 0 ) {
    update_user_meta( $userid, '_profile_banned', 1 );
  } elseif ( get_user_meta( $userid, '_profile_banned', TRUE ) ) {
    delete_user_meta( $userid, '_profile_banned' );
  }
}

À l'aide de ce code, les administrateurs peuvent accéder à chaque utilisateur et désactiver l'accès à la page de profil. Ceci est la sortie du code:

Ban user fields

Étape 2.

Supprimer le lien de profil du menu est facile avec remove_menu_page :

add_action( 'admin_menu', 'rpa_profile_menu_remove' );

function rpa_profile_menu_remove(){
  $remove = get_user_meta( get_current_user_id(), '_profile_banned', TRUE );
  if ( ! current_user_can( 'edit_users' ) && (int) $remove > 0 ) {
    remove_menu_page( 'profile.php' );
  } 
}

Supprimer le lien de profil de la barre d’administration est un peu plus complexe, ou mieux, complètement supprimer le menu utilisateur en haut à droite est facile à utiliser avec $wp_admin_bar->remove_menu('my-account') (voir WP_Admin_Bar docs ), mais il est "inesthétique" et De plus, vous supprimez la possibilité de vous déconnecter. Donc, une meilleure solution consiste à supprimer uniquement le lien vers le profil:

add_action( 'wp_before_admin_bar_render', 'rpa_profile_adminbar_remove' );

function rpa_profile_adminbar_remove() {
  $remove = get_user_meta( get_current_user_id(), '_profile_banned', TRUE );
  if ( (int) $remove !== 1 || current_user_can( 'edit_users' ) ) return;
  global $wp_admin_bar;
  $account = (array) $wp_admin_bar->get_node('my-account');
  $info = (array) $wp_admin_bar->get_node('user-info');
  $logout = (array) $wp_admin_bar->get_node('logout');
  $account['href'] = $info['href'] = '#';
  $wp_admin_bar->remove_node('my-account');
  $wp_admin_bar->remove_node('user-info');
  $wp_admin_bar->remove_node('edit-profile');
  $wp_admin_bar->remove_node('logout');
  $wp_admin_bar->add_node($account);
  $wp_admin_bar->add_node($info);
  $wp_admin_bar->add_node($logout);
}

Étape 3.

En utilisant tout le code ci-dessus, un utilisateur ne voit plus de lien vers son profil. Cependant, il suffit de taper http://www.example.com/wp-admin/profile.php et la page de profil s’affiche. Cela peut être facilement résolu:

add_action( 'load-profile.php', 'rpa_profile_banned_check' );
add_action( 'load-index.php', 'rpa_profile_banned_msg' );
add_action( 'all_admin_notices', 'rpa_profile_banned_msg' );

function rpa_profile_banned_check() {
  $remove = get_user_meta( get_current_user_id(), '_profile_banned', TRUE );
  if ( (int) $remove === 1 && ! current_user_can( 'edit_users' ) ) {
    wp_redirect( add_query_arg( array( 'pbanned' => 1), admin_url('index.php') ) );
    exit();
  }
}

function rpa_profile_banned_msg() {
  if ( current_user_can( 'edit_users' ) ) return;
  static $show = false;
  if ( current_filter() === 'load-index.php' ) {
    $msg = (int) filter_input( INPUT_GET, 'pbanned', FILTER_SANITIZE_NUMBER_INT);
    $banned = (int) get_user_meta( get_current_user_id(), '_profile_banned', TRUE );
    $show = ( $msg === $banned && $banned === 1 );    
  } elseif ( current_filter() === 'all_admin_notices' && $show ) {
    echo '<div class="error"><p>Sorry, you are not allowed to edit your profile.</p></div>';
  }
}

Le code précédent vérifie si l'utilisateur est banni lors du chargement de la page de profil et, si tel est le cas, redirige l'utilisateur vers le tableau de bord en ajoutant une variable dans l'URL permettant d'afficher un message informant l'utilisateur qu'il n'est pas autorisé à voir le profil.

Voici comment le message apparaît:

Admin notices for user not allowed to see profile


Tout le code, sous forme de plugin, disponible dans un fichier Gist ici .

2
gmazzap

Quelqu'un m'a aidé à obtenir la même chose pour Woocommerce 2.0.XX. La première chose à faire est d’installer le G.M. plugin ci-dessus. Ensuite, j'ai édité le fichier /plugins/woocommerce/templates/myaccount/my-address.php et vous devez ajouter à la ligne 28:

$checkProfile =  get_user_meta( $customer_id, '_profile_banned', TRUE );

Et aussi vous devez substituer à la ligne 45:

<a href="<?php echo esc_url( add_query_arg('address', $name, get_permalink(woocommerce_get_page_id( 'edit_address' ) ) ) ); ?>" class="edit"><?php _e( 'Edit', 'woocommerce' ); ?></a>

avec:

<?php 
if (!empty($checkProfile) && $checkProfile==1) {
echo '';
} else {
echo '<a href="', esc_url( add_query_arg('address', $name, get_permalink(woocommerce_get_page_id( 'edit_address' ) ) ) ), '" class="edit">', _e( 'Edit', 'woocommerce' ), '</a>';
}
?>
0
prepu