Cómo hacer correctamente que un complemento de WordPress devuelva un archivo de Excel descargable

2 minutos de lectura

Estoy tratando de hacer algunos informes para mi complemento de wordpress. Estos informes deben ser descargables como Excel. Básicamente, lo que hice fue crear un botón y cuando se presionó ese botón, consultaré la base de datos y crearé un Excel a partir de los resultados.

Ahora necesito modificar el encabezado para devolver los resultados como un archivo de Excel. Así es como lo hice:

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

El problema es que devuelve el siguiente error:

Warning: Cannot modify header information - headers already sent by (output started at .....\wp-admin\menu-header.php:137) 

Probablemente necesito ob_start() para esto, pero no es que ob_start() deba colocarse ANTES del primer encabezado (que es de los archivos principales de WordPress). Prefiero no modificar los archivos principales si es posible.

¿O tal vez el gancho propio de WordPress ‘send_headers’? pero no puedo hacer que funcione, todavía genera el mismo error.

Entonces, ¿qué necesito para resolver este problema? ¿Existe otra forma de generar un archivo de Excel desde el complemento de wordpress?

¡Cualquier ayuda apreciada!

Envía un encabezado demasiado tarde porque header() ya se envió en menu-header.php. Desde el código proporcionado, no puedo ver en qué punto está enviando el encabezado, pero sería un buen lugar en complementos_cargados acción ya que ese enlace de acción se llama cuando se han cargado todos los complementos y antes de que se envíe cualquier salida.

El enlace para la descarga puede verse así:

<a href="https://stackoverflow.com/questions/26506359/<?php echo admin_url("?download' ); ?>">download</a>

Y, acción 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();      
    }
});

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad