使用 ajax 将数据保存到 wordpress 自定义数据库问题

Saving data with ajax to wordpress custom database issue

因为这是我的第一个 wp 插件,想使用 AJAX 让用户将那里的数据(通过表单)保存到插件自定义数据库(是的,它必须是我自己的 table) .

问题:

如果我提交表单,它会将页面重定向到 ajax 处理文件 (save-to-db-ajax.php),这显然不应该这样做。下面是插件的三部分。

  // admin/includes/form.php

  <form method="post" id="form-settings" action="<?php echo PLUGIN_ADMIN_AJAX_PATH;?>/save-to-db-ajax.php" >  

      <?php wp_nonce_field( 'settings', 'settings_nonce', false );?> 

      <input    name="field-one" type="text"/>
      <input    name="field-two" type="text"/>
      <textarea name="field_three">Hello world</textarea>

      <button name="save-form">Save</button>

  </form>




  // admin/js/admin.js(part of the admin.js file, the rest works)

  $('body').on('submit', '#form-settings', function(e){

      $.ajax({
          type: "post",
          url: $('#form-settings').attr('action'),
          data: $('#form-settings').serialize(),
          beforeSend: function() {
              alert('before')
          },
          success: function(){
              alert('success')
          },
          error: function(){
              alert('error')
          },
      }); 
  });



  // admin/ajax/save-to-db-ajax.php

  global $wpdb;

  $wpdb->update( 'my_plugin_table' ,
      array( 'settings_value' => $_POST[ 'field-one' ] ),
      array( 'settings_name'  => 'field-one'           ),
      array( '%s' , '%s' )
  );

Wordpress ajax 有点不同!您向 ajax 处理程序添加一个操作并使用中央 ajax 处理程序作为 url。在大多数主题中,它是 js var ajaxurl。如果它没有定义 google 它。

注意:我没有检查你的数据库功能

html:

    <form method="post" id="form-settings" action="" >  

      <?php wp_nonce_field( 'settings', 'settings_nonce', false );?> 

      <input    name="field-one" type="text"/>
      <input    name="field-two" type="text"/>
      <textarea name="field_three">Hello world</textarea>

      <button id="submitme" name="save-form">Save</button>

  </form>

jQuery:(如果放在页脚,如果在其他地方换行 jQuery(document).ready(function(){});

  jQuery(document).on('click', '#submitme', function(event){ // use jQuery no conflict methods replace $ with "jQuery"

        event.preventDefault(); // stop post action

      jQuery.ajax({
          type: "POST",
          url: ajaxurl, // or '<?php echo admin_url('admin-ajax.php'); ?>'
          data: {
              'action': 'ajax_form',
              'field-one': jQuery('[field-one]').val()// or combine serialized form with action .... 
          },
          beforeSend: function() {
              alert('before')
          },
          success: function(){
              alert('success')
          },
          error: function(){
              alert('error')
          },
      }); 
  });

Php

function ajax_form(){
      global $wpdb;

      $wpdb->update( 'my_plugin_table' ,
          array( 'settings_value' => $_POST[ 'field-one' ] ),
          array( 'settings_name'  => 'field-one'           ),
          array( '%s' , '%s' )
      );

      //echo something here to return a value...
      exit(); //prevent 0 in the return

}
add_action( 'wp_ajax_ajax_form', 'ajax_form' ); //admin side
add_action( 'wp_ajax_nopriv_ajax_form', 'ajax_form' ); //for frontend