为WordPress构建更好的媒体上传器

时间:2011-06-30 作者:Yarin

我正在WordPress中为客户端构建一个复杂的库组件。我的主要障碍是在管理屏幕中创建一个媒体上传程序,让他们可以将图像上传到不同的文件夹中。由于图像数量众多,按文件夹组织至关重要。

我基本上需要模拟当前WordPress媒体上传器的功能,但能够为图像创建/选择文件夹。

我真的不知道从哪里开始——是否有一种在网站上实现文件上传的标准方法适合这种情况?

1 个回复
SO网友:Ian Dunn

您可以使用WordPress的内置上载处理程序,wp_handle_upload(). 您可以使用upload_dir 筛选以设置自定义目录。

以下是我的一个插件中的一些代码片段,您可以使用/修改:

public function saveCustomFields()
{
    global $post;

    if($post->post_type == self::POST_TYPE && current_user_can( \'edit_post\', $post->ID ) )
    {
        if ( defined(\'DOING_AUTOSAVE\') && DOING_AUTOSAVE )
            return;

        $fileReference = \'installPDF\'; // This has to be in a variable because it gets passed by reference to wp_handle_upload()

        // save normal custom fields w/ update_post_meta() here

        if( empty($_FILES[$fileReference] ) )
        {
            // your custom logic if needed
        }
        else
        {
            $overrides = array(
                \'test_form\' => false,
                \'unique_filename_callback\' => self::PREFIX . \'setFilename\'      // this lets you rename the file
            );

            $result = wp_handle_upload( $_FILES[$fileReference], $overrides );

            if( is_array($result) && array_key_exists(\'error\', $result) && !empty( $result[\'error\'] ) )
            {
                // failure logic
            }
            else
            {
                // success logic
            }
        }
    }
}
add_action( \'post_updated\', array( $this, \'saveCustomFields\') );

public function addFormEnctype()
{
    // this is needed to enable file uplodas on your form

    echo \' enctype="multipart/form-data"\';
}   
add_action( \'post_edit_form_tag\',   array( $this, \'addFormEnctype\') );

public function setUploadDirectory($uploads)
{
    global $post;

    if( $post->post_type == self::POST_TYPE )
    {
        $uploads[\'path\']    = $this->uploadDir . $this->uploadYear .\'/\';
        $uploads[\'url\']     = $this->uploadURL . $this->uploadYear .\'/\';
        $uploads[\'subdir\']  = \'/\'. $this->uploadYear;
        $uploads[\'basedir\'] = $this->uploadDir;
        $uploads[\'baseurl\'] = $this->uploadURL;
    }   

    return $uploads;
}
add_filter( \'upload_dir\',           array( $this, \'setUploadDirectory\') );

结束

相关推荐