简体   繁体   English

WordPress管理面板中的简单上载表单字段

[英]Simple Upload Form Field in Admin Panel for WordPress

According to Simple upload field for WordPress by Nicolas Kuttler, it is possible to create a custom upload form field. 根据Nicolas Kuttler 为WordPress提供的简单上传字段,可以创建自定义上传表单字段。 However, the introduced code is only functions. 但是,引入的代码只是函数。 I'm wondering how it can be used. 我想知道它是如何使用的。

Could somebody provide a working example of it? 有人可以提供一个有效的例子吗? If the code serves the functionality of uploading files, it doesn't matter to me whether the code is of that page or not. 如果代码提供上传文件的功能,那么代码是否属于该页面并不重要。 I'd like to be able to upload a file via the admin panel. 我希望能够通过管理面板上传文件。

[Edit] [编辑]

I'd like to upload files besides images including a text file and xml. 我想上传文件,包括文本文件和xml。 Also I'd like to achieve it without javascript. 我也想在没有javascript的情况下实现它。 Currently no effective answers have been posted yet. 目前尚未发布有效答案。 ( I appreciate the posted information as an answer so far though.) (到目前为止,我很欣赏发布的信息作为答案。)

Thanks in advance. 提前致谢。


The suggested sample plugin does not let the user to interact with the upload box. 建议的示例插件不允许用户与上传框进行交互。 I attached the screenshot below. 我附上了截图。

在此输入图像描述

For anyone who wants to know more about file uploading, here's a quick primer covering the major topics and pain points. 对于想要了解更多关于文件上传的人,这里有一个快速入门,涵盖主要主题和难点。 This is written with WordPress 3.0 on a Linux box in mind, and the code is just a basic overview to teach the concepts--I'm sure some folks here could offer advice for improvement on the implementation. 这是在Linux盒子上用WordPress 3.0编写的,代码只是教授概念的基本概述 - 我相信这里的一些人可以提供改进实现的建议。 Outline Your Basic Approach 概述您的基本方法

There at least three ways to associate images with posts: using a post_meta field to store the image path, using a post_meta field to store the image's media library ID (more on that later), or assigning the image to the post as an attachment. 至少有三种方法可以将图像与帖子相关联:使用post_meta字段存储图像路径,使用post_meta字段存储图像的媒体库ID(稍后详细介绍),或者将图像作为附件分配给帖子。 This example will use a post_meta field to store the image's media library ID. 此示例将使用post_meta字段来存储图像的媒体库ID。 YMMV. 因人而异。 Multipart Encoding 多部分编码

By default, WordPress' create & edit forms have no enctype. 默认情况下,WordPress的创建和编辑表单没有enctype。 If you want to upload a file, you'll need to add an "enctype='multipart/form-data'" to the form tag--otherwise the $_FILES collection won't get pushed through at all. 如果要上传文件,则需要在表单标记中添加“enctype ='multipart / form-data'” - 否则$ _FILES集合将无法完成。 In WordPress 3.0, there's a hook for that. 在WordPress 3.0中,有一个钩子。 In some previous versions (not sure of the specifics) you have to string replace the form tag. 在某些先前版本中(不确定具体细节),您必须使用字符串替换表单标记。

function xxxx_add_edit_form_multipart_encoding() 
{

echo ' enctype="multipart/form-data"';

}
add_action('post_edit_form_tag', 'xxxx_add_edit_form_multipart_encoding');

Create the Meta Box and Upload Field 创建元框和上传字段

I won't go far into creating meta boxes as most of you probably already know how to do it, but I'll just say that you only need a simple meta box with a file field in it. 我不会擅长创建元框,因为大多数人可能已经知道如何去做,但我只是说你只需要一个带有文件字段的简单元框。 In the example below I've included some code to look for an existing image, and display it if one exists. 在下面的示例中,我已经包含了一些代码来查找现有图像,并在存在时显示它。 I've also included some simple error/feedback functionality that passes errors using a post_meta field. 我还提供了一些使用post_meta字段传递错误的简单错误/反馈功能。 You'll want to change this to use the WP_Error class... it's just for demonstration. 你想要改变这个以使用WP_Error类...它只是为了演示。

 // If there is an existing image, show it
    if($existing_image) {

        echo '<div>Attached Image ID: ' . $existing_image . '</div>';

    } 

    echo 'Upload an image: <input type="file" name="xxxx_image" id="xxxx_image" />';

    // See if there's a status message to display (we're using this to show errors during the upload process, though we should probably be using the WP_error class)
    $status_message = get_post_meta($post->ID,'_xxxx_attached_image_upload_feedback', true);

    // Show an error message if there is one
    if($status_message) {

        echo '<div class="upload_status_message">';
            echo $status_message;
        echo '</div>';

    }

    // Put in a hidden flag. This helps differentiate between manual saves and auto-saves (in auto-saves, the file wouldn't be passed).
    echo '<input type="hidden" name="xxxx_manual_save_flag" value="true" />';

}



function xxxx_setup_meta_boxes() {

    // Add the box to a particular custom content type page
    add_meta_box('xxxx_image_box', 'Upload Image', 'xxxx_render_image_attachment_box', 'post', 'normal', 'high');

}
add_action('admin_init','xxxx_setup_meta_boxes');

Handling the File Upload 处理文件上载

This is the big one--actually handling the file upload by hooking into the save_post action. 这是最重要的 - 实际上通过挂钩到save_post操作来处理文件上传。 I've included a heavily-commented function below, but I'd like to note the two key WordPress functions it uses: 我在下面添加了一个评论很多的函数,但是我想要注意它使用的两个关键的WordPress函数:

wp_handle_upload() does all the magic of, well, handling the upload. wp_handle_upload()完成处理上传的所有魔力。 You just pass it a reference to your field in the $_FILES array, and an array of options (don't worry too much about these--the only important one you need to set is test_form=false. Trust me). 你只需要在$ _FILES数组中传递对你的字段的引用,以及一系列选项(不要过于担心这些 - 你需要设置的唯一重要的是test_form = false。相信我)。 This function doesn't, however, add the uploaded file to the media library. 但是,此功能不会将上载的文件添加到媒体库。 It merely does the upload and returns the new file's path (and, handily, the full URL as well). 它只是上传并返回新文件的路径(并且,同时也是完整的URL)。 If there's a problem, it returns an error. 如果出现问题,则会返回错误。

wp_insert_attachment() adds the image to the media library, and generates all of the appropriate thumbnails. wp_insert_attachment()将图像添加到媒体库,并生成所有适当的缩略图。 You just pass it an array of options (title, post status, etc), and the LOCAL path (not URL) to the file you just uploaded. 您只需将一系列选项(标题,帖子状态等)和LOCAL路径(不是URL)传递给您刚刚上传的文件。 The great thing about putting your images in the media library is that you can easily delete all the files later by calling wp_delete_attachment and passing it the item's media library ID (which I'm doing in the function below). 将图像放入媒体库的好处在于,您可以稍后通过调用wp_delete_attachment轻松删除所有文件,并将项目的媒体库ID传递给它(我在下面的函数中做了)。 With this function, you'll also need to use wp_generate_attachment_metadata() and wp_update_attachment_metadata(), which do exactly what you'd expect they do--generate metadata for the media item. 使用此功能,您还需要使用wp_generate_attachment_metadata()和wp_update_attachment_metadata(),它们可以完全按照您的预期执行操作 - 为媒体项生成元数据。

function xxxx_update_post($post_id, $post) {

    // Get the post type. Since this function will run for ALL post saves (no matter what post type), we need to know this.
    // It's also important to note that the save_post action can runs multiple times on every post save, so you need to check and make sure the
    // post type in the passed object isn't "revision"
    $post_type = $post->post_type;

    // Make sure our flag is in there, otherwise it's an autosave and we should bail.
    if($post_id && isset($_POST['xxxx_manual_save_flag'])) { 

        // Logic to handle specific post types
        switch($post_type) {

            // If this is a post. You can change this case to reflect your custom post slug
            case 'post':

                // HANDLE THE FILE UPLOAD

                // If the upload field has a file in it
                if(isset($_FILES['xxxx_image']) && ($_FILES['xxxx_image']['size'] > 0)) {

                    // Get the type of the uploaded file. This is returned as "type/extension"
                    $arr_file_type = wp_check_filetype(basename($_FILES['xxxx_image']['name']));
                    $uploaded_file_type = $arr_file_type['type'];

                    // Set an array containing a list of acceptable formats
                    $allowed_file_types = array('image/jpg','image/jpeg','image/gif','image/png');

                    // If the uploaded file is the right format
                    if(in_array($uploaded_file_type, $allowed_file_types)) {

                        // Options array for the wp_handle_upload function. 'test_upload' => false
                        $upload_overrides = array( 'test_form' => false ); 

                        // Handle the upload using WP's wp_handle_upload function. Takes the posted file and an options array
                        $uploaded_file = wp_handle_upload($_FILES['xxxx_image'], $upload_overrides);

                        // If the wp_handle_upload call returned a local path for the image
                        if(isset($uploaded_file['file'])) {

                            // The wp_insert_attachment function needs the literal system path, which was passed back from wp_handle_upload
                            $file_name_and_location = $uploaded_file['file'];

                            // Generate a title for the image that'll be used in the media library
                            $file_title_for_media_library = 'your title here';

                            // Set up options array to add this file as an attachment
                            $attachment = array(
                                'post_mime_type' => $uploaded_file_type,
                                'post_title' => 'Uploaded image ' . addslashes($file_title_for_media_library),
                                'post_content' => '',
                                'post_status' => 'inherit'
                            );

                            // Run the wp_insert_attachment function. This adds the file to the media library and generates the thumbnails. If you wanted to attch this image to a post, you could pass the post id as a third param and it'd magically happen.
                            $attach_id = wp_insert_attachment( $attachment, $file_name_and_location );
                            require_once(ABSPATH . "wp-admin" . '/includes/image.php');
                            $attach_data = wp_generate_attachment_metadata( $attach_id, $file_name_and_location );
                            wp_update_attachment_metadata($attach_id,  $attach_data);

                            // Before we update the post meta, trash any previously uploaded image for this post.
                            // You might not want this behavior, depending on how you're using the uploaded images.
                            $existing_uploaded_image = (int) get_post_meta($post_id,'_xxxx_attached_image', true);
                            if(is_numeric($existing_uploaded_image)) {
                                wp_delete_attachment($existing_uploaded_image);
                            }

                            // Now, update the post meta to associate the new image with the post
                            update_post_meta($post_id,'_xxxx_attached_image',$attach_id);

                            // Set the feedback flag to false, since the upload was successful
                            $upload_feedback = false;


                        } else { // wp_handle_upload returned some kind of error. the return does contain error details, so you can use it here if you want.

                            $upload_feedback = 'There was a problem with your upload.';
                            update_post_meta($post_id,'_xxxx_attached_image',$attach_id);

                        }

                    } else { // wrong file type

                        $upload_feedback = 'Please upload only image files (jpg, gif or png).';
                        update_post_meta($post_id,'_xxxx_attached_image',$attach_id);

                    }

                } else { // No file was passed

                    $upload_feedback = false;

                }

                // Update the post meta with any feedback
                update_post_meta($post_id,'_xxxx_attached_image_upload_feedback',$upload_feedback);

            break;

            default:

        } // End switch

    return;

} // End if manual save flag

    return;

}
add_action('save_post','xxxx_update_post',1,2);

Permissions, Ownership and Security 权限,所有权和安全性

If you have trouble uploading, it might have to do with permissions. 如果您无法上传,则可能与权限有关。 I'm no expert on server config, so please correct me if this part is wonky. 我不是服务器配置方面的专家,所以如果这部分不稳定,请纠正我。

First, make sure your wp-content/uploads folder exists, and is owned by apache:apache. 首先,确保您的wp-content / uploads文件夹存在,并且由apache拥有:apache。 If so, you should be able to set the permissions to 744 and everything should just work. 如果是这样,您应该能够将权限设置为744,一切都应该正常工作。 The ownership is important--even setting perms to 777 sometimes won't help if the directory isn't properly owned. 所有权很重要 - 如果目录没有正确拥有,即使将权限设置为777,有时也无济于事。

You should also consider limiting the types of files uploaded and executed using an htaccess file. 您还应该考虑使用htaccess文件限制上载和执行的文件类型。 This prevents people from uploading files that aren't images, and from executing scripts disguised as images. 这可以防止人们上传不是图像的文件,也不会执行伪装成图像的脚本。 You should probably google this for more authoritative info, but you can do simple file type limiting like this: 你可能应该谷歌这个更权威的信息,但你可以这样做简单的文件类型限制:

<Files ^(*.jpeg|*.jpg|*.png|*.gif)>
order deny,allow
deny from all
</Files>

Add all that code to the functions.php file. 将所有代码添加到functions.php文件中。 Then make a function call in the theme file where you want it. 然后在您想要的主题文件中进行函数调用。

For example if you want in the page template, make the call 例如,如果您想在页面模板中进行调用

<div> <?php fileupload('form'); ?> </div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM