บทความนี้จะแสดงตัวอย่างวิธีการเขียนโค้ดอัพโหลดโดยใช้ฟังก์ชั่นของ WordPress. ก่อนที่จะเริ่มในขั้นนี้โปรดทราบว่าการเขียนฟอร์มส่งค่าอัพโหลดมีที่มาหลากหลายมาก จึงขอตัดขั้นตอนนั้นไป ดังนั้นโปรดอ่านการสร้างเมนู, หน้าผู้ดูแล จากเอกสารของเวิร์ดเพรสเอง.
ฟอร์มอัพโหลด
ส่วนสำคัญสำหรับการทำงานโดยไม่ต้องลัดขั้นตอนเหมือนในเอกสารก็คือการส่งค่า action
ไปด้วยกับค่าต่างๆในฟอร์ม.
<form enctype="multipart/form-data" method="post">
<input name="action" type="hidden" value="testUploadForm" />
<input name="myfile" type="file" />
<button type="submit">Submit</button>
</form>
โค้ดอัพโหลด
ในส่วนของโค้ดอัพโหลด ไม่ว่าจะเป็น form ธรรมดา, ajax, REST API ก็ใช้หลักการเดียวกัน. การอัพโหลดจะใช้ฟังก์ชั่น wp_handle_upload()
ขอได้โปรดอ้างอิงจากเอกสารของ WordPress.
<?php
class MyForm
{
/**
* Accept form method post.
*/
public function formPostData()
{
if ($_POST) {
$overrides['action'] = $_POST['action'];
$overrides['mimes'] = [
'jpg|jpeg|jpe' => 'image/jpeg',
'gif' => 'image/gif',
'png' => 'image/png',
];
$overrides['unique_filename_callback'] = [$this, 'renameFile'];
$uploadResult = wp_handle_upload($_FILES['myfile'], $overrides);
}
}
/**
* Set new name the uploaded file.
*
* @param string $dir Example: C:/wwwroot/wordpress/wp-content/uploads/xxxx/xx
* @param string $name The original file name when user selected a file. Example: my-photo.jpg
* @param string $ext The file extension. Example: .jpg
*/
public function renameFile($dir, $name, $ext)
{
return date('Y-m-d') . '-' . mt_rand(0, 999999) . $ext;// always set the name to Y-m-d-[random number].
}
}
ด้วยวิธีนี้ทำให้เราไม่ต้องลัดการตรวจสอบฟอร์มด้วยการกำหนดค่า 'test_form' => false
เหมือนที่ระบุในเอกสาร. ส่วนรายละเอียดอื่นๆขออธิบายดังต่อไปนี้.
mimes
คือการกำหนดนามสกุลไฟล์ และประเภทไฟล์ที่อนุญาตให้อัพโหลดได้. โดย key ของ array จะเป็นนามสกุลไฟล์ทั้งหลายในรูปแบบที่สามารถเรียกใช้ใน regular expression ได้เลย ดังตัวอย่างด้านบน.
unique_filename_callback
คือกำหนดฟังก์ชั่นเรียกกลับเพื่อทำการกำหนดชื่อไฟล์ กรณีนี้จะเป็นประโยชน์มากในการใช้ตรวจสอบว่าชื่อไฟล์ปลอดภัยดีไหม? รองรับบนระบบทั่วไปหรือเปล่า? ชื่อไฟล์ที่เป็นภาษาไทยจะมีปัญหากลายเป็นคำที่อ่านไม่รู้เรื่องและจะทำให้ตามลบจากโค้ดไม่ได้ กรณีนี้ก็ใช้การตรวจสอบในฟังก์ชั่นที่ถูกเรียกกลับนี้ (renameFile
) แล้วทำการกำหนดชื่อใหม่เสียเลย.
สำหรับการกำหนดโฟลเดอร์อื่นๆนอกจาก wp-content/uploads/ปี/เดือน นั้น เช่น กำหนดเป็น wp-content/uploads/myplugin โดยจะให้กำหนดผ่านฟังก์ชั่น wp_handle_upload()
นั้น ไม่สามารถทำได้.