Ajax mit einer classndatei verwenden

Im Moment habe ich einen Ajax, der funktioniert (ich bekomme eine Erfolgs- [200] -Antwort), aber ein Problem mit der Aktion hat Auswirkungen auf die Antwort. Das JSON-Objekt kommt nicht zurück, stattdessen erhalte ich eine 0 .

Ich habe den Würfel (); Nach meiner Rückkehr denke ich, das Problem ist, dass der Haken nicht funktioniert.

Ich habe mehrere Methoden innerhalb des classnkonstruktors ausprobiert, aber ich bin nicht sicher, ob dieser Ansatz richtig ist, ich habe es vorher mit einem Plugin gemacht, das ich gemacht habe, aber das ist innerhalb des Themas .

Form.php

(in der functions.php enthalten mit 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 )); } 

Nur für den Fall, dass es hier nötig ist, ist auch hier der Test meiner Callback-function

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

Formulardaten in der XHR-Konsole zeigen sowohl die Aktion als auch den ausgegebenen Nounce an

 action:process_reservation ajax_nonce:6f155a1e17 

Ich habe genug Ajax gemacht, um zu wissen, was ich zu erwarten habe, also bin ich mir ziemlich sicher, dass es ein Haken ist, vielleicht etwas mit dem Themenbereich, den ich nicht verstehe, wie auch immer, Vorschläge oder Hilfe von der Community wären großartig! Danke im Voraus

Solutions Collecting From Web of "Ajax mit einer classndatei verwenden"

Die Fehler, die ich in deinem Code entdeckt habe:

Einer wurde von @helgatheviking in einem Kommentar darauf hingewiesen: Der Ajax Callback muss eine public Methode sein, nicht private .

Nicht sicher, wie Sie diese class initialisieren, aber wp_enqueue_script & _style (im Singular) muss in einen wp_enqueue_scripts Hook gekapselt werden (WP_DEBUG gibt eine Benachrichtigung aus).

Sie können die & aus $this , das ist PHP 4. Lassen Sie ein funktionierendes Beispiel:

 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 '

TEST AJAX

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

Das Problem war, dass ich in meiner functions.php eine Datei ( after_setup_theme ) mit dem after_setup_theme Hook after_setup_theme

 add_action('after_setup_theme', 'init_cpts'); 

Und dann forderte ich innerhalb der Datei, die geladen wurde, meine classndateien mit dem init Hook. Ich dachte, das wäre in after_setup_theme , da init nach after_setup_theme lädt, sah es so aus. ”

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

Das Problem, das in @brasofilo thread erwähnt wurde, war, dass jeder Aktionshook, den ich einmal in der classndatei versucht hatte, nicht mehr funktionierte, da zu diesem Zeitpunkt die init bereits ausgetriggers worden war.

Um dies zu beheben, habe ich einfach loaded_classes () wie oben gezeigt entfernt und stattdessen nur required_once innerhalb der Datei selbst (die after_setup_theme geladen after_setup_theme ). Dann @brasofilo Antwort funktionierte wie ein Charme, so stellen Sie sicher, seine Antwort +1.

Bitte überprüfen Sie Ihren Ajax-Anruf

Wenn Sie verwenden, stellen Sie sicher, dass Sie dataType: “json”

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

oder benutze $.getJSON() function …

Hoffe, das behebt das Problem.