web-dev-qa-db-fra.com

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

Je me demande si quelqu'un pourrait me conseiller davantage sur mon problème. Une partie de mon plugin stocke les fichiers journaux à des fins de débogage. Je les ai affichées avec succès dans un journal (div # log) de 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 le traiter. 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 permet d'afficher tous les fichiers journaux. Tout ce dont j'ai besoin, c'est de les supprimer en cliquant sur #clear_log. Je sais que brancher un do_action sur init les supprimera dès le chargement de la page, 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.

10
Tracy

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 un jquery à un événement déclenché par votre bouton de suppression, qui est ensuite publié sur admin-ajax.php, qui a une action, par exemple delete_my_options (), qui exécute le php à supprimer. Ensuite, vous avez une fonction, appelée callback, qui s'exécute en cas de réussite de la demande ajax. Vous pouvez utiliser ceci pour fondre votre #log div 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 points d'ancrage, wp_ajax_ {nom_action} et wp_ajax_nopriv_ {nom_action} (uniquement si vous souhaitez qu'aucun utilisateur connecté ne puisse le faire). Ceux-ci se déclenchent lorsque cette action est publiée dans wp-admin/admin-ajax.php. Le ajax est la fonction php (généralement) accrochée à eux. 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 à votre 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, retour dans votre fichier js

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