Enregistrement de la fonction de rappel AJAX faisant partie d'une classe sans l'instancier à la classe dans function.php

4

Je ne suis même pas sûr que cela soit possible. Mais néanmoins j'ai pensé à demander. J'ai l'habitude de regrouper / regrouper des appels AJAX pour un besoin particulier au sein d'une classe. Voir ci-dessous.

class my_class {
    function __construct() {
        $this->hooks();
    }

    function hooks() {
        add_action('wp_ajax_my_action', array($this, 'my_action_callback'));
    }

    function my_action_callback() {
        // do something
    }
}

Maintenant, pour que le rappel AJAX fonctionne, je dois ajouter ce qui suit à functions.php (sans le placer dans une fonction) pour instancier la classe et faire fonctionner le rappel.

$my_class = new my_class;

Ceci ajoute $my_class à l'espace de noms global . Quelque chose que je voudrais éviter. Aucune idée sur la façon dont je peux enregistrer la fonction de rappel AJAX sans instancier la classe dans functions.php ?

    
posée John 17.05.2013 - 22:19

2 réponses

5

Si vous utilisez une classe qui a besoin d’une instance, vous devez créer cette instance quelque part . Actuellement, WP n'a pas de convention désignée pour quelque chose comme ça.

La pratique courante consiste à utiliser des méthodes statiques afin que votre hook devienne add_action('wp_ajax_my_action', array(__CLASS__, 'my_action_callback')); .

    
réponse donnée Rarst 17.05.2013 - 23:17
1

Voici un exemple de classe que j'utilise pour créer automatiquement des rappels ajax à partir de méthodes de la classe. Il agit presque comme un routeur.

class AjaxEndpoint {
    //Loop through all functions and add them as ajax actions
    public function registerActions() {
        foreach ( get_class_methods( $this ) as $method_name ) {
            if ( $method_name !== 'registerActions' ) {
                add_action( "wp_ajax_".$method_name, array( $this, $method_name ) );
                //add_action( "wp_ajax_nopriv_".$method_name, array( $this, $method_name ) );
            }
        }
    }

}
    
réponse donnée Shane Burgess 15.02.2015 - 17:14

Lire d'autres questions sur les étiquettes