web-dev-qa-db-fra.com

Comment utiliser add_action à partir d'une méthode de classe?

Pour certains contextes, nous construisons un système d'activation pour les nouveaux utilisateurs d'une application utilisant WordPress comme cadre. Nous avons un plugin qui gère la plupart de nos interactions, où tout ce code réside.

Lorsqu'un nouvel utilisateur s'inscrit, un lien d'activation lui est envoyé par courrier électronique. Celui-ci, lorsqu'il est cliqué dessus, l'envoie à une page d'activation. Lorsqu'ils sauvegardent leurs détails, nous voulons créer l'utilisateur avec les métadonnées appropriées et les rediriger vers un modèle de routage personnalisé qui les renvoie vers leur sous-site personnel.

Nous avons le nom d'utilisateur et le mot de passe de l'utilisateur nouvellement créé à notre disposition, nous pouvons donc utiliser wp_signon () . Nous avons une classe Registration_Model qui est instanciée ailleurs. Notre méthode de classe pour démarrer le processus de connexion est celle dans laquelle nous souhaitons appeler add_action.

public function sign_user_in() {
    add_action( 'init', array( $this, 'auto_sign_in') );
}

Notre méthode pour traiter la connexion est ci-dessous, mais soyez conscient, j'ai testé la fonction pour voir si l'action est même détectée par WordPress en faisant écho à une chaîne, ce qui ne fait rien.

public function auto_sign_in()
{
    // if ( ! is_user_logged_in() ) {

         //determine WordPress user account to impersonate
         $creds = array();
         $creds['user_login'] = $this->user->email;
         $creds['user_password']  = $this->user->password->one;
         $creds['remember'] = true;
         $user = wp_signon( $creds, false );
         if ( is_wp_error( $user ) ) {
             echo $user->get_error_message();
         } else {
             wp_redirect('/_router/'); exit;
         }
     }
}

Il semble vraiment que je suis bloqué sur l'action qui n'est pas en cours, ou quelque chose du genre. Est-ce que add_action peut être exécuté depuis un endroit autre que le constructeur de la classe? Tout conseil ou aide est apprécié.

EDIT

J'ai ajusté la fonction pour utiliser $this au lieu de __CLASS__, bien que nous n'obtenions toujours rien lorsque nous nous connectons à 'init'. Juste comme test, j'ai utilisé le dernier crochet absolu qui se déclenche, 'shutdown', et je peux renvoyer une chaîne de test au navigateur qui l'utilise. Je sais donc que de nombreuses opérations sont en cours de chargement. J'ai donc probablement besoin de déplacer l'add_action ailleurs pour qu'il se déclenche plus tôt.

4
ToddSmithSalter

As-tu essayé

add_action( 'init', array( $this, 'auto_sign_in') );

__CLASS__ renvoie le nom de la classe, pas l'instance de la classe, de sorte qu'il ne fonctionne que pour les fonctions statiques.

5
vancoder

__CLASS__ devrait être $this dans votre appel add_action. Je pense que __CLASS__ n'est utilisé que si la fonction est static

2
Manny Fleurmond