我处理在wp-admin / side创建菜单的插件,并显示包含一些数据的表。我需要生成CSV(它是正确的)并让用户自动下载它。我知道,我必须添加像这样的标题
header('Content-type: application/csv');
header('Content-Disposition: attachment; filename="' . $csv_file_name . '"');
但不幸的是,它对wordpress管理员方面不起作用。 再次 - 生成CSV是正确的,但它只显示表格下方的csv文件的文本,但不提供文件
这是完整的代码
if ( isset( $_REQUEST['export_csv'] ) ) {
global $wpdb;
$csv_source_array = $wpdb->get_results ( $wpdb->prepare( " SELECT name, email, time, text FROM {$table_name} " ), ARRAY_N );
$csv_file_name = 'nba.rally.'.date(Ymd).'.csv';
$csv_header_array = array( "Name", "Email", "Date", "Message" );
if (isset($csv_source_array)) {
header('Content-type: application/csv');
header('Content-Disposition: attachment; filename="' . $csv_file_name . '"');
ob_start();
$f = fopen('php://output', 'w') or show_error("Can't open php://output");
$n = 0;
if (isset($csv_header_array)) {
if ( !fputcsv($f, $csv_header_array, ';'))
{
echo "Can't write line $n: $line";
}
}
foreach ($csv_source_array as $line)
{
$n++;
if ( !fputcsv($f, $line, ';'))
{
echo "Can't write line $n: $line";
}
}
fclose($f) or show_error("Can't close php://output");
$csvStr = ob_get_contents();
ob_end_clean();
echo $csvStr;
}
}
感谢您提出任何答案。
答案 0 :(得分:2)
我修好了。
我已将该代码插入插件顶部。
我认为因为标题应该在脚本的头部发送,然后在加载文档之前或标记之后发送。
注意:
HTTP状态标题行将始终是第一个发送到客户端的,无论实际的header()调用是否为第一个。除非已经发送了HTTP标头,否则可以通过随时调用带有新状态行的header()来覆盖状态。