Upload file ใน WordPress

บทความนี้จะแสดงตัวอย่างวิธีการเขียนโค้ดอัพโหลดโดยใช้ฟังก์ชั่นของ 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() นั้น ไม่สามารถทำได้.

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>