Как загрузить экспортированный CSV-файл в WordPress

#php #wordpress #csv #http-headers #export-to-csv

#php #wordpress #csv #http-заголовки #экспорт в csv

Вопрос:

Я работаю над плагином, который создает меню в wp-admin / side и показывает таблицу с некоторыми данными. Мне нужно сгенерировать CSV (все будет правильно) и дать пользователю возможность автоматически загружать его. Я знаю, что мне нужно добавить заголовки, подобные этим

 header('Content-type: application/csv');
header('Content-Disposition: attachment; filename="' . $csv_file_name . '"');
  

Но, к сожалению, это не работает на стороне администратора WordPress.
Опять же — генерация CSV выполняется правильно, но он отображает только текст файла csv под таблицей, но не передает файл

Вот полный код

 if ( isset( $_REQUEST['export_csv'] ) ) {
        global $wpdb;
        $csv_source_array = $wpdb->get_results ( $wpdb->prepare( " SELECT name, email, time, text FROM {$table_name} " ), ARRAY_N );
        $csv_file_name = 'nba.rally.'.date(Ymd).'.csv';
        $csv_header_array = array( "Name", "Email", "Date", "Message" );        

            if (isset($csv_source_array)) {

                header('Content-type: application/csv');
                header('Content-Disposition: attachment; filename="' . $csv_file_name . '"');

            ob_start();
                $f = fopen('php://output', 'w') or show_error("Can't open php://output");
                $n = 0;


                    if (isset($csv_header_array)) {
                        if ( !fputcsv($f, $csv_header_array, ';'))
                        {
                            echo "Can't write line $n: $line";
                        }
                    }

                foreach ($csv_source_array as $line)
                {
                    $n  ;

                    if ( !fputcsv($f, $line, ';'))
                    {
                        echo "Can't write line $n: $line";
                    }
                }
                fclose($f) or show_error("Can't close php://output");
                $csvStr = ob_get_contents();
                ob_end_clean();

                echo $csvStr;
            }


        }   
  

Заранее спасибо за любые ответы.

Ответ №1:

Я это исправил.

Я вставил этот код в верхнюю часть плагина.

Я думаю, потому что заголовки должны отправляться в начале скрипта и перед загрузкой документа или после тега.

Примечание:

Строка заголовка HTTP status всегда будет первой, отправленной клиенту, независимо от того, является ли фактический вызов header() первым или нет. Статус может быть переопределен вызовом header () с новой строкой состояния в любое время, если HTTP-заголовки уже не были отправлены.

от php.net/manual/en/function .header.php