通过 ajax 更新 WordPress JSON 数据

Update WordPress JSON data via ajax

我正在使用 WP Rest API 插件和 ACF to REST API 插件以及高级自定义字段。我有一个中继器设置有 2 个复选框和一个文本字段。我可以通过提交按钮更新数据库中的复选框,但希望能够通过 ajax 进行更新,因此当用户更改复选框时,它会在数据库中更新。我觉得我错过了一些基本的改变,但什么也没发生。我没有收到任何错误,但数据库未更新。当我 console.log 数据时,我看到那里的一切。这是我第一次去 ajax,我觉得我真的很接近!

HTML:

<form id="todo-form">
 <div class="todos-list"></div>
</form>
<script>
  var post_id = '<?php echo the_ID(); ?>';
</script>

jQuery:

var ajaxURL = 'http://'+window.location.host+'/wp-json/wp/v2/client/'+post_id;
$.getJSON(ajaxURL, function(data) {
    console.log(data);
    var output = '<ul class="todo-list">;
    $.each(data.acf.todo_list, function(key, val){
        if(data.acf.todo_list[key].todo_checkbox == true)
            checked = 'checked';
        } else {
            checked = '';
        }
        output += '<li>';
        output += '<input type="checkbox" class="todo-checkbox check" name="fields[todo_list]['+ key +'][todo_checkbox]" value="1" '+checked+' />';
        output += '<input type="checkbox" class="todo-checkbox hide" name="fields[todo_list]['+ key +'][todo_checkbox]" value="0" />';
        output += '<textarea name="fields[todo_list]['+ key +'][todo_item]">'+ data.acf.todo_list[key].todo_item +'</textarea>';
        output += '</li>';

    });
    output += '</tbody></table>';
    $('.todos-list').html(output);

 //AJAX
    var form = "#todo-form";
    $(form).change(function(event) {
        event.preventDefault();
        var formData = JSON.stringify(data.acf.todo_list);
         $.ajax({
               type:'POST',
               url: ajaxURL,
               dataType : 'json',
               data: formData,
               beforeSend: function ( xhr ) {
                    xhr.setRequestHeader( 'X-WP-Nonce', WP_API_Settings.nonce );
                },
               success: function(){
                  console.log('success');
              },
              error: function(){
                  console.log('error');
              },
         });
    });

默认情况下,WordPress REST API 不处理自定义元数据,您必须创建一个自定义字段并附加函数来保存/获取数据。你设置好了吗?

如果没有,请查看 docs on extending

我能够通过不使用 $.getJSON() 和 the plugin issues thread 的一点帮助来让它工作。

更新了以下代码:

HTML & PHP

<form id="todo-form">
  <?php
    $repeater = get_field( 'todo_list' );
      if ( ! $repeater ) {
        $repeater = array(
            array(
                'todo_checkbox' => '',
                'todo_item'  => '',
                )
            );
        }
    ?>              
    <?php foreach ( $repeater as $k => $v ) : ?>
      <?php $checked = $v['todo_checkbox']; ?>
      <li>
        <input type="checkbox" class="todo-checkbox check" name="fields[todo_list][<?php echo absint( $k ); ?>][todo_checkbox]" value="1" <?php checked( $checked, true ); ?> />
        <input type="checkbox" class="todo-checkbox hide" name="fields[todo_list][<?php echo absint( $k ); ?>][todo_checkbox]" value="0"    <?php checked( $checked, false ); ?> />
        <p name="fields[todo_list][<?php echo absint( $k ); ?>][todo_item]" class="todo-item"><?php echo esc_attr( $v['todo_item'] ); ?></p>
     </li>
   <?php endforeach; ?>         
</form>

Jquery

var form = "#todo-form";
var wpajax = WP_API_Settings.root + 'wp/v2/client/'+post_id;
$(form).change(function(event) {
  event.preventDefault();
  var checkbox = $('.todo-checkbox');
  var formData = checkbox.serialize();
  $.ajax({
    type:'POST',
    url: wpajax,
    dataType : 'json',
    beforeSend: function ( xhr ) {
        xhr.setRequestHeader( 'X-WP-Nonce', WP_API_Settings.nonce );
    },
   data: formData,
   success: function(){
      console.log('success!');
  },
  error: function(){
      console.log('error');
  },
 });
 return false;
});