web-dev-qa-db-fra.com

Utiliser Ajax avec un fichier de classe

Pour le moment, j’ai un ajax qui fonctionne (j’obtiens une réponse réussie [200]), mais j’ai un problème avec les crochets d’action sur la réponse. L'objet JSON ne revient pas, à la place je reçois un 0.

J'ai le dé (); après mon retour, je pense donc que le problème est que le crochet ne fonctionne pas.

J'ai essayé plusieurs méthodes dans le constructeur de classe mais je ne suis pas sûr que cette approche soit correcte, je l'ai déjà fait avec un plugin que j'ai créé, mais c'est dans le thème.

Form.php

(inclus dans functions.php avec add_action('after_setup_theme')

public function __construct(){
 // Test #1
 add_action( 'wp_ajax_nopriv_process_reservation', array( &$this, 'process_reservation' ) );

 // Test #2 
 add_action( 'wp_ajax_process_reservation', &$this->process_reservation ); //with and without '&' before $this

 // Test #3 (this is incorrect)
 add_action( 'wp_ajax_nopriv_process_reservation', $this->process_reservation );


//If I wrap this with **add_action('init',function(){... *** then it does not load
 wp_enqueue_script('ajax_script',THEME_MODULES_URL.'/Reservations/form.js',array('jquery'),TRUE);
 wp_localize_script( 'ajax_script', 'myAjax', array(
      'ajaxurl'               => admin_url( 'admin-ajax.php' ), //don't change this
      'itemNonce'             => wp_create_nonce("ajax_nonce"), //don't change this
  ));
}

Juste au cas où cela serait nécessaire, voici le test de ma fonction de rappel pour le moment

private function process_reservation(){
    check_ajax_referer( 'process_reservation_nonce', 'nonce' );

    if( true )
        wp_send_json_success( 'ok' );
    else
        wp_send_json_error( array( 'error' => $custom_error ) );

}

Les données de formulaire dans la console XHR indiquent à la fois l'action et la réponse transmises.

action:process_reservation
ajax_nonce:6f155a1e17

J'ai déjà fait assez d'Ajax pour savoir à quoi m'attendre, alors je suis presque sûr que c'est un problème d'accroché ici, peut-être un thème dont le thème est-il incompris, que toute suggestion ou aide de la communauté serait géniale! Merci d'avance

4
Xtremefaith

Le problème était que dans mon functions.php je chargeais un fichier ( reservations.php ) en utilisant le hook after_setup_theme

add_action('after_setup_theme', 'init_cpts');

Et puis à partir du fichier qui a été chargé, je demandais à mes fichiers de classe avec le hook init. Je pensais que ça irait puisque init se charge après after_setup_theme, cela ressemblait à ceci "

function load_classes(){
    require_once( PATH_TO_FILE .'/Class.php');
}
add_action('init','load_classes');

Le problème mentionné dans le fil @brasofilo était que tout crochet d'action que j'avais tenté une fois dans le fichier de classe ne fonctionnerait plus, car à ce stade, la variable init avait déjà été déclenchée.

Pour résoudre ce problème, j’ai simplement enlevé les éléments déjà chargés, comme indiqué ci-dessus, et simplement required_once dans le fichier lui-même (qui est chargé after_setup_theme). Ensuite, la réponse @brasofilo a fonctionné comme un charme alors assurez-vous de lui attribuer la valeur +1.

4
Xtremefaith

Les erreurs que j'ai repérées dans votre code:

L'une d'elles a été pointée par @helgatheviking dans un commentaire : le rappel Ajax doit être une méthode public, pas private.

Vous ne savez pas comment initialiser cette classe, mais wp_enqueue_script & _style (au singulier) doit être encapsulé dans un crochet wp_enqueue_scripts (WP_DEBUG vide un avis).

Vous pouvez supprimer le & de $this, c'est-à-dire PHP 4. Suivez un exemple de travail:

class MyTheme
{
    public function __construct()
    {
        add_action( 'wp_footer', array( $this, 'aux_function' ) );
        add_action( 'wp_enqueue_scripts', array( $this, 'init_plugin' ) );
        add_action( 'wp_ajax_process_reservation', array( $this, 'process_reservation' ) ); 
        add_action( 'wp_ajax_nopriv_process_reservation', array( $this, 'process_reservation' ) );
    }

    public function aux_function()
    {
        echo '<h4><a href="#" id="wpse">TEST AJAX</a></h4>';
    }

    public function init_plugin()
    {
        wp_enqueue_script( 
            'ajax_script', 
            plugins_url( '/test.js',__FILE__ ), 
            array('jquery'), 
            TRUE 
        );
        wp_localize_script( 
            'ajax_script', 
            'myAjax', 
            array(
                'url'   => admin_url( 'admin-ajax.php' ),
                'nonce' => wp_create_nonce( "process_reservation_nonce" ),
            )
        );
    }

    public function process_reservation()
    {
        check_ajax_referer( 'process_reservation_nonce', 'nonce' );

        if( true )
            wp_send_json_success( 'Ajax here!' );
        else
            wp_send_json_error( array( 'error' => $custom_error ) );
    }
}
new MyTheme();

test.js

jQuery(document).ready(function($) 
{
    $('#wpse').click(function(e) 
    {
        e.preventDefault();
        var data = {
            action: 'process_reservation',
            nonce: myAjax.nonce
        };

        $.post( myAjax.url, data, function( response ) 
        {
            $('#wpse').html( response.data );
        });
    });
});
15
brasofilo

S'il vous plaît vérifier votre appel ajax

si vous utilisez assurez-vous de mettre dataType: "json"


$.ajax({
  dataType: "json",
  url: url,
  data: data,
  success: success
});

ou utilisez la fonction $.getJSON() ...

J'espère que cela corrige le problème.

0
Shahinul Islam