Usando jQuery para eliminar datos almacenados en wp_options

10

Me pregunto si alguien podría aconsejarme más sobre mi problema. Parte de mi complemento almacena archivos de registro con fines de depuración. Los he mostrado con éxito en un (div # log) 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 podría 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 (acción)

 $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 administrador

<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, este script 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.

Tracy
fuente
Gracias a todos por su aporte. Nunca había pensado en usar el nonce para eliminar las opciones. Todavía no lo tengo funcionando pero creo que se debe a algo que he hecho, así que tendré una buena fiesta tomando todo lo que has dicho a bordo
Tracy
@brasofilo Gracias por su amable comentario. Creo que ser descriptivo ayuda a otros a entender y poder ayudarlo con su problema más.
Tracy
Hola @Tracy, el nonce es solo una verificación única para asegurarse de que la solicitud sea válida, es decir, vino de su sitio y tenía la intención de hacerlo. Si quieres editar tu publicación con el código que tienes ahora, estoy seguro de que todos estarán felices de echar un vistazo.
Andrew Bartel
Lo siento, tuve un momento rubio allí! He completado con éxito lo que pretendía hacer. Usé ajax en # debug.click () para cargar los registros y luego ajax nuevamente en # clear_log.click () para eliminar los registros. Probablemente haya un mejor método (usando 1 llamada ajax, por ejemplo), pero ahora está funcionando, puedo probar estas teorías. Gracias de nuevo por toda su comprensión!
Tracy

Respuestas:

7

Ajax en WordPress funciona enviando una publicación HTTP a /wp-admin/admin-ajax.php (por defecto) que luego activa el enlace correspondiente. Entonces, adjuntas un poco de jquery a un evento activado por tu botón de eliminación, que luego se publica en admin-ajax.php, que tiene una acción, por ejemplo, delete_my_options (), que realmente 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, por ejemplo.

En resumen, tiene tres pasos, la acción, el ajax y la devolución de llamada. La acción se desencadena por un evento DOM y se adjunta a dos ganchos, wp_ajax_ {action_name} y wp_ajax_nopriv_ {action_name} (solo si no desea que ningún usuario conectado pueda hacerlo). Estos disparan cuando esa acción se publica en wp-admin / admin-ajax.php. El ajax es la función php (generalmente) conectada a ellos. La función de devolución de llamada es una función de 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 tu functions.php o un complemento

Agregue esto a la función de la que obtiene 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 agregue esto a su functions.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
    }
}

Paso 3, de vuelta en tu archivo js

// output will be what is echoed from your ajax, if anything
function clear_log_callback(output) 
{
    jQuery('#log').hide();
}
Andrew Bartel
fuente
44
la única cosa que cambiaría aquí es utilizar admin_urlcon wp_localize_scriptla salida de la admin-ajax.phpURL, no es '/wp-admin/admin-ajax.php'en muchos casos, dependiendo de la instalación específicos.
Milo
55
Me dejaría fuera wp_ajax_nopriv_clear_log_action. ¿Por qué se debe permitir a cualquier visitante borrar el registro? :)
fuxia
2
Bueno, quería que fuera un ejemplo general :) Pero, puntos muy válidos, edité el nopriv y lo instalé en la configuración de ajaxurl.
Andrew Bartel
55
Además, debe agregar un nonce para evitar ataques CSRF. Además, is_admin () no es una verificación válida para ver si el usuario es administrador, verifica si está en la ruta wp-admin. Por lo tanto, debería verificar si current_user_can ('manage_options').
Otto
44
Acabas de recibir un gran consejo de tres pesos pesados, la respuesta es una introducción ejemplar a Ajax, este código se copiará pegado innumerables veces, y no recuerdo haber visto una primera pregunta tan bien escrita, felicitaciones a @todo :)
brasofilo