บทความนี้จะแสดงตัวอย่างวิธีการเขียนโค้ดอัปโหลดโดยใช้ฟังก์ชั่นของ WordPress. โดยจะทำการเขียนตัวอย่างโค้ดอย่างง่าย เพื่อทำความเข้าใจ, นำไปทดลองต่อเพื่อปรับแต่งเพิ่มเติมเองได้.
โค้ดและฟอร์มอัปโหลด
<?php
/**
* Plugin Name: Testing
*/
function rdtest_admin_page() {
if ($_POST) {
$overrides = [];
$overrides['action'] = 'testUploadForm';
$overrides['mimes'] = [
'jpg|jpeg|jpe' => 'image/jpeg',
];
$uploadResult = wp_handle_upload($_FILES['myfile'], $overrides);
var_dump($uploadResult);
exit();
}
?>
<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>
<?php
}
function rdtest_add_admin_menu() {
$submenu = add_submenu_page( 'tools.php', 'Test upload', 'Test upload', 'manage_options', 'rdtest-upload-page', 'rdtest_admin_page' );
}
add_action('admin_menu', 'rdtest_add_admin_menu');
โค้ดด้านบนเป็นการสร้างเมนูใหม่ใต้เมนู Tools โดยใช้ฟอร์ม HTML อย่างง่าย และเมื่อรับค่าฟอร์มแล้วหน้านั้นจะหยุดการทำงานที่ exit();
.
ในส่วนของโค้ดอัปโหลด ไม่ว่าจะเป็น form ธรรมดา, ajax, REST API ก็ใช้หลักการเดียวกัน. การอัปโหลดจะใช้ฟังก์ชั่น wp_handle_upload()
ขอได้โปรดอ้างอิงจากเอกสารของ WordPress.
ค่า HTML input action นั้นเพื่อให้เราไม่ต้องกำหนดเพิ่มเติมใน $overrides['test_form'] = false;
.
mimes
คือการกำหนดนามสกุลไฟล์ และประเภทไฟล์ที่อนุญาตให้อัปโหลดได้. โดย key ของ array จะเป็นนามสกุลไฟล์ทั้งหลายในรูปแบบที่สามารถเรียกใช้ใน regular expression ได้เลย ดังตัวอย่างด้านบน. ทั้งนี้หากไม่ทราบ ขอให้เรียกดูค่าเริ่มต้นที่มีอยู่แล้วบน WordPress ได้ ผ่านฟังก์ชั่น get_allowed_mime_types()
.
สำหรับการกำหนดโฟลเดอร์อื่นๆนอกจาก wp-content/uploads/ปี/เดือน นั้น เช่น กำหนดเป็น wp-content/uploads/myplugin โดยจะให้กำหนดผ่านฟังก์ชั่น wp_handle_upload()
นั้น ไม่สามารถทำได้ แต่สามารถทำได้โดยผ่าน filter hook ที่ชื่อ upload_dir
โดยเพิ่ม filter ครอบก่อนและหลังฟังก์ชั่น wp_handle_upload()
.
ตัวอย่างการกำหนดตำแหน่งโฟลเดอร์อัปโหลดเอง
function rdtest_filter_upload_dir(array $uploads) {
$uploads['path'] = $uploads['basedir'] . '/mycustomdir';
$uploads['url'] = $uploads['baseurl'] . '/mycustomdir';
return $uploads;
}
และทำการเพิ่มฟิลเตอร์ดังนี้
add_filter('upload_dir', 'rdtest_filter_upload_dir');
$uploadResult = wp_handle_upload($_FILES['myfile'], $overrides);
remove_filter('upload_dir', 'rdtest_filter_upload_dir');