Los encabezados ya enviaron un error con el complemento de exportación CSV

2

He creado un complemento de Wordpress que permite al usuario exportar todas las páginas, con sus niveles y URL, a un archivo csv.

El problema que tengo es que continúo recibiendo mensajes de error cuando intento exportar el archivo csv:

  

Advertencia: no se puede modificar la información del encabezado; los encabezados ya se enviaron

He comprobado la configuración & Archivos de funciones para espacios, además de probar diferentes instalaciones, ¡¡pero aún no pueden hacer que esto funcione!

¿Alguien sabe cómo arreglar esto, por favor?

Código de complemento:

/*
Plugin Name: Your Site's Functionality Plugin
Description: All of the important functionality of your site belongs in this.
Version: 0.1
License: GPL
Author: Your Name
Author URI: yoururl
*/
add_action('admin_menu', 'my_page_export_menu');

function my_page_export_menu() {
   add_submenu_page('edit-pages.php', __("Wordpress Export Pages to CSV", "my-page-export"), __("Export Page List", "my_page_export_menu"), 'edit_pages', __FILE__,'my_page_export_menu_options');
}

function my_page_export_menu_options() {

echo '<div id="treecontrol" style="margin:20px 0;position:relative;">
    <form method="post" id="download_form" action=""><input type="submit" name="download_csv" class="button-primary" value="Export" /></form>
</div>';

if ( isset($_POST['download_csv']) ) {

    $text = wp_list_pages("echo=0&title_li=");
    $html = preg_replace('/class=".*?"/', '', $text);
    $html = strip_tags($html, '<ul>, <li>, <a>');
    $html = '<ul>'.$html.'</ul>';

    function get_depth(DOMElement $element)
    {
        $depth = -1;
        while (
            $element->parentNode->tagName === 'li' || 
            $element->parentNode->tagName === 'ul'
        ) {
            if ($element->parentNode->tagName === 'ul') {
                $depth++;
            }
            $element = $element->parentNode;
        }
        return $depth;
    }

    $dom = new DOMDocument;
    $dom->preserveWhiteSpace = false;
    $dom->loadHTML($html);
    echo '<pre>';
    $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: csv" . date("Y-m-d") . ".csv");
    header( "Content-disposition: filename=".$filename.".csv");
    header("Pragma: no-cache");
    header("Expires: 0");

    foreach ($dom->getElementsByTagName('a') as $li) {
     printf(
          '%s%s%s', 
          str_repeat(',', get_depth($li)),
          trim($li->childNodes->item(0)->nodeValue),
          ',,,,=HYPERLINK("'.$li->getAttribute( 'href' ).'")'.PHP_EOL
      );
    }           
    echo '</pre>';

} else {
    echo '<ul>';
    wp_list_pages("&title_li=");
    echo '</ul>';
}

}

    
pregunta sta777 11.04.2013 - 17:48

2 respuestas

4

Mueva su código de descarga / salida a gancho admin_init. Este gancho se llama antes de que algo salga. Deberia de funcionar.

<?php 
/*
Plugin Name: Your Site's Functionality Plugin
Description: All of the important functionality of your site belongs in this.
Version: 0.1
License: GPL
Author: Your Name
Author URI: yoururl
*/
add_action('admin_menu', 'my_page_export_menu');

add_action('admin_init','wpse9876_download_csv');
function my_page_export_menu() {
   add_submenu_page('edit-pages.php', __("Wordpress Export Pages to CSV", "my-page-export"), __("Export Page List", "my_page_export_menu"), 'edit_pages', __FILE__,'my_page_export_menu_options');
}


function wpse9876_download_csv(){

    if ( isset($_POST['download_csv']) ) {

        $text = wp_list_pages("echo=0&title_li=");
        $html = preg_replace('/class=".*?"/', '', $text);
        $html = strip_tags($html, '<ul>, <li>, <a>');
        $html = '<ul>'.$html.'</ul>';

        function get_depth(DOMElement $element)
        {
            $depth = -1;
            while (
                    $element->parentNode->tagName === 'li' ||
                    $element->parentNode->tagName === 'ul'
            ) {
                if ($element->parentNode->tagName === 'ul') {
                    $depth++;
                }
                $element = $element->parentNode;
            }
            return $depth;
        }

        $dom = new DOMDocument;
        $dom->preserveWhiteSpace = false;
        $dom->loadHTML($html);
        echo '<pre>';
        $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: csv" . date("Y-m-d") . ".csv");
        header( "Content-disposition: filename=".$filename.".csv");
        header("Pragma: no-cache");
        header("Expires: 0");

        foreach ($dom->getElementsByTagName('a') as $li) {
            printf(
                    '%s%s%s',
                    str_repeat(',', get_depth($li)),
                    trim($li->childNodes->item(0)->nodeValue),
                    ',,,,=HYPERLINK("'.$li->getAttribute( 'href' ).'")'.PHP_EOL
            );
        }
        echo '</pre>';
        exit;
    }
}

function my_page_export_menu_options() {

echo '<div id="treecontrol" style="margin:20px 0;position:relative;">
    <form method="post" id="download_form" action=""><input type="submit" name="download_csv" class="button-primary" value="Export" /></form>
</div>';

echo '<ul>';
wp_list_pages("&title_li=");
echo '</ul>';

}
    
respondido por el Rajeev Vyas 11.04.2013 - 17:58
2

Tienes

echo '<pre>';

justo antes de configurar tus encabezados. Eso lo romperá.

Además, no mostró el mensaje de error completo "No se puede modificar ...". Debe incluir direcciones a la línea exacta de código que causa el problema.

    
respondido por el vancoder 11.04.2013 - 18:29

Lea otras preguntas en las etiquetas