wake-up-neo.net

WP AJAX funktioniert nicht, kehrt immer zurück

Ich habe hier alle Threads daraufhin überprüft und einen Debug-Test durchgeführt, der funktioniert hat. Ich möchte verstehen, warum mein eigener Code nicht funktioniert, da er die gleiche Funktionalität bietet, die in allen möglichen Threads zu diesem Problem erläutert wird.

Ich versuche, eine AJAX -Anforderung zu senden, wenn ich auf ein Kontrollkästchen klicke, und arbeite mit MySQL.

Hier sind einige Details, um den Umfang und die Vorgehensweise zu verstehen:

var $ = jQuery;
$(function() {
    $('table.table').on('click', '[name="term-id"]', function() {
        var t = $(this),
            id = t.val(),
            checked = t.is(':checked');

        checkCategory(id, checked);
    });
});

function checkCategory(id, checked) {
    $.ajax({
        url: ajaxurl,
        type: 'POST',
        dataType: 'json',
        data: {action: 'setAsyncCheckProduct', id: id, checked: checked},
        success: function(response) {
            alert(response);
        },
        error: function(errorThrown) {
            alert(errorThrown);
        }
    })
}

Dieses Skript ist in meinem Plugin enthalten über:

wp_enqueue_script('settings-manager', $this->pluginUrl . '/assets/js/SettingsManager.js');

In meiner (abstrakten) Haupt-Plugin-Klasse (Es wird instanziiert und wird aufgerufen, daher lasse ich dieses Codebeispiel weg), aber ich füge meine asynchronen Ereignisse hinzu, die admin_init zugewiesen sind:

add_action('admin_init', [$this, 'assignAsyncEvents']);

In meinen konkreten Klassen implementiere ich diese Methode wie folgt:

public function setAsyncCheckProduct()
{
    var_dump($_REQUEST);
    echo 123123123;
    wp_die();
}

public function assignAsyncEvents()
{
    add_action('wp_ajax_setAsyncCheckProduct', [$this, 'setAsyncCheckProduct']);
}

Was im Grunde bedeutet:

Sende AJAX Anfrage an was auch immer "ajaxurl" ist (was korrekt zurückgibt: /wp-admin/admin-ajax.php), Aktion: setAsyncCheckProduct wird an den Server gesendet, auf dem Server sollten die assignAsyncEvents sein bereits erledigt und ein wp_ajax_MY_ACTION_NAME vergeben.

Warum bekomme ich immer noch eine 0 als Antwort?

Vielen Dank

UPDATEIch habe die Debug-Ausgabe aus Gründen der Neugier manuell in admin-ajax.php abgelegt.

if ( is_user_logged_in() ) {
    /**
     * Fires authenticated AJAX actions for logged-in users.
     *
     * The dynamic portion of the hook name, `$_REQUEST['action']`,
     * refers to the name of the AJAX action callback being fired.
     *
     * @since 2.1.0
     */
    do_action( 'wp_ajax_' . $_REQUEST['action'] );
    var_dump('wp_ajax_' . $_REQUEST['action']);
} else {
    /**
     * Fires non-authenticated AJAX actions for logged-out users.
     *
     * The dynamic portion of the hook name, `$_REQUEST['action']`,
     * refers to the name of the AJAX action callback being fired.
     *
     * @since 2.8.0
     */
    do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );
}
// Default status
die( '0' );

Dies ist die Kernfunktionalität mit meinem var_dump hinzugefügt. Mein AJAX -Aufruf GETS THERE und die Ausgabe ist CORRECT ACTION NAME, definiert in add_action in meinen Plugin-Dateien, obwohl nichts von meiner Aktion zurückgegeben wird/es wird nicht aufgerufen und ich komme zur Standardfunktion die( '0' );

Schade. Ich weiß nicht, was ich weiter machen soll.

1
Boris Lapouga

Das Problem ist, wo Sie die add_action Ihres wp_ajax_ platzieren *

Versuchen Sie, es an den Anfang von allem zu stellen und sicherzustellen, dass es in einem/wp-admin/route geladen wird.

Versuchen Sie Ihre URL: http: //xxx/wp-admin/admin-ajax.php? Action = your_action , bis Sie etwas anderes als Null erhalten.

3
Margareto

Platzieren Sie diese Antwort für diejenigen, die versuchen, dasselbe Problem zu beheben.

Es ist wichtig, wo

add_action('wp_ajax_setAsyncCheckProduct', [$this, 'setAsyncCheckProduct']);

wohnt.

In meinem Fall wurde das Problem behoben, indem eine ähnliche Zeile wie in der Haupt-Plugin-Datei verschoben wurde, in der alle konkreten Klassen enthalten und initialisiert wurden. Natürlich musste die Zeile in diese Form geändert werden:

add_action('wp_ajax_setAsyncCheckProduct', ['ClassName', 'setAsyncCheckProduct']);

1
yuga