php - Wordpress 和 AJAX - 上传特色图片

标签 php jquery ajax wordpress image-processing

我在前端表单中使用带有 ajax 的 wordpress,我需要处理和上传特色图片的支持。我的问题特别是关于特色图片。我的 html 是这样的:

<form id="msform" action="#" method="post" enctype="multipart/form-data">
//inputs of various nature
<input type="file" name="main_image" id="main_image"  multiple="false" value="" accept=".png, .jpg, .jpeg, .gif"/>
<input type="submit" class="submit" value="Publish"/>
</form>

我通过这个 jquery 将数据发送到 php 函数(遵循 Wordpress 方法):

function apfaddpost() {
    var formData = $('#msform').serialize();
    formData.append('main_image', $('#main_image')[0].files[0]); //here should be the problem
    jQuery.ajax({
        type: 'POST',
        url: apfajax.ajaxurl,
        data: formData + '&action=apf_addpost', //here I send data to the php function calling the specific action
        processData: false,
        contentType: false

        success: function(data, textStatus, XMLHttpRequest) {
            var id = '#apf-response';
            jQuery(id).html('');
            jQuery(id).append(data);
            resetvalues();
        },

        error: function(MLHttpRequest, textStatus, errorThrown) {
            alert(errorThrown);
        }

    });
}

我的 php 函数是这样的

function apf_addpost() {
    require_once(ABSPATH . "wp-admin" . '/includes/image.php');
    require_once(ABSPATH . "wp-admin" . '/includes/file.php');
    require_once(ABSPATH . "wp-admin" . '/includes/media.php');
    $file_handler = 'main_image';
    $attach_id = media_handle_upload($file_handler,$pid );
    update_post_meta($pid,'_thumbnail_id',$attach_id);
}

重要的是:标题、描述、标签等所有其他数据都已正确序列化并发送。问题出在图像上。我也尝试过使用 $_FILES[] 处理程序但没有成功,我想我的 ajax 代码不是那么好。你能帮助我吗?如果您对此问题有任何其他解决方法,请分享!提前致谢。

[已解决] 编辑

感谢下面的答案,我刚刚将我的 ajax 更改为

function apfaddpost() {
    var fd = new FormData($('#msform')[0]);
    fd.append( "main_image", $('#main_image')[0].files[0]);
    fd.append( "action", 'apf_addpost');      
   //Append here your necessary data
    jQuery.ajax({
        type: 'POST',
        url: apfajax.ajaxurl,
        data: fd, 
        processData: false,
        contentType: false,

        success: function(data, textStatus, XMLHttpRequest) {
            var id = '#apf-response';
            jQuery(id).html('');
            jQuery(id).append(data);
            resetvalues();
        },

        error: function(MLHttpRequest, textStatus, errorThrown) {
            alert(errorThrown);
        }

    });
}

我发现 FormData() 允许序列化文件,而 .serialize() 方法不允许。众所周知,继续前进很容易。 谢谢。

最佳答案

请尝试:

我已经修改了你的代码。

Jquery(添加了 FormData() 和追加)

function apfaddpost() {
    var fd = new FormData();
    fd.append( "main_image", $('#main_image')[0].files[0]);
    fd.append( "action", 'apf_addpost');      
   //Append here your necessary data
    jQuery.ajax({
        type: 'POST',
        url: apfajax.ajaxurl,
        data: fd, 
        processData: false,
        contentType: false

        success: function(data, textStatus, XMLHttpRequest) {
            var id = '#apf-response';
            jQuery(id).html('');
            jQuery(id).append(data);
            resetvalues();
        },

        error: function(MLHttpRequest, textStatus, errorThrown) {
            alert(errorThrown);
        }

    });
}

function.php

我添加了文件上传代码

/******FILE UPLOAD*****************/
function upload_user_file( $file = array() ) {    
    require_once( ABSPATH . 'wp-admin/includes/admin.php' );
    $file_return = wp_handle_upload( $file, array('test_form' => false ) );
    if( isset( $file_return['error'] ) || isset( $file_return['upload_error_handler'] ) ) {
        return false;
    } else {
        $filename = $file_return['file'];
        $attachment = array(
            'post_mime_type' => $file_return['type'],
            'post_title' => preg_replace( '/\.[^.]+$/', '', basename( $filename ) ),
            'post_content' => '',
            'post_status' => 'inherit',
            'guid' => $file_return['url']
        );
        $attachment_id = wp_insert_attachment( $attachment, $file_return['url'] );
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $attachment_data = wp_generate_attachment_metadata( $attachment_id, $filename );
        wp_update_attachment_metadata( $attachment_id, $attachment_data );
        if( 0 < intval( $attachment_id ) ) {
          return $attachment_id;
        }
    }
    return false;
}

现在修改 function.php 中的函数 apf_addpost()

function apf_addpost() {
     foreach( $_FILES as $file ) 
     {  
          if( is_array( $file ) ) {
                $attach_id =upload_user_file();  //Call function 
                update_post_meta($pid,'_thumbnail_id',$attach_id);
          }
     }

}

关于php - Wordpress 和 AJAX - 上传特色图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36767222/

相关文章:

php - 在相同 ID 的倍数上使用 INNER JOIN 从 MYSQL 进行 SELECT

javascript - 如何使用成品排序功能

java - 每次更改事件后发布结果都会增加

javascript - 是否有可能同时从 PHP 服务器接收多个 AJAX 响应?

php - 解析错误: Help me solve my php error

php - 每页内容不变

php - 打开一个 .gz 文件并读取/替换

javascript - 如何将 Float 与 AngularJS 与 x 轴上的时间集成

javascript - 为分层图像创建可动画的径向蒙版?

javascript - bxSlider - 在 slider 内移动控件