¿Cómo modificar los encabezados para descargar un archivo en WordPress cuando los encabezados ya se están enviando en un archivo anterior?

3 minutos de lectura

En una de nuestras páginas de wordPress, nos gustaría descargar un archivo a través del navegador. Hasta donde yo sé, esto se hace modificando el encabezado para que la página crea que es un cierto tipo de archivo (.txt, por ejemplo). Sin embargo, tanto el tema como docenas de complementos se cargan antes de que se cargue esta página y muchos de ellos generan algún tipo de datos o modifican el encabezado de alguna manera que constantemente recibo el infame error de encabezado:

Advertencia: no se puede modificar la información del encabezado: los encabezados ya enviados por (salida iniciada en /home/keep/public_html/wp-content/themes/procyon/header.php:2) en /home/keep/public_html/wp-content/themes/ procyon/functions.php en la línea 97

Entonces, ¿cómo puedo eludir el hecho de que otros complementos están modificando la información del encabezado antes de lo que me gustaría? Seguramente debe haber alguno manera como otros complementos no tienen este problema entre sí.

Para aquellos de ustedes que aprecian ver algún tipo de esfuerzo, aquí está el código que estoy usando:

$tmp_handle = fopen('php://memory', 'r+');

foreach ($arr as $fields) {
    fputcsv($tmp_handle, $fields);
}

header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyVerySpecial.csv');
rewind($tmp_handle);

echo stream_get_contents($tmp_handle);

Realmente agradecería alguna ayuda en este asunto, ¡gracias!

  • Hola ! ¿Has encontrado una solución para eso? he tenido el mismo problema :/

    – jcdarocha

    12 de julio de 2017 a las 15:59

avatar de usuario
CE

Si todo lo que quiere hacer es hacer que el usuario descargue algo, entonces no necesita usar el sistema de plantillas. Está seguro de que no se ha generado nada antes de “template_redirect”, por lo que puede usar este hecho para escribir algo como esto:

add_action('template_redirect', 'download_page');
function download_page() {
    if($_GET['download'] == 'true') {
        //Output header information and the file content
        exit; // Stops WordPress from executing anything else.
    }
}

Ahora quizás necesite el sistema de plantillas para entregar el archivo, no lo sé, pero su descripción no lo establece específicamente.

  • Desafortunadamente, WordPress no me deja agregar una función como esa. Me dice “función inesperada…”

    usuario725913

    26 de enero de 2012 a las 14:19

  • Lo siento, probablemente tengas una versión de PHP anterior a la 5.3 (que es cuando se introdujeron las funciones anónimas). Esto se resuelve fácilmente creando una función ficticia con nombre. Actualicé el ejemplo, debería haberlo escrito de esa manera para empezar.

    – CE

    26 de enero de 2012 a las 19:13

Sácalo de WordPress. Tendrás que subir un nuevo archivo como headers.php y enlazarlo desde WordPress.

  • Ese es el tipo de pensamiento que estaba buscando, ¡gracias! Iré a probarlo y te cuento cómo me va.

    usuario725913

    26 de enero de 2012 a las 0:48

  • EDITAR: eso ni siquiera funcionó, cargó otro archivo PHP en el servidor remoto, lo llamó desde la página de wordpress.

    usuario725913

    26 de enero de 2012 a las 1:06

  • Y su nombre de archivo debe ser como: filename="MyVerySpecial.csv"

    – Paul Postre

    26 de enero de 2012 a las 1:12

  • Sí, estoy recibiendo el mismo error. Y cambiaré el nombre del archivo, pero tengo la sensación de que funciona de cualquier manera. Independientemente, sí, tengo el mismo error de encabezado.

    usuario725913

    26 de enero de 2012 a las 1:15

  • but I have a feeling it works either way podrías tener razón. eso no está causando este error, pero pensé en tirarlo. Cuando dices que lo llamas desde wordpress, ¿qué quieres decir exactamente con eso?

    – Paul Postre

    26 de enero de 2012 a las 1:19

¿Ha sido útil esta solución?