Використання jQuery для видалення даних, збережених у wp_options


10

Цікаво, чи міг би хтось порадити мене далі щодо моєї проблеми. Частина мого плагіна зберігає файли журналів для налагодження. Я успішно відобразив їх у (div # log) на своїй сторінці адміністратора за допомогою jquery та wp_localise_script. У мене є кнопка для видалення цих журналів, але я не знаю, як це обробити. У мене є відчуття, що аякс може стати тут у нагоді, але не знаю, з чого почати.

Ось відповідні частини мого коду:

admin_enqueue_scripts (дія)

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

Сторінка адміністратора

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

Дія для очищення журналу

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

Поки цей сценарій працює над тим, щоб показати всі файли журналу, тепер все, що мені потрібно, - це видалити їх при натисканні на #clear_log. Я знаю, що підключення до запуску до init видалить їх, як тільки сторінка завантажиться, що зробить мій JavaScript непотрібним, тому, мабуть, єдиний варіант - ajax! Чи потрібно мені додати ще одне посилання на wp_localize_script ()? Будь-яка допомога буде вдячна.


Дякую хлопцям за весь ваш внесок. Я ніколи не замислювався про те, щоб скористатися nonce для видалення параметрів. У мене це ще не зовсім працює, але я вважаю, що це все, що я зробив, тому я буду добре бавитись, приймаючи все, що ви сказали на борту
Трейсі

@brasofilo Дякую за добрий коментар. Я вважаю, що описовий характер допомагає іншим зрозуміти та змогти більше допомогти вам у вирішенні вашої проблеми.
Трейсі

Привіт @ Трація, це лише один раз перевірка, щоб переконатися, що запит дійсний, тобто прийшов з вашого сайту, і ви мали намір це зробити. Якщо ви хочете відредагувати свою публікацію за допомогою коду, який ви маєте зараз, я впевнений, що всі будуть раді поглянути.
Ендрю Бартель

Вибачте з цього приводу, був там білявий момент! Я успішно завершив те, що мав на меті зробити. Я використовував ajax на # debug.click () для завантаження журналів, потім ajax знову на # clear_log.click () для видалення журналів. Мабуть, є кращий метод там (наприклад, 1 виклик Ajax), але зараз він працює, я можу перевірити ці теорії. Ще раз дякую за все ваше розуміння!
Трейсі

Відповіді:


7

Ajax у WordPress працює, надсилаючи повідомлення HTTP на /wp-admin/admin-ajax.php (за замовчуванням), після чого запускає відповідний гак. Отже, ви додаєте деякий jquery до події, викликаної вашою кнопкою видалення, яка потім публікує адресу admin-ajax.php, який має дію, скажімо, delete_my_options (), яка фактично запускає php для видалення. Потім у вас є функція, яка називається зворотним викликом, яка працює при успішному виконанні запиту ajax. Ви можете використовувати це, наприклад, для вимкнення вашого #log div.

Коротше кажучи, у вас є три кроки: дія, аякс та зворотний виклик. Дія ініціюється подією DOM і приєднується до двох гаків, wp_ajax_ {action_name} та wp_ajax_nopriv_ {action_name} (лише якщо ви не бажаєте, щоб користувачі, які ввійшли в систему, не могли це зробити). Цей запуск, коли ця дія розміщена на wp-admin / admin-ajax.php. Аякс - це функція php (зазвичай), підключена до них. Функція зворотного дзвінка - це функція javascript, яка запускається після успішного завершення програми ajax.

Крок за кроком:

Крок 1, у вашому 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);

}); 

Крок 2, у ваших функцій.php або плагіні

Додайте це до функції, за допомогою якої ви отримуєте javascript: (спасибі @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' ), ) );

Потім додайте це до своїх функцій.php або плагіна:

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

Крок 3, поверніться у файл js

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

4
одна річ , яку я хотів би змінити тут , щоб використовувати admin_urlз wp_localize_scriptдля виведення admin-ajax.phpURL, це не '/wp-admin/admin-ajax.php'в багатьох випадках, в залежності від установки конкретики.
Міло

5
Я б покинув wp_ajax_nopriv_clear_log_action. Чому будь-якому відвідувачеві слід дозволити очищати журнал? :)
fuxia

2
Ну, я хотів, щоб це був загальний приклад :) Але, дуже вагомі пункти, відредагував nopriv і поставив в налаштування ajaxurl.
Ендрю Бартель

5
Додатково вам слід додати, щоб запобігти атак CSRF. Крім того, is_admin () не є дійсною перевіркою, чи є користувач адміністратором, він перевіряє, чи перебуваєте ви в шляху wp-admin. Тож вам слід перевірити, чи є current_user_can ('управляти_опції').
Отто

4
Ви щойно отримали чудові поради з трьох важких ваг, Відповідь - це зразковий вступ до Ajax, цей код буде копіюватися безлічі разів, і я не пам’ятаю, щоб побачити перше Питання так добре написане, кудо на @all :)
brasofilo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.