强制下载TEMPLATE_REDIRECT挂钩中的文件

时间:2017-05-12 作者:Max

在我的功能中。php文件我为template\\u重定向挂钩添加了一个自定义操作,该挂钩必须强制下载存储在服务器上的文件。当下载的代码位于Wordpress之外的一个简单PHP文件中时,它可以正常工作。但是,只要我在模板重定向挂钩中添加此代码,该功能就会被破坏。Chrome表示“无法访问该网站…ERR\\u INVALID\\u RESPONSE”。没有错误500或其他错误。。。

以下是下载代码:

<?php
$filename = $_SERVER[\'DOCUMENT_ROOT\'] . \'path-to-my-wordpress/wp-content/uploads/export/test.html\';
header( "Expires: 0" );
header( "Cache-Control: no-cache, no-store, must-revalidate" );
header( \'Cache-Control: pre-check=0, post-check=0, max-age=0\', false );
header( "Pragma: no-cache" );
header( "Content-type: text/html" );
header( "Content-Disposition:attachment; filename=\\"" . basename( $filename ) . "\\"" );
header( "Content-Type: application/force-download" );
readfile( "{$filename}" );
?>
以下是template\\u重定向挂钩:

add_action( \'template_redirect\', \'my_template_redirect\' );
function my_template_redirect() {
$filename = $_SERVER[\'DOCUMENT_ROOT\'] . \'path-to-my-wordpress/wp-content/uploads/export/test.html\';
header( "Expires: 0" );
header( "Cache-Control: no-cache, no-store, must-revalidate" );
header( \'Cache-Control: pre-check=0, post-check=0, max-age=0\', false );
header( "Pragma: no-cache" );
header( "Content-type: text/html" );
header( "Content-Disposition:attachment; filename=\\"" . basename( $filename ) . "\\"" );
header( "Content-Type: application/force-download" );
readfile( "{$filename}" );
exit();
}
有什么想法吗?

EDIT

在进行了一些测试之后,问题似乎来自我试图运行此下载的特定URL。事实上,我的代码是这样的:

add_action( \'template_redirect\', \'my_template_redirect\' );
function my_template_redirect() {
    if ( preg_match( "/\\/wp-admin\\/export$/", $_SERVER[\'REQUEST_URI\'] ) ) {
        $filename = $_SERVER[\'DOCUMENT_ROOT\'] . \'path-to-my-wordpress/wp-content/uploads/export/test.html\';
        header( "Expires: 0" );
        header( "Cache-Control: no-cache, no-store, must-revalidate" );
        header( \'Cache-Control: pre-check=0, post-check=0, max-age=0\', false );
        header( "Pragma: no-cache" );
        header( "Content-type: text/html" );
        header( "Content-Disposition:attachment; filename=\\"" . basename( $filename ) . "\\"" );
        header( "Content-Type: application/force-download" );
        readfile( "{$filename}" );
        exit();
    }
}
URL为/wp admin/export,这将启动文件下载。如果没有此URL条件,当我到达基本站点URL(=http://mysite.dev/). 但随着情况的发展http://mysite.dev/wp-admin/export, 它坏了。我也尝试过不使用wp admin前缀,但它也会中断。

3 个回复
SO网友:Max

解决方案实际上非常简单。只需使用操作admin\\u post\\u(操作)。。。

add_action( \'admin_post_export_page\', \'export_page\' );
function export_page() {
    // any code you want
}
然后您可以创建自定义链接admin\\u url(\'admin post.php?action=export\\u page&;id=\'。$post->id);

感谢米洛给出解决方案。

SO网友:Moshe Harush

错误500这是一个服务器错误,因此我假设它与文件相关或读取文件或将其传递给客户端。

我目前看到的可能导致问题的问题是:1)您提交了两次内容类型,但设置和相似性不同。2) 第二次发送应用程序/强制下载类型时,如果服务器不知道要发送的mime类型,则会出现问题。

请尝试以下代码:

add_action( \'template_redirect\', \'my_template_redirect\' );
function my_template_redirect() {
    if ( strpos( $_SERVER[\'REQUEST_URI\'], admin_url( \'export\' ) ) !== false ) {
        $upload_dir = wp_upload_dir();
        $filename = $upload_dir[\'basedir\'] . \'/export/test.html\';

        header( "Expires: 0" );
        header( "cache-Control: no-cache, no-store, must-revalidate" );
        header( "Pragma: no-cache" );
        header( "content-disposition: attachment; filename=" . basename( $filename ) );
        header( "content-type: application/octet-stream" );
        header( "content-length: " . filesize( $file ) );
        readfile( $filename );
        die();
    }
}

SO网友:Sam

您没有添加重定向页面

 add_action( \'template_redirect\', \'my_template_redirect\' );
    function my_template_redirect() {
    $filename = $_SERVER[\'DOCUMENT_ROOT\'] . \'path-to-my-wordpress/wp-content/uploads/export/test.html\';
    header( "Expires: 0" );
    header( "Cache-Control: no-cache, no-store, must-revalidate" );
    header( \'Cache-Control: pre-check=0, post-check=0, max-age=0\', false );
    header( "Pragma: no-cache" );
    header( "Content-type: text/html" );
    header( "Content-Disposition:attachment; filename=\\"" . basename( $filename ) . "\\"" );
    header( "Content-Type: application/force-download" );
    readfile( "{$filename}" );
    // Add your redirect page here
    wp_redirect( home_url( \'/pagename/\' ) ); /// works on my install sends to new page
    exit();
    }

结束

相关推荐

当尝试向我的登录页面添加一个css文件时,会出现“Headers Always Sent”?

我看过的每一篇关于这个主题的教程都已经过时了,所以我希望这里的人能帮助我。我想为我的wp登录设置样式。带有CSS文件的php页面。但我想以一种在Wordpress更新时不会被覆盖的方式来做。据我所知,根据我读到的图茨,在我的主题函数中使用函数添加它的最佳方式。php文件。不幸的是,人们建议使用的代码并不适合我。这是我添加的代码。<?php function custom_login() { echo \'<link rel=\"stylesheet\" href=\"wplog