Как правильно сделать плагин WordPress возвращает загружаемый файл Excel

Я пытаюсь сделать несколько отчетов для моего плагина 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?

Любая помощь приветствуется!

3

Решение

Вы отправляете заголовок слишком поздно, так как 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();
}
});
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]