Я пытаюсь сделать несколько отчетов для моего плагина WordPress. Эти отчеты должны быть загружены как Excel. По сути, я создал кнопку, и когда она будет нажата, я сделаю запрос к базе данных и получу отличные результаты.
Теперь мне нужно изменить заголовок, чтобы вернуть результаты в виде файла Excel. Вот как я это сделал:
header('Content-Disposition: attachment; filename='.$filename.'.xls');
header('Content-type: application/force-download');
header('Content-Transfer-Encoding: binary');
header('Pragma: public');
print "\xEF\xBB\xBF"; // UTF-8 BOM
Проблема в том, что он возвращает следующую ошибку:
Warning: Cannot modify header information - headers already sent by (output started at .....\wp-admin\menu-header.php:137)
Мне, вероятно, нужен для этого ob_start (), но разве ob_start () не следует размещать ДО первого заголовка (который находится в основных файлах WordPress). Я предпочитаю не изменять основные файлы, если это возможно.
Или, может быть, WordPress ‘собственный хук’ send_headers ‘? но я не могу заставить его работать, он все еще генерирует ту же ошибку.
Так что мне нужно, чтобы решить эту проблему? Существует ли другой способ создания файла Excel из плагина WordPress?
Любая помощь приветствуется!
Вы отправляете заголовок слишком поздно, так как header () уже отправлен в menu-header.php. Из предоставленного кода я не вижу, в какой момент вы отправляете заголовок, но хорошее место будет в plugins_loaded действие, так как эта ловушка действия вызывается, когда все плагины были загружены, и перед отправкой любого вывода.
Ссылка для скачивания может выглядеть так:
<a href="<?php echo admin_url( '?download' ); ?>">download</a>
И, действие plugins_loaded:
add_action( 'plugins_loaded', function() {
if ( isset( $_GET['download'] ) ) {
// here you can create .xls file
header('Content-Disposition: attachment; filename='.$filename.'.xls');
header('Content-type: application/force-download');
header('Content-Transfer-Encoding: binary');
header('Pragma: public');
die();
}
});
Других решений пока нет …