Utilisation de jQuery pour supprimer les données stockées dans wp_options

10

Je me demande si quelqu'un pourrait me conseiller davantage sur mon problème. Une partie de mon plugin stocke des fichiers journaux à des fins de débogage. J'ai réussi à les afficher dans un (div # log) dans ma page d'administration en utilisant jquery et wp_localise_script. J'ai un bouton pour supprimer ces journaux mais je ne sais pas comment traiter cela. J'ai le sentiment que l'ajax pourrait être utile ici, mais je ne sais pas par où commencer.

Voici les parties pertinentes de mon code:

admin_enqueue_scripts (action)

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

Page Admin

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

Action pour effacer le journal

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

Jusqu'à présent, ce script fonctionne pour afficher tous les fichiers journaux, maintenant tout ce dont j'ai besoin est de les supprimer en cliquant sur #clear_log. Je sais que brancher une do_action sur init les supprimera dès que la page se chargera, rendant mon javascript inutile donc je suppose que la seule option est ajax! Dois-je ajouter une autre référence à wp_localize_script ()? Toute aide serait appréciée.

Tracy
la source
Merci les gars pour toutes vos contributions. Je n'avais jamais pensé à utiliser le nonce pour supprimer les options. Je n'ai pas encore tout à fait réussi mais je pense que c'est dû à quelque chose que j'ai fait, donc j'aurai un bon coup à faire en prenant tout ce que vous avez dit à bord
Tracy
@brasofilo Merci pour votre aimable commentaire. Je crois qu'être descriptif aide les autres à comprendre et à pouvoir vous aider davantage avec votre problème.
Tracy
Hé @Tracy, le nonce n'est qu'une vérification unique pour s'assurer que la demande est valide, c'est-à-dire qu'elle provient de votre site et que vous vouliez le faire. Si vous souhaitez modifier votre message avec le code que vous avez maintenant, je suis sûr que tout le monde serait heureux de jeter un œil.
Andrew Bartel
Désolé pour ça, eu un moment blond là-bas! J'ai réussi ce que je visais. J'ai utilisé ajax sur # debug.click () pour charger les journaux, puis ajax à nouveau sur # clear_log.click () pour supprimer les journaux. Il y a probablement une meilleure méthode (en utilisant 1 appel ajax par exemple) mais maintenant ça marche, je peux tester ces théories. Merci encore pour toutes vos idées!
Tracy

Réponses:

7

Ajax dans WordPress fonctionne en envoyant une publication HTTP à /wp-admin/admin-ajax.php (par défaut) qui déclenche ensuite le hook correspondant. Donc, vous attachez une requête jquery à un événement déclenché par votre bouton de suppression, qui est ensuite publié dans admin-ajax.php, qui a une action, par exemple, delete_my_options (), qui exécute en fait le php à supprimer. Ensuite, vous disposez d'une fonction, appelée rappel, qui s'exécute lorsque la requête ajax est terminée avec succès. Vous pouvez l'utiliser pour atténuer votre div #log par exemple.

En bref, vous avez trois étapes, l'action, l'ajax et le rappel. L'action est déclenchée par un événement DOM et attachée à deux crochets, wp_ajax_ {nom_action} et wp_ajax_nopriv_ {nom_action} (uniquement si vous ne souhaitez pas que des utilisateurs connectés puissent le faire). Ceux-ci se déclenchent lorsque cette action est publiée sur wp-admin / admin-ajax.php. L'ajax est la fonction php (généralement) qui leur est liée. La fonction de rappel est une fonction javascript qui est déclenchée lorsque l'ajax est terminé avec succès.

Pas à pas:

Étape 1, dans votre fichier 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);

}); 

Étape 2, dans votre functions.php ou un plugin

Ajoutez ceci à la fonction à partir de laquelle vous mettez en file d'attente votre javascript: (merci @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' ), ) );

Ajoutez ensuite ceci à votre functions.php ou 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
    }
}

Étape 3, de retour dans votre fichier js

// output will be what is echoed from your ajax, if anything
function clear_log_callback(output) 
{
    jQuery('#log').hide();
}
Andrew Bartel
la source
4
la seule chose que je changerais ici est d'utiliser admin_urlavec wp_localize_scriptpour sortir l' admin-ajax.phpURL, ce n'est pas '/wp-admin/admin-ajax.php'dans de nombreux cas, selon les spécificités de l'installation.
Milo
5
Je laisserais de côté wp_ajax_nopriv_clear_log_action. Pourquoi un visiteur devrait-il être autorisé à effacer le journal? :)
fuxia
2
Eh bien, je voulais que ce soit un exemple général :) Mais, des points très valides, édité le nopriv et mis dans la configuration ajaxurl.
Andrew Bartel
5
De plus, vous devez ajouter un nonce pour empêcher les attaques CSRF. De plus, is_admin () n'est pas une vérification valide pour voir si l'utilisateur est un administrateur, il vérifie si vous êtes dans le chemin wp-admin. Vous devriez donc vraiment vérifier pour voir si current_user_can ('manage_options').
Otto
4
Vous venez de recevoir de bons conseils de trois poids lourds, la réponse est une introduction exemplaire à Ajax, ce code sera copié un nombre incalculable de fois, et je ne me souviens pas avoir vu une première question si bien écrite, bravo à @all :)
brasofilo