在WordPress中强制下载文件

时间:2021-07-23 作者:aslamdoctor

我正在尝试创建一个脚本,以便将文件id作为查询字符串传递给/下载。php url并强制下载该文件。url应如下所示http://website.com/download.php?file=123

下面是我的代码,但它会引导我进入404页面或显示错误无效响应

/**
 * Download File from ID
 */
add_action(\'template_redirect\',\'cityportal_force_download\');
function cityportal_force_download() {
    if ($_SERVER[\'REDIRECT_URL\']==\'/download.php\' && isset($_GET[\'file\']) && !empty($_GET[\'file\'])) {
        $file_id = $_GET[\'file\'];
    $file_path = get_attached_file($file_id);
        $file_url = wp_get_attachment_url($file_id);
        
        if(file_exists($file_path)) {
            header(\'Content-Description: File Transfer\');
            header(\'Content-Type: \'.mime_content_type($file_path));
            header(\'Content-Disposition: attachment; filename="\'.basename($file_path).\'"\');
            header(\'Expires: 0\');
            header(\'Cache-Control: must-revalidate\');
            header(\'Pragma: public\');
            header(\'Content-Length: \' . filesize($file_path));
            flush();
            readfile($file_url);
            die();

            exit;
        }
  }
}

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

出现错误的原因是WordPress试图解析请求,这意味着WordPress试图查找与请求URL匹配的资源,如帖子或类别存档(/download.php), 如果找不到,WordPress会将HTTP状态标头设置为404找不到。

因此,要解决此问题,您可以使用parse_request 而不是template_redirect, 或致电status_header() 设置其他标题时。例如。

if(file_exists($file_path)) {
    status_header( 200 );

    // ... your code.
}
顺便说一句,正如我在评论中所说的,你应该使用readfile($file_path) — 只是提醒一下。。

相关推荐

OOP development and hooks

我目前正在为Wordpress编写我的第一个OOP插件。为了帮助我找到一点结构,a boiler plate 这为我奠定了基础。在里面Main.php 有一种方法可以为管理员加载JS和CSS资产:/** * Register all of the hooks related to the admin area functionality * of the plugin. * * @since 0.1.0 * @access private