Utilizzo di jQuery per eliminare i dati memorizzati in wp_options


10

Mi chiedo se qualcuno potrebbe consigliarmi ulteriormente sul mio problema. Parte del mio plugin memorizza i file di registro a scopo di debug. Li ho visualizzati con successo in un (registro div #) nella mia pagina di amministrazione usando jquery e wp_localise_script. Ho un pulsante per eliminare questi registri ma non sono sicuro su come elaborarlo. Ho la sensazione che Ajax potrebbe tornare utile qui, ma non sono sicuro da dove cominciare.

Ecco le parti rilevanti del mio codice:

admin_enqueue_scripts (azione)

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

Pagina di amministrazione

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

Azione per cancellare il registro

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

Finora questo script funziona per mostrare tutti i file di registro, ora tutto ciò di cui ho bisogno è eliminarli quando faccio clic su #clear_log. So che collegare un do_action su init li cancellerà non appena la pagina viene caricata, rendendo il mio javascript inutile, quindi immagino che l'unica opzione sia ajax! Devo aggiungere un altro riferimento a wp_localize_script ()? Qualsiasi aiuto sarebbe apprezzato.


Grazie ragazzi per tutto il vostro contributo. Non avevo mai pensato di usare il nonce per cancellare le opzioni. Non riesco ancora a farlo funzionare, ma credo che dipenda da qualcosa che ho fatto, quindi avrò una buona impressione prendendo tutto ciò che hai detto a bordo
Tracy,

@brasofilo Grazie per il tuo gentile commento. Credo che essere descrittivo aiuti gli altri a capire e ad aiutarti di più con il tuo problema.
Tracy,

Ehi @Tracy, il nonce è solo un controllo una tantum per assicurarsi che la richiesta sia valida, cioè provenga dal tuo sito e intendevi farlo. Se vuoi modificare il tuo post con il codice che hai ora sono sicuro che tutti sarebbero felici di dare un'occhiata.
Andrew Bartel,

Mi dispiace, ho avuto un momento biondo lì! Ho completato con successo quello che volevo fare. Ho usato Ajax su # debug.click () per caricare i registri, quindi Ajax di nuovo su # clear_log.click () per rimuovere i registri. Esiste probabilmente un metodo migliore là fuori (usando ad esempio 1 chiamata ajax) ma ora funziona posso testare queste teorie. Grazie ancora per tutte le tue intuizioni!
Tracy,

Risposte:


7

Ajax in WordPress funziona inviando un post HTTP a /wp-admin/admin-ajax.php (per impostazione predefinita) che quindi attiva l'hook corrispondente. Quindi, allega un po 'di jquery a un evento attivato dal tuo pulsante di eliminazione, che quindi pubblica in admin-ajax.php, che ha un'azione, diciamo, delete_my_options (), che esegue effettivamente il php per eliminare. Quindi, si dispone di una funzione, chiamata callback, che viene eseguita al completamento corretto della richiesta Ajax. Puoi usarlo per sbiadire il tuo div #log per esempio.

In breve, hai tre passaggi, l'azione, l'ajax e il callback. L'azione è innescata da un evento DOM e collegata a due hook, wp_ajax_ {nome_azione} e wp_ajax_nopriv_ {nome_azione} (solo se non si desidera che nessun utente connesso sia in grado di farlo). Questi vengono attivati ​​quando l'azione viene pubblicata su wp-admin / admin-ajax.php. L'ajax è la funzione php (solitamente) ad essi collegata. La funzione di callback è una funzione javascript che viene attivata quando ajax viene completato correttamente.

Passo dopo passo:

Passaggio 1, nel file js

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

}); 

Step 2, nel tuo Functions.php o un plugin

Aggiungi questo alla funzione da cui accoda il tuo javascript da: (grazie @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' ), ) );

Quindi aggiungi questo al tuo function.php o plugin:

// 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
    }
}

Passo 3, torna nel tuo file js

// output will be what is echoed from your ajax, if anything
function clear_log_callback(output) 
{
    jQuery('#log').hide();
}

4
l'unica cosa che vorrei cambiare qui è usare admin_urlcon wp_localize_scriptper generare l' admin-ajax.phpURL, non è '/wp-admin/admin-ajax.php'in molti casi, a seconda delle specifiche di installazione.
Milo,

5
Vorrei lasciare fuori wp_ajax_nopriv_clear_log_action. Perché un visitatore dovrebbe essere autorizzato a cancellare il registro? :)
fuxia

2
Beh, volevo che fosse un esempio generale :) Ma, punti molto validi, ho modificato la nopriv e inserito il set ajaxurl.
Andrew Bartel,

5
Inoltre, è necessario aggiungere un nonce per prevenire attacchi CSRF. Inoltre, is_admin () non è un controllo valido per vedere se l'utente è un amministratore, controlla se sei nel percorso wp-admin. Quindi dovresti davvero controllare per vedere se current_user_can ('manage_options').
Otto,

4
Hai appena ricevuto ottimi consigli da tre pesi pesanti, la risposta è un'introduzione esemplare all'Ajax, questo codice verrà copiato innumerevoli volte e non ricordo di aver visto una prima domanda scritta così bene, complimenti a @all :)
brasofilo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.