Я построил плагин для клиента, чтобы они могли загружать данные в виде файла CSV. Он был настроен так, что, когда пользователь нажимает на ссылку в меню, CSV должен просто автоматически загружаться. Однако это не совсем так, и просто загружает функцию в качестве страницы в бэкэнд WordPress.
Это код, который у меня есть для функции:
function download_payment_csv() {
include 'lib/connection.php';
$csv_output = '';
$values = $db->query('SELECT * FROM tbPayments ORDER BY date DESC');
$i=0;
while ($rowr = mysql_fetch_row($values)) {
for ($j=0;$j<$i;$j++) {
$csv_output .= $rowr[$j].",";
}
$csv_output .= "\n";
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"report.csv\";" );
header("Content-Transfer-Encoding: binary");
echo $csv_output;
}
И, как я уже сказал, он просто возвращает пустой экран. Любая помощь будет оценена!
ИЗМЕНИТЬ Итак, это код, с которым я сейчас работаю, принимая бит от уже сказанного.
function download_payment_csv() {
include 'lib/connection.php';
$csv_output = '';
$values = load_payment_csv();
$fp = fopen("php://output", "w");
$file = 'test_export';
$filename = $file."_".date("Y-m-d_H-i",time());
header("Content-Type: text/csv");
header("Content-Disposition: attachment; filename=".$filename.".csv");
// Disable caching
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1
header("Pragma: no-cache"); // HTTP 1.0
header("Expires: 0"); // Proxies
header("Content-Transfer-Encoding: UTF-8");
if(count($values) > 0) {
foreach($values as $result) {
fputcsv($fp, $result);
}
}
fclose($fp);
}
Это генерирует CSV, но есть проблема с ним. Проблема в том, что при просмотре страницы она не загружает его как CSV, а просто выводит содержимое CSV на страницу. Однако добавление этой функции в начало плагина:
add_action('admin_init','download_payment_csv');
Затем запускается загрузка при нажатии ссылки на меню, что хорошо. Но это вызывает его для каждого элемента меню в плагине, что неверно. Он должен запускаться только при нажатии ссылки на скачивание.