Export to csv wordpress

I need to export data in one table to a csv file. I can get the data in order, but the CSV file is not created by the browser.

My code looks like this: a problem with the headers. I get only output with commas, but I do not get the csv file.

/* Converting data to CSV */ public function CSV_GENERATE($getTable) { ob_clean(); global $wpdb; $field=''; $getField =''; if($getTable){ $result = $wpdb->get_results("SELECT * FROM $getTable"); $requestedTable = mysql_query("SELECT * FROM ".$getTable); // echo "hey";die;//var_dump($result);die; $fieldsCount = mysql_num_fields($requestedTable); for($i=0; $i<$fieldsCount; $i++){ $field = mysql_fetch_field($requestedTable); $field = (object) $field; $getField .= $field->name.','; } $sub = substr_replace($getField, '', -1); $fields = $sub; # GET FIELDS NAME $each_field = explode(',', $sub); $csv_file_name = $getTable.'_'.date('Ymd_His').'.csv'; # CSV FILE NAME WILL BE table_name_yyyymmdd_hhmmss.csv # GET FIELDS VALUES WITH LAST COMMA EXCLUDED foreach($result as $row){ for($j = 0; $j < $fieldsCount; $j++){ if($j == 0) $fields .= "\n"; # FORCE NEW LINE IF LOOP COMPLETE $value = str_replace(array("\n", "\n\r", "\r\n", "\r"), "\t", $row->$each_field[$j]); # REPLACE NEW LINE WITH TAB $value = str_getcsv ( $value , ",", "\"" , "\\"); # SEQUENCING DATA IN CSV FORMAT, REQUIRED PHP >= 5.3.0 $fields .= $value[0].','; # SEPARATING FIELDS WITH COMMA } $fields = substr_replace($fields, '', -1); # REMOVE EXTRA SPACE AT STRING END } header("Content-type: text/x-csv"); # DECLARING FILE TYPE header("Content-Transfer-Encoding: binary"); header("Content-Disposition: attachment; filename=".$csv_file_name); # EXPORT GENERATED CSV FILE header("Pragma: no-cache"); header("Expires: 0"); header("Content-type: application/x-msdownload"); //header("Content-Disposition: attachment; filename=data.csv"); return $fields; } 
+7
source share
4 answers

Now it works fine. we can use this as a plugin. I changed this post. thanks sruthi sri.

Hope this helps someone :)

 <?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(); 
+7
source

I'm late, but made a slight “improvement” to the code that you guys worked with and would like to share. If the code inserted into the main .php plugin file, you do not need to go through 3 steps. Just change the values ​​at the bottom of the script as needed. I like to keep it clean, although with lots of comments for you guys.

For beginners who may need this, and to increase flexibility for everyone:

  • First add the global variable define('MY_PLUGIN_DIR', plugin_dir_path(__FILE__));
  • After that add require_once(PARTS_MY_PLUGIN_DIR . '/databasestuff/table_to_csv.php')
  • In your_plugin_directory/databasestuff/table_to_csv.php save the following class and change the last few lines as needed.
  • Make changes 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 own within a class so lets assign it to local object. $this->table_name = $table_n; $this->separator = $sep; $generatedDate = date('dmY 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 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:

  • The table prefix will be added to the table name.
  • This script uses the basic WordPress features, meaning that the last 3 lines are literally all you need to change for this to work.
+3
source

I'm not sure, but there are a few things that could be.

Your curly braces do not match - somewhere there is no closing } .

Actually you do not send the generated content anywhere unless you do it in the calling program? Maybe you mean echo $fields; , not return $fields; ?

You call ob_clean() - do you have output buffering enabled? Perhaps you mean ob_end_clean() - ob_end_clean() buffer and disable buffering?

I create a CSV for export; it only works with 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 from your calls:

  • you send two Content-Type headers
  • I have quotes around my file name
  • I do not specify Content-Transfer-Encoding

I do not know that any of these differences are related to your problem, I just list them in case they help.

+2
source

Just making small adjustments for @Developer, as it didn’t quite pull up in the admin panel or load csv. But now it will be :):

 <?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 the csv_export.php file, put it in the plugins / csv_export / and you gtg!

+2
source

All Articles