I need to export data in one table in a csv file. I\'m able to get the data fine but the CSV file is not being generated by the browser.
My code is like this: its th
I'm not certain, but there are a few things it might be.
Your braces don't match - you're missing a closing } somewhere.
You're not actually sending the generated content anywhere, unless you're doing it in the calling routine? Maybe you mean echo $fields;, not return $fields;?
You're calling ob_clean() - do you have output buffering turned on? Perhaps you mean ob_end_clean() - to discard the buffer and turn buffering off?
I'm creating a CSV for export; it's working with just the following headers:
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="' . $csv_file_name . '"');
header('Pragma: no-cache');
header('Expires: 0');
In terms of differences with your calls:
Content-Type headersContent-Transfer-EncodingI don't know that any of those differences are related to your problem, I'm just listing them in case they help.
This is working perfectly now. we can use this as a plugin. I modified this post. thanks to sruthi sri.
Hope this helps some one :)
<?php
class CSVExport
{
/**
* Constructor
*/
public function __construct()
{
if(isset($_GET['download_report']))
{
$csv = $this->generate_csv();
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"report.csv\";" );
header("Content-Transfer-Encoding: binary");
echo $csv;
exit;
}
// Add extra menu items for admins
add_action('admin_menu', array($this, 'admin_menu'));
// Create end-points
add_filter('query_vars', array($this, 'query_vars'));
add_action('parse_request', array($this, 'parse_request'));
}
/**
* Add extra menu items for admins
*/
public function admin_menu()
{
add_menu_page('Download Report', 'Download Report', 'manage_options', 'download_report', array($this, 'download_report'));
}
/**
* Allow for custom query variables
*/
public function query_vars($query_vars)
{
$query_vars[] = 'download_report';
return $query_vars;
}
/**
* Parse the request
*/
public function parse_request(&$wp)
{
if(array_key_exists('download_report', $wp->query_vars))
{
$this->download_report();
exit;
}
}
/**
* Download report
*/
public function download_report()
{
echo '<div class="wrap">';
echo '<div id="icon-tools" class="icon32">
</div>';
echo '<h2>Download Report</h2>';
//$url = site_url();
echo '<p>Export the Subscribers';
}
/**
* Converting data to CSV
*/
public function generate_csv()
{
$csv_output = '';
$table = 'users';
$result = mysql_query("SHOW COLUMNS FROM ".$table."");
$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$csv_output = $csv_output . $row['Field'].",";
$i++;
}
}
$csv_output .= "\n";
$values = mysql_query("SELECT * FROM ".$table."");
while ($rowr = mysql_fetch_row($values)) {
for ($j=0;$j<$i;$j++) {
$csv_output .= $rowr[$j].",";
}
$csv_output .= "\n";
}
return $csv_output;
}
}
// Instantiate a singleton of this plugin
$csvExport = new CSVExport();
I'm a late bloomer, but made a small 'improvement' to the code you guys worked on and would like to share. If code pasted in the main plugin .php file you don't need to go through the 3 steps. Just change the values at the bottom of the script as required. I like to keep it neat though with plenty of comments for you guys.
For beginners who might need this and to add flexibility for everyone to use:
define('MY_PLUGIN_DIR',
plugin_dir_path(__FILE__));require_once(PARTS_MY_PLUGIN_DIR . '/databasestuff/table_to_csv.php')your_plugin_directory/databasestuff/table_to_csv.php save the following class and change the last few lines as required.Make adjustments to the last few lines
class export_table_to_csv{
private $db;
private $table_name;
private $separator;
function __construct($table_n, $sep, $filename){
global $wpdb; //We gonna work with database aren't we?
$this->db = $wpdb; //Can't use global on it's own within a class so lets assign it to local object.
$this->table_name = $table_n;
$this->separator = $sep;
$generatedDate = date('d-m-Y His'); //Date will be part of file name. I dont like to see ...(23).csv downloaded
$csvFile = $this->generate_csv(); //Getting the text generated to download
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false); //Forces the browser to download
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"" . $filename . " " . $generatedDate . ".csv\";" );
header("Content-Transfer-Encoding: binary");
echo $csvFile; //Whatever is echoed here will be in the csv file
exit;
}
function generate_csv(){
$csv_output = ''; //Assigning the variable to store all future CSV file's data
$table = $this->db->prefix . $this->table_name; //For flexibility of the plugin and convenience, lets get the prefix
$result = $this->db->get_results("SHOW COLUMNS FROM " . $table . ""); //Displays all COLUMN NAMES under 'Field' column in records returned
if (count($result) > 0) {
foreach($result as $row) {
$csv_output = $csv_output . $row->Field . $this->separator;
}
$csv_output = substr($csv_output, 0, -1); //Removing the last separator, because thats how CSVs work
}
$csv_output .= "\n";
$values = $this->db->get_results("SELECT * FROM " . $table . ""); //This here
foreach ($values as $rowr) {
$fields = array_values((array) $rowr); //Getting rid of the keys and using numeric array to get values
$csv_output .= implode($this->separator, $fields); //Generating string with field separator
$csv_output .= "\n"; //Yeah...
}
return $csv_output; //Back to constructor
}
}
// Also include nonce check here - https://codex.wordpress.org/WordPress_Nonces
if(isset($_POST['processed_values']) && $_POST['processed_values'] == 'download_csv'){ //When we must do this
$exportCSV = new export_table_to_csv('table_name',';','report'); //Make your changes on these lines
}
Keep in mind:
Just making some small adjustments to @Developer since it wasn't quite pulling up in the admin, or downloading the csv. But now it will :) :
<?php
/**
* CSV Exporter bootstrap file
*
* This file is read by WordPress to generate the plugin information in the plugin
* admin area. This file also includes all of the dependencies used by the plugin,
* registers the activation and deactivation functions, and defines a function
* that starts the plugin.
*
* @since 1.0.0
* @package CSV Export
*
* @wordpress-plugin
* Plugin Name: CSV Export
* Plugin URI: http://example.com/plugin-name-uri/
* Description: exports csvs derrr
* Version: 1.0.0
* Author: Your Name or Your Company
* Author URI: http://example.com/
* License: GPL-2.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
* Text Domain: csv-export
* Domain Path: /languages
*/
class CSVExport {
/**
* Constructor
*/
public function __construct() {
if (isset($_GET['report'])) {
$csv = $this->generate_csv();
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private", false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"report.csv\";");
header("Content-Transfer-Encoding: binary");
echo $csv;
exit;
}
// Add extra menu items for admins
add_action('admin_menu', array($this, 'admin_menu'));
// Create end-points
add_filter('query_vars', array($this, 'query_vars'));
add_action('parse_request', array($this, 'parse_request'));
}
/**
* Add extra menu items for admins
*/
public function admin_menu() {
add_menu_page('Download Report', 'Download Report', 'manage_options', 'download_report', array($this, 'download_report'));
}
/**
* Allow for custom query variables
*/
public function query_vars($query_vars) {
$query_vars[] = 'download_report';
return $query_vars;
}
/**
* Parse the request
*/
public function parse_request(&$wp) {
if (array_key_exists('download_report', $wp->query_vars)) {
$this->download_report();
exit;
}
}
/**
* Download report
*/
public function download_report() {
echo '<div class="wrap">';
echo '<div id="icon-tools" class="icon32">
</div>';
echo '<h2>Download Report</h2>';
echo '<p><a href="?page=download_report&report=users">Export the Subscribers</a></p>';
}
/**
* Converting data to CSV
*/
public function generate_csv() {
$csv_output = '';
$table = 'wp_users';
$result = mysql_query("SHOW COLUMNS FROM " . $table . "");
$i = 0;
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_assoc($result)) {
$csv_output = $csv_output . $row['Field'] . ",";
$i++;
}
}
$csv_output .= "\n";
$values = mysql_query("SELECT * FROM " . $table . "");
while ($rowr = mysql_fetch_row($values)) {
for ($j = 0; $j < $i; $j++) {
$csv_output .= $rowr[$j] . ",";
}
$csv_output .= "\n";
}
return $csv_output;
}
}
// Instantiate a singleton of this plugin
$csvExport = new CSVExport();
Just create a file called csv_export.php put it in a plugins/csv_export/ and you're gtg!
I met the same problem. I found that the problem is not the headers code, but the link you click to export. You need to add an argument named "noheader":
<a href="admin.php?page=export&export=posts&noheader=1">Export</a>
I replaced my code with exactly the same headers code mentioned in this question, and it does work as well. My export process code looks like:
if( isset( $_GET['export'] ) ) {
$csv = generate_csv();
$filename = 'results.csv';
$now = gmdate('D, d M Y H:i:s') . ' GMT';
header( 'Content-Type: application/octet-stream' ); // tells browser to download
header( 'Content-Disposition: attachment; filename="' . $filename .'"' );
header( 'Pragma: no-cache' ); // no cache
header( 'Expires: ' . $now ); // expire date
echo $csv;
exit;
}
The last two headers tell the browser not to cache the exported content.