传送文件而不是WordPress页面

时间:2015-01-26 作者:Chris Morris

我正在尝试创建一个页面,其中用户提供附件ID,站点将设置标题并交付该文件,而不是404页面。因此/download/1754将使用该Id查找附件,并根据文件类型将其输出以供查看/下载。

我只是想不出一种wordpress友好的方式来从插件内部实现这一点。我考虑过使用add\\u rewrite\\u规则,但看不到一个好的解决方法,还考虑过检查$\\u服务器[\'REQUEST\\u URI\'],以便在任何HTML之前交付内容,但之后我必须阻止页面呈现404,我不确定是否有一种Wordpress友好的方法可以做到这一点。

我目前的想法是让我的插件制作一个下载页面,分配一个模板,并让该模板运行逻辑,而不是我的插件类。虽然我以前在另一种情况下使用过这个,但它非常混乱,因为我必须编写大量代码,以迫使用户无法更新或编辑文件,并在激活时重新创建/删除它。停用。所以理想情况下,我希望避免这种情况。

2 个回复
最合适的回答,由SO网友:Milo 整理而成

使用重写规则,您走在了正确的道路上。如果您只是交付一个文件,您可以挂接一个早期操作,检查是否请求下载,然后输出文件并在WordPress进入查询数据库并确定请求是404之前退出。

// add the download ID query var which we\'ll set in the rewrite rule
function wpd_query_var( $query_vars ){
    $query_vars[] = \'download_id\';
    return $query_vars;
}
add_filter( \'query_vars\', \'wpd_query_var\' );

// add rewrite rule
function wpd_rewrite(){
    add_rewrite_rule(
        \'download/([0-9]+)/?$\',
        \'index.php?download_id=$matches[1]\',
        \'top\'
    );
}
add_action( \'init\', \'wpd_rewrite\' );

// check for download_id and output the file
function wpd_request( $wp ){
    if( array_key_exists( \'download_id\', $wp->query_vars ) ) {
        // output your headers and file here
        // ID is in $wp->query_vars[\'download_id\']
        // then exit to halt any further execution
        exit;
    }
}
add_action( \'parse_query\', \'wpd_request\' );

SO网友:birgire

对于图像附件,可以尝试以下示例:

add_action( \'init\', function()
{                                                               
    add_rewrite_endpoint( \'download\', EP_ROOT );
    add_action( \'template_redirect\', function()
    {
        if ( $pid = get_query_var( \'download\' ) ) 
        {
            $found = false;
            if( $file = wp_get_attachment_image_src( absint( $pid ), \'full\' ) )
            {
                $found = true;
                header( "Content-Disposition: attachment; filename=" . basename( $file[0] ) );
                readfile( $file[0] );
                exit();
            }
            if( ! $found )
                wp_die( __( \'Image file not found!\' ) );
        }
    } );   
} );
您可能需要根据需要调整标题。

重新生成重写规则,然后您应该能够从以下位置下载图像附件:

http://example.tld/download/123/
与这个简单的演示相比,这里有更好的脚本,但它似乎可以在我的安装中使用。例如签出this blog, 它似乎对如何处理大型文件有一些有趣的想法。

希望您可以根据自己的需要进行修改。

结束

相关推荐

Multisite and plugins options

我需要更多关于get_site_option(), update_site_option() 和add_site_option().在codex中,他们说它与单次安装相同,只是在多站点中,它返回网络范围的选项。好吧,但我对这一点感到困惑:这是否意味着一旦设置了网络范围选项,所有站点的选项都是相同的?还是每个站点都会覆盖它?我的意思是如果我这样做: update_site_option(\'option_group\', \'default_options());// default_options() r