php 导出到 csv wordpress
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14160511/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
export to csv wordpress
提问by Developer
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.
我需要将数据导出到 csv 文件中的一个表中。我能够很好地获取数据,但浏览器未生成 CSV 文件。
My code is like this: its the problem with headers. I'm getting only the output with commas separated values but not getting csv file.
我的代码是这样的:它是标题的问题。我只得到逗号分隔值的输出,但没有得到 csv 文件。
/* 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;
}
回答by Developer
This is working perfectly now. we can use this as a plugin. I modified thispost. thanks to sruthi sri.
这现在工作得很好。我们可以将其用作插件。我修改了这个帖子。感谢 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();
回答by Dmitriy Kravchuk
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.
我是一个大器晚成的人,但对你们工作并想分享的代码做了一个小小的“改进”。如果代码粘贴在主插件 .php 文件中,则无需执行 3 个步骤。只需根据需要更改脚本底部的值。我喜欢保持整洁,尽管有很多评论给你们。
For beginners who might need this and to add flexibility for everyone to use:
对于可能需要此功能并为每个人增加灵活性以供使用的初学者:
- First add global variable
define('MY_PLUGIN_DIR', plugin_dir_path(__FILE__)); - After that add
require_once(PARTS_MY_PLUGIN_DIR . '/databasestuff/table_to_csv.php') - Under
your_plugin_directory/databasestuff/table_to_csv.phpsave 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 }
- 首先添加全局变量
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保存以下类并根据需要更改最后几行。 对最后几行进行调整
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:
记住:
- Table prefix will be added to the table name.
- This script uses core WordPress functions meaning that the last 3 lines is literally all you have to change for this to work.
- 表前缀将被添加到表名中。
- 此脚本使用核心 WordPress 功能,这意味着最后 3 行实际上是您必须更改的所有内容才能使其正常工作。
回答by cpres
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 :) :
只是对@Developer 进行了一些小的调整,因为它并没有在管理员中完全拉起,或者下载 csv。但现在它会:) :
<?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!
只需创建一个名为 csv_export.php 的文件,将其放入 plugins/csv_export/ 中,您就是 gtg!
回答by Hobo
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;?
您实际上并未将生成的内容发送到任何地方,除非您在调用例程中执行此操作?也许你的意思是echo $fields;,不是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?
您正在呼叫ob_clean()- 您是否打开了输出缓冲?也许您的意思是ob_end_clean()- 丢弃缓冲区并关闭缓冲?
I'm creating a CSV for export; it's working with just the following headers:
我正在创建一个用于导出的 CSV 文件;它仅使用以下标题:
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:
在与您通话的差异方面:
- you're sending two
Content-Typeheaders - I have quotes around my filename
- I'm not specifying a
Content-Transfer-Encoding
- 你要发送两个
Content-Type标题 - 我的文件名周围有引号
- 我没有指定一个
Content-Transfer-Encoding
I don't know that any of those differences are related to your problem, I'm just listing them in case they help.
我不知道这些差异中的任何一个都与您的问题有关,我只是列出它们以防万一。
回答by zhangyu12
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":
我遇到了同样的问题。我发现问题不是标题代码,而是您单击导出的链接。您需要添加一个名为“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.
最后两个标头告诉浏览器不要缓存导出的内容。

