Użycie jQuery do usunięcia danych przechowywanych w wp_options


10

Zastanawiam się, czy ktokolwiek mógłby mi doradzić w sprawie mojego problemu. Część mojej wtyczki przechowuje pliki dziennika do celów debugowania. Udało mi się wyświetlić je w (div # log) na mojej stronie administratora przy użyciu jquery i wp_localise_script. Mam przycisk do usunięcia tych dzienników, ale nie jestem pewien, jak to przetworzyć. Mam wrażenie, że ajax może się tu przydać, ale nie jestem pewien, od czego zacząć.

Oto odpowiednie części mojego kodu:

admin_enqueue_scripts (akcja)

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

Strona administratora

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

Działanie w celu wyczyszczenia dziennika

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

Jak dotąd ten skrypt działa, aby wyświetlić wszystkie pliki dziennika, teraz wystarczy, że je usunę, klikając #clear_log. Wiem, że podłączenie do okazji do init usunie je, gdy tylko strona się załaduje, dzięki czemu mój javascript będzie bezużyteczny, więc sądzę, że jedyną opcją jest ajax! Czy muszę dodać kolejne odwołanie do wp_localize_script ()? Każda pomoc będzie mile widziana.


Dzięki chłopaki za cały wasz wkład. Nigdy nie myślałem o użyciu tej opcji do usunięcia opcji. Nie mam jeszcze tego do roboty, ale uważam, że jest to związane z czymś, co zrobiłem, więc będę się dobrze bawić, biorąc wszystko, co powiedziałeś na pokładzie
Tracy

@brasofilo Dziękuję za miły komentarz. Wierzę, że opisowość pomaga innym zrozumieć i być w stanie pomóc ci w rozwiązaniu twojego problemu.
Tracy,

Hej @Tracy, nonce to tylko jednorazowa kontrola, aby upewnić się, że żądanie jest prawidłowe, tzn. Pochodzi z Twojej witryny i chciałeś to zrobić. Jeśli chcesz edytować swój post za pomocą kodu, który masz teraz, jestem pewien, że wszyscy chętnie się obejrzą.
Andrew Bartel,

Przepraszam za to, miałem tam blond chwilę! Z powodzeniem ukończyłem to, co chciałem zrobić. Użyłem ajax na # debug.click (), aby załadować dzienniki, a następnie ajax na # clear_log.click (), aby usunąć dzienniki. Prawdopodobnie istnieje lepsza metoda (na przykład przy użyciu wywołania 1 ajax), ale teraz działa, mogę przetestować te teorie. Jeszcze raz dziękuję za wszystkie informacje!
Tracy,

Odpowiedzi:


7

Ajax w WordPress działa, wysyłając post HTTP do /wp-admin/admin-ajax.php (domyślnie), który następnie odpala odpowiedni hak. Tak więc dołączasz trochę jquery do zdarzenia wywołanego przez twój przycisk usuwania, który następnie publikuje na admin-ajax.php, który ma akcję, powiedzmy, delete_my_options (), która faktycznie uruchamia php do usunięcia. Następnie masz funkcję o nazwie callback, która działa po pomyślnym zakończeniu żądania ajax. Możesz to wykorzystać na przykład do zaniknięcia swojego #log div.

Krótko mówiąc, masz trzy kroki: akcję, ajax i wywołanie zwrotne. Akcja jest wyzwalana przez zdarzenie DOM i dołączona do dwóch podpórek, wp_ajax_ {nazwa_działania} i wp_ajax_nopriv_ {nazwa_działania} (tylko jeśli nie chcesz, aby zalogowani użytkownicy mogli to zrobić). Uruchamiają się, gdy akcja zostanie wysłana do wp-admin / admin-ajax.php. Ajax jest podpiętą do nich funkcją php (zwykle). Funkcja zwrotna to funkcja javascript, która jest uruchamiana po pomyślnym ukończeniu ajax.

Krok po kroku:

Krok 1, w pliku 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);

}); 

Krok 2, w pliku functions.php lub we wtyczce

Dodaj to do funkcji, z której kolejkujesz swój javascript: (dzięki @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' ), ) );

Następnie dodaj to do swojego functions.php lub wtyczki:

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

Krok 3, z powrotem w pliku js

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

4
jedyną rzeczą, którą chciałbym zmienić tutaj jest użycie admin_urlw wp_localize_scriptcelu wyjścia z admin-ajax.phpURL, nie jest to '/wp-admin/admin-ajax.php'w wielu przypadkach, w zależności od specyfiki zainstalować.
Milo

5
Pominąłbym wp_ajax_nopriv_clear_log_action. Dlaczego każdy odwiedzający powinien mieć możliwość wyczyszczenia dziennika? :)
fuxia

2
Cóż, chciałem, żeby to był ogólny przykład :) Ale, bardzo ważne punkty, wyedytowałem nopriv i umieściłem w konfiguracji ajaxurl.
Andrew Bartel,

5
Dodatkowo należy dodać nonce, aby zapobiec atakom CSRF. Ponadto, is_admin () nie jest poprawnym sprawdzeniem, czy użytkownik jest administratorem, sprawdza, czy jesteś na ścieżce wp-admin. Więc naprawdę powinieneś sprawdzić, czy current_user_can ('manage_options').
Otto

4
Właśnie otrzymałeś świetną radę od trzech dużych ciężarów, Odpowiedź to przykładowe wprowadzenie do Ajaxu, ten kod zostanie skopiowany wklejony niezliczoną ilość razy, i nie pamiętam, żeby zobaczyłem pierwsze tak dobrze napisane pytanie,
podziękowania dla wszystkich
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.