Upload file ใน WordPress

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

ใส่ความเห็น

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

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>