Wordpress前端使用文件上传创建帖子(自定义帖子类型)

时间:2015-09-03 17:16:55

标签: php jquery ajax wordpress

我正在创建一个简单的插件,允许用户将内容添加到自定义帖子类型。前端表单包括一些文本字段和文件上载字段。 我使用ajax提交表单并且工作正常。但是,我正在尝试使文件上载字段也能正常工作。文件上传后,其值(网址)将添加为自定义字段。

我对ajax并不熟悉,这可能是我到目前为止尝试失败的原因。下面是我目前使用的代码,减去文件上传内容:

JS:

(function($) {

  $('.btn').on('click', function(e) {
    $('.btn').html('<i class="fa fa-spinner fa-pulse"></i>')
    e.preventDefault();
    var fname = $('#first-name').val();
    var lname = $('#last-name').val();
    var email = $('#email').val();
    var address = $('#address').val();
    var phone = $('#phone').val();
    var security = $('#security').val();
    //var file = $('#entryfile').files[0];

    // ajax the results!
    $.ajax({
      url: ajax.ajax_url,
      type: "POST",
      dataType : "json",
      contentType: false,
      processData: false,
      data: {
        action: 'entry_add',
        fname:fname,
        lname:lname,
        email:email,
        address:address,
        phone:phone,
        nonce: security,
        file:file
      },
      success: function( response ) {
        console.log( response );
        $('.contest-entry').hide('500', function() {
          $('.message > h2').html( response );
          $('.message').show('fast');
        });
      }
    });

  });

})( jQuery );

PHP:

function ajax_entry() {
  check_ajax_referer( 'add-entry-nonce', 'nonce' );

  $email = urldecode($_POST['email']);
  $fname = wp_strip_all_tags($_POST['fname']);
  $lname = wp_strip_all_tags($_POST['lname']);
  $addr  = wp_strip_all_tags($_POST['address']);
  $phone = wp_strip_all_tags($_POST['phone']);

  $success = "<i class='fa fa-check'></i> Thanks for joining! You will be reditected to step 2 in a few seconds";
  $error = "<i class='fa fa-exclamation-triangle'></i> Looks like something went wrong! Try again maybe?";

  if( !empty($email) && !empty($fname) && !empty($lname) && !empty($addr) ) {
    $postData = array(
      'post_title'  => $fname . ' ' . $lname,
      'post_type'   => 'contestants',
      'post_status' => 'draft'
    );
    $post = wp_insert_post( $postData );
    add_post_meta($post, "field_entry_unique", "WTH-".$post);
    add_post_meta($post, "field_first_name", $fname);
    add_post_meta($post, "field_last_name", $lname);
    add_post_meta($post, "field_email", $email);
    add_post_meta($post, "field_address", $addr);
    add_post_meta($post, "field_status", "pending");
    add_post_meta($post, "field_phone", $phone);

    if( $post != -1 ) {
      //echo json_encode($success);
      echo json_encode($file);
    } else {
      echo json_encode($error);
    }
  } else {
    echo json_encode($error);
  }
  exit;
}

你能帮我找一个上传工作的方法吗?

修改 到目前为止我遇到的所有解决方案都不起作用(或者我不能使它们工作),需要第二个表单或打破现有表单,因此不允许创建帖子。 关于如何做到这一点,我需要一些指导(几行示例代码也会很棒)。 jQuery不是我的力量......

更新 我设法使用下面的方法来完成这项工作。但是,在注销时,上载失败,控制台会将重定向记录到登录页面。有什么想法吗?

 var formData = new FormData();
      formData.append("action", "upload-attachment");
      var fileInputElement = document.getElementById("entryfile");
      formData.append("async-upload", fileInputElement.files[0]);
      formData.append("name", fileInputElement.files[0].name);
      formData.append("_wpnonce", upload_nonce);
      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange=function(){
        if (xhr.readyState==4 && xhr.status==200){
          console.log(xhr.responseText);             
        }
      }
      xhr.open("POST","wp-admin/async-upload.php",true);
      xhr.send(formData);

0 个答案:

没有答案