问题描述

我想知道有没有人可以就我的问题进一步告诉我。我的插件的一部分存储日志文件进行调试。我已经使用 jquery 和 wp_localise_script 在我的管理页面中的 (div#log) 中成功显示了它们。我有一个按钮来删除这些日志,但我不确定如何处理这个。我有一种感觉,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 时删除它们。我知道在 init 上插入一个 do_action 将会在页面加载后立即删除它们,这样我的 javascript 就没用了,所以我猜只有这个选项是 ajax!我需要添加另一个参考到 wp_localize_script() 吗?任何帮助将不胜感激。

最佳解决方案

WordPress 中的 Ajax 通过发送 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();
}

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。