将表导出为CSV在管理中有效,但在前端使用时会导出HTML数据

时间:2021-03-01 作者:Debbie Kurth

我有一些代码,是通过自定义插件中的一个短代码实现的。代码从一些数据表生成CSV文件。当我在admin部分中运行shortcode时,它工作得非常好。但当我尝试在前端运行它时,它会在CSV文件的顶部填充页面HTML数据,例如:

<?DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
.......

#  ID    Product      Price
1   2a   keys        10.00
2   2b   doors       55.00
数据表会像插件的管理部分一样导出。当函数的短代码放在前端时,结果是文件顶部的HTML代码(如上所示)。我一辈子都想不出怎么阻止这一切。目标是能够让用户以CSV格式输出其所有购买内容。代码如下:


function ShowResults($Name)
{
$rows = mmd_GetProducts($Name);

ob_start();
ob_end_flush();
header(\'Pragma: public\');
header( \'Expires: 0\' );
header( \'Cache-Control: private\', false );
header( \'Content-Type: text/csv\');
header( \'Content-Disposition: attachment; filename="\'. \'Results.csv"\');
$fp = fopen(\'php://output\', \'w\');

$header_row = array(
        0 => \'#\',
        1 => \'ID\',
        2 => \'Product\',
        3 => \'Price\',
    );
fputcsv($fp, $header_row);

foreach($rows as $Record)
  { 
     if($Record[\'bDoNotDisplay\'] == 1 )
        continue;
  
  $OutputRecord = array($cnt
                        $Record[\'id\'], 
                        $Record[\'product\'],  
                        $Record[\'price\']);
    $cnt ++;
    fputcsv($fp, $OutputRecord);         
    }
unset($rows);

fclose( $fp );
ob_end_clean(); 
exit();
}

更新但仍然存在问题

类似的问题,只是现在HTML代码位于文件的底部。我将代码更改为使用add\\u操作,而不是调用短代码。我使用这个wordpress操作调用,然后检测这是否是正在加载的页面

add_action( \'template_redirect\', \'ShowResults\', 10); 
function ShowResults()
{
 global $post;
 
$title = get_the_title($post); 

if($title == "Export")
   {
   OutputCSV();
   }
 }


function OutputCSV()
{
$rows = mmd_GetProducts($Name);

ob_start();
ob_end_flush();
header(\'Pragma: public\');
header( \'Expires: 0\' );
header( \'Cache-Control: private\', false );
header( \'Content-Type: text/csv\');
header( \'Content-Disposition: attachment; filename="\'. \'Results.csv"\');
$fp = fopen(\'php://output\', \'w\');

$header_row = array(
        0 => \'#\',
        1 => \'ID\',
        2 => \'Product\',
        3 => \'Price\',
    );
fputcsv($fp, $header_row);

foreach($rows as $Record)
  { 
     if($Record[\'bDoNotDisplay\'] == 1 )
        continue;
  
  $OutputRecord = array($cnt
                        $Record[\'id\'], 
                        $Record[\'product\'],  
                        $Record[\'price\']);
    $cnt ++;
    fputcsv($fp, $OutputRecord);         
    }
unset($rows);

fclose( $fp );
ob_end_clean(); 
exit();

}
现在HTML代码显示在文件的底部,而不是顶部。有什么建议吗?

1 个回复
SO网友:Debbie Kurth

这是一次旅行!解决方案是“die”,不退出并使用add\\u操作调用,该调用会在调用任何标头调用之前发出通知。在试图写出文件末尾的头之前,模具强制系统退出。

最终有效的代码:

add_action( \'template_redirect\', \'ShowResults\', 10); 
function ShowResults($Name)
{
 global $post;
 $title = get_the_title($post);

if($title == "Export")
   OutputCSV();
}

function ExportCSV()
{
$rows = mmd_GetProducts($Name);

header(\'Pragma: public\');
header( \'Expires: 0\' );
header( \'Cache-Control: private\', false );
header( \'Content-Type: text/csv\');
header( \'Content-Disposition: attachment; filename="\'. \'Results.csv"\');
$fp = fopen(\'php://output\', \'w\');

$header_row = array(
        0 => \'#\',
        1 => \'ID\',
        2 => \'Product\',
        3 => \'Price\',
    );
fputcsv($fp, $header_row);

foreach($rows as $Record)
  { 
     if($Record[\'bDoNotDisplay\'] == 1 )
        continue;
  
  $OutputRecord = array($cnt
                        $Record[\'id\'], 
                        $Record[\'product\'],  
                        $Record[\'price\']);
    $cnt ++;
    fputcsv($fp, $OutputRecord);         
    }
unset($rows);

fclose( $fp );
die;                  <<<=========== die NOT exit.
}