Usando jQuery para borrar datos almacenados en wp_options

10

Me pregunto si alguien podría aconsejarme sobre mi problema. Parte de mi complemento almacena los archivos de registro para fines de depuración. Los he exhibido exitosamente en un (div # registro) en mi página de administración usando jquery y wp_localise_script. Tengo un botón para eliminar estos registros pero no estoy seguro de cómo procesar esto. Tengo la sensación de que ajax puede ser útil aquí, pero no estoy seguro de por dónde empezar.

Aquí están las partes relevantes de mi código:

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

Página de administración

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

Acción para borrar el 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');

Hasta ahora, esta secuencia de comandos está trabajando para mostrar todos los archivos de registro, ahora todo lo que necesito es eliminarlos al hacer clic en #clear_log. Sé que conectar un do_action en init los eliminará tan pronto como se cargue la página, haciendo que mi javascript sea inútil, así que supongo que la única opción es ajax. ¿Necesito agregar otra referencia a wp_localize_script ()? Cualquier ayuda sería apreciada.

    
pregunta Tracy 22.04.2013 - 22:58

1 respuesta

7

Ajax en WordPress funciona mediante el envío de una publicación HTTP a /wp-admin/admin-ajax.php (por defecto) que luego dispara el gancho correspondiente. Por lo tanto, adjunta algunos jQuery a un evento desencadenado por su botón de eliminar, que luego publica en admin-ajax.php, que tiene una acción, por ejemplo, delete_my_options (), que en realidad ejecuta el php para eliminar. Luego, tiene una función, llamada devolución de llamada, que se ejecuta al completar con éxito la solicitud ajax. Podría usar esto para desvanecer su #log div out, por ejemplo.

En resumen, tiene tres pasos, la acción, el ajax y la devolución de llamada. La acción se desencadena mediante un evento DOM y se adjunta a dos enlaces, wp_ajax_ {action_name} y wp_ajax_nopriv_ {action_name} (solo si no desea que los usuarios registrados puedan hacerlo). Se activan cuando la acción se publica en wp-admin / admin-ajax.php. El ajax es la función php (generalmente) enganchada a ellos. La función de devolución de llamada es una función javascript que se activa cuando el ajax se completa con éxito.

Paso a paso:

Paso 1, en tu archivo 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);

}); 

Paso 2, en tus funciones.php o un complemento

Agregue esto a la función desde la que pone en cola su javascript: (gracias @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' ), ) );

Luego agrega esto a tus funciones.php o complemento:

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

Paso 3, vuelve a tu archivo js

// output will be what is echoed from your ajax, if anything
function clear_log_callback(output) 
{
    jQuery('#log').hide();
}
    
respondido por el Andrew Bartel 22.04.2013 - 23:25

Lea otras preguntas en las etiquetas