web-dev-qa-db-fra.com

Enregistrement AJAX fonction de rappel qui fait partie d'une classe sans instancier la classe dans function.php

Je ne suis même pas sûr que cela soit possible. Mais néanmoins j'ai pensé à demander. J'ai l'habitude de grouper/grouper 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. Une idée sur la façon dont je peux enregistrer la fonction de rappel AJAX sans instancier la classe dans functions.php?

4
John

Si vous utilisez une classe qui nécessite une instance de, 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'));.

5
Rarst

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

}
1
Shane Burgess