Verwenden von jQuery zum Löschen von in wp_options gespeicherten Daten

10

Ich frage mich, ob mich jemand zu meinem Problem weiter beraten könnte. Ein Teil meines Plugins speichert Protokolldateien für Debugging-Zwecke. Ich habe sie erfolgreich in einem (div # log) auf meiner Admin-Seite mit jquery und wp_localise_script angezeigt. Ich habe eine Schaltfläche zum Löschen dieser Protokolle, bin mir jedoch nicht sicher, wie ich das verarbeiten soll. Ich habe das Gefühl, dass Ajax hier nützlich sein könnte, bin mir aber nicht sicher, wo ich anfangen soll.

Hier sind die relevanten Teile meines Codes:

admin_enqueue_scripts (Aktion)

 $args = array(get_option('wow_tweets_log'));//log files fetched from wp_options table    
    wp_enqueue_script('wow_tweet');//registered earlier on with jQuery dependency
    wp_localize_script('wow_tweet', 'wow_vars', $args);

Administrator Seite

<tr><th scope="row"><strong>Debugging</strong></th><td>
    <div id="debug" class="button-primary">Debug</div><!--debug button shows logs-->
    <div id="hide_debug" class="button-secondary">Hide</div><!--debug button hides logs-->
    <div id="clear_log" class="button-secondary">Empty Log</div><!--Press to delete logs-->
</td></tr>
<tr><th scope="row"></th><td><div id="log"><!--Logs show here--></div></td></tr>

Javascript

jQuery(document).ready(function() { 

    var debug_show = jQuery('#log').hide();//hides log by default

    jQuery('#debug').click(function(){//on click shows logs files in div#log
        for (var i = 0, l = wow_vars.length; i < l; i++) {
            var data = wow_vars[i];
        }
        jQuery('#log').show().html(data);

    });
    jQuery('#hide_debug').click(function()
    {
        debug_show.hide();
    }); 
});

Aktion zum Löschen des Protokolls

 function clear_log(){
    delete_option('wow_tweets_log');//am stuck on how to invoke this

    /*die();  would go at the end if ajax used*/
 }
 add_action('clear_log','clear_log');

Bisher zeigt dieses Skript alle Protokolldateien an. Jetzt muss ich sie nur noch löschen, wenn ich auf #clear_log klicke. Ich weiß, dass durch das Einfügen einer do_action in init diese gelöscht werden, sobald die Seite geladen wird, wodurch mein Javascript unbrauchbar wird. Ich denke, die einzige Option ist Ajax! Muss ich einen weiteren Verweis auf wp_localize_script () hinzufügen? Jede Hilfe wäre dankbar.

Tracy
quelle
Vielen Dank für all Ihre Beiträge. Ich hatte nie darüber nachgedacht, die Optionen mit dem Nonce zu löschen. Ich habe es noch nicht ganz zum Laufen gebracht, aber ich denke, es liegt an etwas, das ich getan habe, also werde ich eine gute Chance haben, alles zu nehmen, was Sie an Bord gesagt haben
Tracy
@brasofilo Danke für deinen freundlichen Kommentar. Ich glaube, beschreibend zu sein hilft anderen, Ihr Problem besser zu verstehen und Ihnen besser helfen zu können.
Tracy
Hey @Tracy, die Nonce ist nur eine einmalige Überprüfung, um sicherzustellen, dass die Anfrage gültig ist, dh von Ihrer Website stammt und Sie dies beabsichtigt haben. Wenn Sie Ihren Beitrag mit dem Code bearbeiten möchten, den Sie jetzt haben, würde sicher jeder gerne einen Blick darauf werfen.
Andrew Bartel
Tut mir leid, hatte einen blonden Moment dort! Ich habe erfolgreich abgeschlossen, was ich vorhatte. Ich habe ajax auf # debug.click () verwendet, um die Protokolle zu laden, und ajax erneut auf # clear_log.click (), um die Protokolle zu entfernen. Es gibt wahrscheinlich eine bessere Methode (zum Beispiel mit 1 Ajax-Aufruf), aber jetzt funktioniert es. Ich kann diese Theorien testen. Nochmals vielen Dank für all Ihre Erkenntnisse!
Tracy

Antworten:

7

Ajax in WordPress sendet einen HTTP-Beitrag an /wp-admin/admin-ajax.php (standardmäßig), der dann den entsprechenden Hook auslöst. Sie hängen also eine Abfrage an ein Ereignis an, das von Ihrer Löschtaste ausgelöst wird. Diese wird dann in admin-ajax.php veröffentlicht, das eine Aktion enthält, z. B. delete_my_options (), mit der das zu löschende PHP ausgeführt wird. Dann haben Sie eine Funktion, die als Rückruf bezeichnet wird und nach erfolgreichem Abschluss der Ajax-Anforderung ausgeführt wird. Sie können dies beispielsweise verwenden, um Ihr # log div auszublenden.

Kurz gesagt, Sie haben drei Schritte: die Aktion, den Ajax und den Rückruf. Die Aktion wird durch ein DOM-Ereignis ausgelöst und an zwei Hooks angehängt, wp_ajax_ {Aktionsname} und wp_ajax_nopriv_ {Aktionsname} (nur wenn Sie möchten, dass keine angemeldeten Benutzer dies tun können). Diese werden ausgelöst, wenn diese Aktion in wp-admin / admin-ajax.php veröffentlicht wird. Der Ajax ist die (normalerweise) mit ihnen verbundene PHP-Funktion. Die Rückruffunktion ist eine Javascript-Funktion, die ausgelöst wird, wenn der Ajax erfolgreich abgeschlossen wurde.

Schritt für Schritt:

Schritt 1 in Ihrer js-Datei

jQuery('#hide_debug').click(function()
{
    var data = {};
    data.action = 'clear_log_action';
    data.options_delete_nonce = ajax_object.options_delete_nonce;
    jQuery.post(ajax_object.ajax_url, data, clear_log_callback);

}); 

Schritt 2, in Ihrer functions.php oder einem Plugin

Fügen Sie dies zu der Funktion hinzu, von der Sie Ihr Javascript in die Warteschlange stellen: (danke @Milo)

wp_localize_script( 'my_js_file_name', 'ajax_object', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ,   'options_delete_nonce' => wp_create_nonce( 'options_delete_nonce' ), ) );

Dann füge dies deiner functions.php oder deinem Plugin hinzu:

// Edit: removed the nopriv hook (Thanks @toscho)
add_action('wp_ajax_clear_log_action','clear_log_ajax'); // attach your data.action to wp_ajax and wp_ajax_nopriv and hook your php function
function clear_log_ajax() {
    $nonce = $_POST['options_delete_nonce'];
    // Edit: Added nonces and permissions check (Thanks @Otto)
    if( wp_verify_nonce( $nonce, 'options_delete_nonce' ) && current_user_can( 'manage_options' ) ) {
        delete_option('wow_tweets_log');
        die(); // make sure to put a die() or exit() at the end of your ajax
    }
}

Schritt 3, zurück in Ihre js-Datei

// output will be what is echoed from your ajax, if anything
function clear_log_callback(output) 
{
    jQuery('#log').hide();
}
Andrew Bartel
quelle
4
Das einzige, was ich hier ändern würde, ist die Ausgabe admin_urlmit, wp_localize_scriptum die admin-ajax.phpURL auszugeben. Dies ist '/wp-admin/admin-ajax.php'in vielen Fällen nicht der Fall, abhängig von den Installationsspezifikationen.
Milo
5
Ich würde weglassen wp_ajax_nopriv_clear_log_action. Warum sollte ein Besucher das Protokoll löschen dürfen? :)
Fuxia
2
Nun, ich wollte, dass es ein allgemeines Beispiel ist :) Aber sehr gültige Punkte, bearbeitete das Nopriv und fügte das Ajaxurl-Setup ein.
Andrew Bartel
5
Darüber hinaus sollten Sie eine Nonce hinzufügen, um CSRF-Angriffe zu verhindern. Außerdem ist is_admin () keine gültige Überprüfung, um festzustellen, ob der Benutzer ein Administrator ist. Es wird überprüft, ob Sie sich im Pfad wp-admin befinden. Sie sollten also wirklich prüfen, ob current_user_can ('manage_options').
Otto
4
Sie haben gerade gute Ratschläge von drei schweren Gewichten erhalten. Die Antwort ist ein beispielhaftes Intro zu Ajax. Dieser Code wird unzählige Male kopiert und ich kann mich nicht erinnern, eine erste Frage so gut geschrieben gesehen zu haben. Ein großes
Lob