web-dev-qa-db-fra.com

empêcher les utilisateurs de changer leur adresse email

quelqu'un sait-il comment accrocher ou filtrer le fichier user-edit.php afin que l'adresse e-mail d'un utilisateur ne puisse pas être modifiée de la même façon que le nom d'utilisateur est désactivé?.

je peux éditer le fichier de base (gasp) et inclure disabled = "disabled" dans le formulaire. Cela fonctionne mais je ne sais pas comment ajouter le désactiver via un crochet ou un filtre.

je peux aussi exécuter une fonction comme celle-ci qui cache l'adresse électronique via css

/* Change WordPress dashboard CSS */
function custom_admin_styles() {
echo '<style type="text/css">#email { display: none !important; }</style>';
}
add_action('admin_head', 'custom_admin_styles');

mais cela retire tout l’email donc la forme a l’air drôle et puis je crois qu’avec un éditeur DOM comme Firebug, on peut toujours accéder à ce champ d’email et le changer ainsi ... beurk ...

idéalement, je voudrais remplacer tout ce code user-edit.php à partir de ceci ->

<label for="email"><?php _e('E-mail'); ?> <span class="description"><?php _e('(required)'); ?></span></label></th><td><input type="text" name="email" id="email" value="<?php echo esc_attr($profileuser->user_email) ?>" disabled="disabled" class="regular-text" /> <span class="description"><?php _e('Emails cannot be changed.'); ?></span>

à quelque chose comme ça ->

<label for="email"><?php _e('E-mail'); ?> </label></th><td><?php echo esc_attr($profileuser->user_email) ?>" Please Contact Tech support to change your email

merci d'avance pour tous les pointeurs que vous pouvez partager ... Cordialement, Chuck Scott

3
user3858

Pas de réponse exacte, mais pour empêcher le changement d'email (changement réel, pas de modification de champ), vous pouvez modifier cette action:

add_action( 'user_profile_update_errors', 'prevent_email_change', 10, 3 );

function prevent_email_change( $errors, $update, $user ) {

    $old = get_user_by('id', $user->ID);

    if( $user->user_email != $old->user_email   && (!current_user_can('create_users')) )
            $user->user_email = $old->user_email;
}
3
Rarst

Sale bidouille, n'hésitez pas à modifier.

Seuls les administrateurs ou les utilisateurs avec edit_users peuvent "changer" de courrier électronique, les autres ne le peuvent pas.

Theme functions.php:

class Edit_Email {
    function start() {
        ob_start();
    }

    function footer() {
        $content = ob_get_contents();

        ob_end_clean();

        $this->replace( $content );

        echo $content;
    }

    function replace( &$content ) {
        $pattern = array(
            '/E-mail <span.+?<\/span>/',
            '/<input type="text"(.*?)value="(\\S+@\\S+\\.\\w+)[^>]*\/>/'
        );

        $replacement = array(
            'E-mail',
            '<input type="hidden"\1value="\2" /> \2 Please Contact Tech support to change your email.'
        );

        $content = preg_replace( $pattern, $replacement, $content );
    }
}

if ( ! current_user_can( 'edit_users' ) && ( $pagenow == 'profile.php' ) ) :
    $edit_email = new Edit_Email();
    $edit_email->start();

    add_action( 'admin_footer', array( &$edit_email, 'footer' ) );
endif;
3
zeo

Vous pouvez utiliser JQuery pour désactiver le courrier électronique (et tous les autres champs de la page de modification du profil).

Par exemple, quelque chose comme ceci dans un plugin:

  //Disables certain fields (email, password) in WP Admin edit user page (user-edit.php)
   global $pagenow;
   if ( $pagenow == 'user-edit.php' ) {
        add_action( 'admin_footer', 'disable_userprofile_fields' );
   }

    /**
    * Disables certain fields (email, password) in WP Admin edit user page (user-edit.php)
    */
    function disable_userprofile_fields() {
    ?>
        <script>
            jQuery(document).ready( function($) {
                if ( $('input[name=email]').length ) {
                    $('input[name=email]').attr("disabled", "disabled");
                }
                if ( $('input[name=pass1]').length ) {
                    $('input[name=pass1]').attr("disabled", "disabled");
                }
                if ( $('input[name=pass2]').length ) {
                    $('input[name=pass2]').attr("disabled", "disabled");
                }
            });
        </script>
    <?php
    }
2
user4356

En plus de la réponse de Rarst:

Pour empêcher le changement de courrier électronique côté serveur

add_action( 'user_profile_update_errors', 'prevent_email_change', 10, 3 );

function prevent_email_change( $errors, $update, $user ) {

    $old = get_user_by('id', $user->ID);

    if( $user->user_email != $old->user_email   && (!current_user_can('create_users')) )
            $user->user_email = $old->user_email;
}

Pour désactiver les champs du profil de messagerie de l'utilisateur WordPress

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

    add_action( 'admin_footer', 'user_profile_fields_disable_js' );

}

function user_profile_fields_disable_js() {
?>
    <script>
        jQuery(document).ready( function($) {
            var fields_to_disable = ['email'];
            for(i=0; i<fields_to_disable.length; i++) {
                if ( $('#'+ fields_to_disable[i]).length ) {
                    $('#'+ fields_to_disable[i]).attr("disabled");
                    $('#'+ fields_to_disable[i]).after("<span class=\"description\"> " + fields_to_disable[i] + " cannot be changed.</span>");
                }
            }
        });
    </script>
<?php
}

Ressources

https://www.role-editor.com/hide-disable-wordpress-user-profile-fields/

2
RafaSashi