Wie kann ich AJAX für ein Button-Click-Ereignis ausführen?

7

Update: Ich habe es geschafft, AJAX zum Laufen zu bringen, aber nicht im Click-Ereignis. Ich habe die Frage entsprechend aktualisiert.

Ich versuche einen Code, den ich auf der Seite gefunden habe: 'AJAX in Plugins' .

Ich kann es jedoch nicht zum Laufen bringen und weiß nicht wirklich, wo ich anfangen soll zu suchen. Es funktioniert, wenn ich die Klickfunktion entferne und den Code einfach beim Seitenladen ausführe.

Ich habe eine Javascript-Datei, die so aussieht:

jQuery(document).ready(function(){
    jQuery("#createremotesafe").click(function(){
        alert ('test');
        var data = {
            action: 'my_action',
            whatever: 1234
        };

        // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php

        jQuery.post(ajaxurl, data, function(response) {
            alert('Got this from the server: ' + response);
        });
    });    
});

und irgendwo in meinem PHP-Skript, das die Schaltfläche generiert, die das Javascript ausführen soll (dh die Administrationsseite), und auch den Rest der Seite:

add_action('wp_ajax_my_action', 'my_action_callback');
echo 'test2';
function my_action_callback() {
  global $wpdb; // this is how you get access to the database
  $whatever = $_POST['whatever'];
  $whatever += 10;
  echo $whatever;
  die(); // this is required to return a proper result
}

Ich bekomme sowohl die Alert ('test') als auch die echo 'test2', aber nicht die Antwortwarnung. Es gibt keine Javascript-Fehler oder ähnliches. Mein Code läuft definitiv, da ich beide Tests sehen kann, aber warum erhält AJAX keine Antwort? Verschwindet meine PHP-Funktion nach dem Laden der Seite? Vielleicht kann / sollte ich die eingebauten wp AJAX-Funktionen nicht verwenden?

Es wird auch kein leeres Warnfeld angezeigt, es passiert nur nichts.

joon
quelle
Zwei Dinge: 1) Ist ajaxurldefiniert und richtig? 2) Wo sehen Sie das echo 'test2'?
Ryan Kinal
1) Ja (ich habe es überprüft), 2) vor dem Inhalt der Admin-Seite, ganz oben.
Joon
2
Wenn Sie jQuery-Variablen verwechseln, sollten Sie einen konfliktfreien Wrapper verwenden .
Mark Duncan
Mark, danke, ich wusste nichts davon. Dies änderte sich jedoch nicht viel, die Ergebnisse sind die gleichen
joon
Antwort hinzugefügt, bitte kommentieren Sie die Frage, die ich in meiner Antwort aufgeworfen habe.
t31os

Antworten:

10

Beginnen Sie mit einer funktionierenden Codebasis.

add_action('in_admin_header', 'my_ajax_button');

function my_ajax_button() {
    echo '<a href="#ajaxthing" class="myajax">Test</a>';
}

add_action('admin_head', 'my_action_javascript');

function my_action_javascript() {
?>
<script type="text/javascript" >
jQuery(document).ready(function($) {

    $('.myajax').click(function(){
        var data = {
            action: 'my_action',
            whatever: 1234
        };

        // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
        $.post(ajaxurl, data, function(response) {
            alert('Got this from the server: ' + response);
        });
    });


});
</script>
<?php
}

add_action('wp_ajax_my_action', 'my_action_callback');

function my_action_callback() {
     global $wpdb; // this is how you get access to the database

     $whatever = $_POST['whatever'];

     $whatever += 10;

             echo $whatever;

     exit(); // this is required to return a proper result & exit is faster than die();
}

Das ist der Code (mit einer geringfügigen Anpassung) von der Codex-Seite, und das ist vollkommen in Ordnung für mich, daher würde ich vorschlagen, ihn als Ausgangspunkt zu verwenden. Wenn Sie dies ursprünglich getan haben, an welchem ​​Punkt hat er gebrochen oder funktioniert nicht mehr ?

HINWEIS: Mark bin ich, ich verwende ein sekundäres Konto, wenn ich von einem anderen PC auf die Site zugreife (das ist nicht meins).

t31os
quelle
Es funktioniert so lange, bis ich versuche, das Javascript einem Klickschaltflächenereignis anstelle eines Seitenladens hinzuzufügen. Der Code wird ausgeführt, weil ich die Warnung erhalte, aber die Ajax-Funktion verschwindet wahrscheinlich nach dem Laden der Seite.
Joon
Sie haben zuvor Vars gemischt, es funktioniert einwandfrei mit einer Klickfunktion, siehe meinen aktualisierten Code oben (Arbeitsbeispiel).
t31os
Scheint, als hätte ich im aktualisierten Beispiel einen Code verpasst, add_action( 'in_admin_header', 'my_ajax_button' );der oben im Code fehlt , fyi.
Mark Duncan
Ich habe es geschafft, indem ich Ihrem Rat gefolgt bin, danke. Es ist allerdings seltsam, dass ich beide 'Test'-Nachrichten erhalten habe und der Code nicht funktioniert hat, weil ich mir nicht wirklich vorstellen kann, was ich anders mache.
Joon
Wie eingangs gesagt, ich denke, es war nur ein Fall des Mischens von jQuery-Variablen. Sie sollten in Ordnung sein, wenn Sie den oben veröffentlichten No-Conflict-Ansatz verwenden (alles, was in dieser Dokumentbereitschaftsfunktion enthalten ist, kann sicher verwendet werden $). Glücklich geholfen zu haben ..;)
t31os