Registrar la función de devolución de llamada AJAX que forma parte de una clase sin crear instancias de la clase en function.php

4

Ni siquiera estoy seguro de si esto es posible. Pero sin embargo pensé en preguntar. Estoy acostumbrado a ajustar / agrupar las llamadas AJAX para una necesidad particular dentro de una clase. Vea abajo.

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

Ahora para que funcione la devolución de llamada AJAX, debo agregar lo siguiente a functions.php (sin incluirlo en ninguna función) para crear una instancia de la clase y hacer que la devolución de llamada funcione.

$my_class = new my_class;

Esto agrega $my_class al espacio de nombres global . Algo que me gustaría evitar. ¿Alguna idea de cómo puedo registrar la función de devolución de llamada AJAX sin crear una instancia de la clase en functions.php ?

    
pregunta John 17.05.2013 - 22:19

2 respuestas

5

Si está utilizando una clase que necesita una instancia de, tiene que crear esa instancia en algún lugar . Actualmente, WP no tiene una convención designada para algo así.

La práctica común es usar métodos estáticos, por lo que tu gancho se convierte en add_action('wp_ajax_my_action', array(__CLASS__, 'my_action_callback')); .

    
respondido por el Rarst 17.05.2013 - 23:17
1

Este es un ejemplo de una clase que utilizo para crear automáticamente devoluciones de llamada ajax a partir de métodos en la clase. Actúa casi como un enrutador.

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

}
    
respondido por el Shane Burgess 15.02.2015 - 17:14

Lea otras preguntas en las etiquetas