Использование jQuery для удаления данных, хранящихся в wp_options

10

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

Вот соответствующие части моего кода:

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. Я знаю, что подключение do_action к init удалит их, как только загрузится страница, что сделает мой javascript бесполезным, поэтому я предполагаю, что единственным вариантом является ajax! Нужно ли добавить еще одну ссылку на wp_localize_script ()? Любая помощь будет оценена.

Tracy
источник
Спасибо, ребята, за ваш вклад. Я никогда не думал об использовании одноразового номера для удаления параметров. У меня пока не получилось, чтобы это сработало, но я считаю, что это связано с чем-то, что я сделал, поэтому у меня будет хороший толчок к этому, принимая все, что вы сказали на доске
Трейси,
@brasofilo Спасибо за ваш добрый комментарий. Я считаю, что описательность помогает другим понять и помочь вам в решении вашей проблемы.
Трейси
Эй, @Tracy, это одноразовая проверка, чтобы убедиться, что запрос действителен, т.е. пришел с вашего сайта, и вы намеревались это сделать. Если вы хотите отредактировать свой пост с помощью имеющегося у вас кода, я уверен, что все будут рады взглянуть.
Эндрю Бартел
Извините за это, был момент блондинки там! Я успешно выполнил то, что хотел сделать. Я использовал 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.

Короче говоря, у вас есть три шага: действие, ajax и обратный вызов. Действие запускается событием DOM и прикрепляется к двум хукам, wp_ajax_ {action_name} и wp_ajax_nopriv_ {action_name} (только если вы не хотите, чтобы это делали зарегистрированные пользователи). Они запускаются, когда это действие публикуется в wp-admin / admin-ajax.php. Ajax - это функция 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, в вашем functions.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' ), ) );

Затем добавьте это в ваш functions.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 ('manage_options').
Отто
4
Вы только что получили хороший совет от трех тяжеловесов, Ответ - примерное введение в Ajax, этот код будет скопирован бесчисленное количество раз, и я не помню, чтобы первый Вопрос был так хорошо написан, слава @all :)
brasofilo