web-dev-qa-db-fra.com

wp_create_user n'entre pas correctement le mot de passe

J'essaie de créer un nouvel utilisateur après que quelqu'un ait rempli un formulaire. J'utilise wp_create_user pour le faire. Un utilisateur est créé correctement, mais pour une raison quelconque, aucun mot de passe n'est soumis à la table users. C'est simplement une valeur vide.

Tout d'abord, je dois noter que, malheureusement, pour ce projet, je suis sur 3.1.3 et il y a très peu de chance que je sois capable d'utiliser 3.2.1.

J'ai vérifié que le mot de passe est correct jusqu'au moment où il est passé à la fonction wp_create_user et que la valeur est celle attendue. Je suis aussi allé jusqu'à tracer le mot de passe à la fonction wp_insert_user. Il passe par la fonction wp_hash_password et apparaît sous forme de hachage de mot de passe de 34 caractères. J'ai ensuite vérifié quelle était la valeur du mot de passe avant l'exécution de la méthode $wpdb->insert pour insérer l'utilisateur. Le mot de passe reste le beau hash, pas une valeur vide. J'ai ensuite gardé l'ensemble du lapin dans la méthode _insert_replace_helper de la classe $wpdb. Les données alimentant cette fonction étaient très bien; Cependant, la fonction retourne:

return $this->query( $this->prepare( $sql, $data ) );

Je suis allé voir la méthode prepare et elle est définie comme suit:

function prepare( $query = null ) { // ( $query, *$args )

Oui, ce petit commentaire provient du code actuel. Quand je l'ai vu, j'ai pensé que le développeur précédent avait apporté cette modification. J'étais initialement furieux jusqu'à ce que je le diffère du vrai fichier et le trouve identique. Donc, ma confusion ici est que la méthode _insert_replace_helper appelle la méthode prepare et lui envoie deux arguments lorsqu'elle attend 1. Que se passe-t-il dans le monde ici?

En fin de compte, j'ai deux questions:

1) Pourquoi mon mot de passe n'est-il pas envoyé à la base de données? 2) Que se passe-t-il avec la méthode _insert_replace_helper qui envoie deux arguments à la méthode prepare?

Je devrais noter que la fonction que j'utilise pour ajouter l'utilisateur ressemble à ceci:

// Function for registering user
function gov_register_user($name, $password, $email, $company, $phone)
{
    // If user is registered, don't register him/her again, but return true so no error is flagged
    if(email_exists($email))
        return true;

    // If any of the necessary fields are not filled, return false
    if($name == '' || $password == '' || $email == '')
        return false;

    // It's now safe to register the user
    $user_id = wp_create_user($name, $password, $email);
    if($user_id)
    {
        // Email user
        add_filter('wp_mail_content_type',create_function('', 'return "text/html"; '));
        wp_mail($email, 'Registration', get_mail_user_registration($name, $email));

        // Set meta fields
        set_cimyFieldValue($user_id, 'COMPANY', $company);
        set_cimyFieldValue($user_id, 'PHONE', $phone);

        // Log user in
        $gov_creds = array(
            'user_login' => $name,
            'user_password' => $password,
            'remember' => true
        );
        wp_signon($gov_creds, false);   

        return true;
    }
    else
        return false;
}
1
tollmanz

Prise en charge de PHP listes d'arguments de longueur variable . Autrement dit, vous pouvez transmettre autant d’arguments supplémentaires que vous le souhaitez à n’importe quelle fonction et PHP ne clignotera même pas.

Si vous regardez la source de $wpdb->prepare() , elle récupère simplement tous les arguments avec func_get_args() en variable et fonctionne avec cela. Peu importe la signature de fonction (plus ancienne ou actuelle).

Donc, je pense que cela n'a rien à voir avec votre problème de mot de passe, j'essayerais de piquer ce plugin.

PS 3.2 n’est pas très différent de la version 3.1, pourquoi la mise à niveau pose-t-elle problème? Exécuter une version obsolète est un problème à long terme.

1
Rarst