Registriere Ajax Calls Hook

Ich benutze Ajax in einem Plugin für ein Front-End-Formular. Aber es funktioniert nur, wenn ich die add_action("wp_ajax_..." im Plugin Loader platziere. Ich möchte den Aufruf in einer anderen Datei registrieren.

Ich habe versucht:

 function my_plugin_init() { if ( ! is_admin() ) { require( dirname( __FILE__ ) . '/inc/my-plugin-functions.php' ); } } //add_action( 'wp_loaded', 'my_plugin_init' ); add_action( 'init', 'my_plugin_init' ); 

Aber keiner der add_action scheint zu funktionieren. Ajax schlägt fehl, weil es die Ajax-function in inc/my-plugin-functions.php .

Wenn ich die Ajax-function im Plugin-Loader platziere, funktioniert alles wie erwartet:

 function my_plugin_etc() { $title = sanitize_text_field( $_POST['title'] ); $meta = update_post_meta(1234, 'test_key', $title); if ( $meta != false ) echo json_encode(array('status' => 'success', 'message' => 'Title added as postmeta.') ); else echo json_encode(array('status' => 'error', 'message' => 'There was a problem.' ) ); wp_die(); } add_action("wp_ajax_my_plugin_etc", "my_plugin_etc"); 

Ich würde lieber nicht die Ajax-function in den Plugin-Lader setzen.

Was ist der richtige Hook, um eine Datei einzuschließen, damit die Ajax-function in dieser Datei registriert wird?

Solutions Collecting From Web of "Registriere Ajax Calls Hook"

Jede Aktion, die vor dem AJAX-Aufruf ausgetriggers wird, funktioniert. Im Allgemeinen ist init eine gute Wahl.

Sie erwähnen, dass der Ajax-Aufruf von einer “Front-End-Form” gemacht wird. Wenn dieses Formular für Endbenutzer verfügbar ist, die nicht angemeldet sind, müssen Sie Folgendes verwenden:

 add_action ('wp_ajax_nopriv_my_plugin_etc', 'my_plugin_etc') ; 

Siehe wp_ajax_nopriv _ {$ _ REQUEST [‘Aktion’]} .

Bearbeiten

Muß mein Schlafmangel sein, denn ich hätte das früher sehen sollen.

is_admin() gibt während eines admin-ajax.php von admin-ajax.php . Ändern Sie daher my_plugin_init() , dass es

 function my_plugin_init() { if ( ! is_admin() || wp_doing_ajax ()) { require( dirname( __FILE__ ) . '/inc/my-plugin-functions.php' ); } } add_action( 'init', 'my_plugin_init' ); 

wp_doing_ajax () wurde in WP 4.7 eingeführt.

Wenn Ihr Plugin vorher in der Version von WP arbeiten muss, dann ändern Sie es in:

 function my_plugin_init() { if ( ! is_admin() || (defined( 'DOING_AJAX' ) && DOING_AJAX)) { require( dirname( __FILE__ ) . '/inc/my-plugin-functions.php' ); } } add_action( 'init', 'my_plugin_init' ); 

Der Vorteil von wp_doing_ajax() gegenüber dem Test vor 4.7 ist, dass der wp_doing_ajax- Filter auf den defined( 'DOING_AJAX' ) && DOING_AJAX Wert defined( 'DOING_AJAX' ) && DOING_AJAX wodurch Sie defined( 'DOING_AJAX' ) && DOING_AJAX können, ob Sie möchten sich in einem Ajax-Kontext betrachten. Diese zusätzliche Kontrolle ist jedoch in Ihrem Fall wahrscheinlich nicht notwendig.

Schließlich, wenn inc/my-plugin-functions.php nur Code enthält, der sich auf AJAX bezieht, dann entfernen Sie ! is_admin() || ! is_admin() || aus der if Bedingung.

Hast du dein Skript in die Warteschlange eingereiht und dann wp_localize_script in die Datei eingefügt, in der du Ajax verwenden möchtest?

 // your javascript with ajax calls must be enqueued before wp_localize_script. wp_enqueue_script( 'ajax-script', plugins_url( 'file_location.js', __FILE__ ), array('jquery') ); // WordPress localize script wp_localize_script( 'ajax-script', 'ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'we_value' => 1234 ) );