7

我一直在努力解决这个问题已经有一段时间了。我有一个主题的选项页面,并注册了一个选项。

每次用户按下保存按钮时,我一直在尝试通过 ajax 更新选项,这是我的代码。

JS:

       function save_main_options_ajax() {

        $('.main-options-form').submit( function () { 

            var b       =  $(this).serialize(),
                optdata =  { action : "wp_ajax_main_options_save", data: b };

            $.post( ajaxurl, b, function (response) {
                if (response == 1 ) { alert('sucess'); }
                else { alert(optdata);}
            });
            return false;               
        });
    }
save_main_options_ajax();

php:

 function main_options_save_ajax() { 

        check_ajax_referer('_wpnonce', '_wpnonce' );

        $data = $_POST;
        unset($data['option_page'], $data['action'], $data['_wpnonce'], $data['_wp_http_referer']);


        if ( update_option('main_options', $data ) )
        { die(1); }
        else { die (0); }           
}
add_action('wp_ajax_main_options_save', 'main_options_save_ajax' );

我在萤火虫中看到的响应是 0。我不确定我在这里缺少什么,我已经尝试了一些变化,但似乎没有任何效果。

4

2 回答 2

11

在使用设置 API 时,找到了一种通过 ajax 保存设置的方法。

我在代码中犯的主要错误是我使用了错误的 url 路径。

ajaxurl而不是使用在 wordpress 中进行 ajax 调用时通常使用的标准;我们使用您的设置 api 表单的操作调用,即options.php.

因为我们使用这个 url 路径,所以不需要 php 函数来处理请求,因为 options.php 会为我们处理所有这些。

因此,我们只需要处理在我的实例中看起来像这样的 js 函数。

 function save_main_options_ajax() {
           $('.main-options-form').submit( function () {
                var b =  $(this).serialize();
                $.post( 'options.php', b ).error( 
                    function() {
                        alert('error');
                    }).success( function() {
                        alert('success');   
                    });
                    return false;    
                });
            }
 save_main_options_ajax();

就是这样,保存后我得到了成功警报,我的选项被保存了。

注意:我只注意到一个特点。在完成POST请求并显示成功警报后,该页面会GET请求您的选项页面的页面版本,该页面版本已将参数&settings-updated=true添加到 url 的末尾。

我不知道这是否值得担心,我没有遇到任何问题,但从长远来看,这可能是需要考虑的事情。

于 2012-08-10T20:17:25.053 回答
2

尝试将 action value 从 更改wp_ajax_main_options_savemain_options_save。Wordpress 会wp_ajax_自动将前缀添加到您的操作值中,例如wp_ajax_{your_posted_action}.

在此处阅读 5 个出色的提示,了解更多最佳实践。

于 2012-08-08T04:21:14.053 回答