WordPress 플러그인의 함수에서 CSV 파일을 다운로드하는 방법은 무엇입니까?
CSV 파일로 데이터를 다운로드할 수 있도록 클라이언트용 플러그인을 구축했습니다.사용자가 메뉴에서 링크를 클릭하면 CSV가 자동으로 다운로드되도록 설정되어 있습니다.다만, WordPress 백엔드의 페이지로서 기능을 로드하는 것 뿐입니다.
이 함수의 코드는 다음과 같습니다.
function download_payment_csv() {
include 'lib/connection.php';
$csv_output = '';
$values = $db->query('SELECT * FROM tbPayments ORDER BY date DESC');
$i=0;
while ($rowr = mysql_fetch_row($values)) {
for ($j=0;$j<$i;$j++) {
$csv_output .= $rowr[$j].",";
}
$csv_output .= "\n";
}
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_output;
}
말씀드렸듯이 빈 화면이 나타납니다.어떤 도움이라도 주시면 감사하겠습니다!
편집 이것이 제가 현재 사용하고 있는 코드입니다. 이미 말한 것을 일부만 떼어내면 됩니다.
function download_payment_csv() {
include 'lib/connection.php';
$csv_output = '';
$values = load_payment_csv();
$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: attachment; filename=".$filename.".csv");
// Disable caching
header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1
header("Pragma: no-cache"); // HTTP 1.0
header("Expires: 0"); // Proxies
header("Content-Transfer-Encoding: UTF-8");
if(count($values) > 0) {
foreach($values as $result) {
fputcsv($fp, $result);
}
}
fclose($fp);
}
이로 인해 CSV가 생성되지만 CSV에 문제가 있습니다.문제는 페이지를 볼 때 CSV로 다운로드되지 않고 CSV의 내용만 페이지에 출력한다는 것입니다.단, 플러그인 상단에 이 기능을 추가합니다.
add_action('admin_init','download_payment_csv');
그러면 메뉴 링크를 클릭하면 다운로드가 트리거되며, 이 링크는 정상입니다.그러나 플러그인의 모든 메뉴 항목에 대해 트리거됩니다. 이는 잘못된 것입니다.다운로드 링크를 클릭했을 때만 트리거됩니다.
/** * 상위 제목 행에 대한 쿼리 */
$results = $wpdb->get_results("SHOW COLUMNS FROM $table" );
if(count($results) > 0){
foreach($results as $result){
$csv_output .= str_replace('_',' ',$result->Field).", "; // , or ;
}
}
$csv_output .= "\n";
/** * 필요한 모든 데이터에 대한 쿼리 */
$results = $wpdb->get_results("SELECT * FROM $table",ARRAY_A );
if(count($results) > 0){
foreach($results as $result){
$result = array_values($result);
$result = implode(", ", $result);
$csv_output .= $result."\n";
}
}
/** * 내보낼 파일 이름 및 CSV 파일 준비 */
$filename = $file."_".date("Y-m-d_H-i",time());
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header( "Content-disposition: filename=".$filename.".csv");
print $csv_output;
exit;
이 모든 것을 함수에 넣으면 효과가 있습니다.
이것을 시험해 보세요.
<?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><a href="site_url()/wp-admin/admin.php?page=download_report&download_report">Export the Subscribers</a>';
}
/**
* 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();
일부 헤더 정보를 변경해야 합니다.
header('Content-Type: text/csv');
header('Content-Disposition: attachment;filename="report.csv"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
// If you're serving to IE over SSL, then the following may be needed
header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0
그 후 php://output을 사용하여 브라우저에 직접 데이터를 제공하면 공백 페이지가 방지됩니다.
예를 들어 다음과 같습니다.
$outstream = fopen("php://output", "w");
foreach($result as $result)
{
fputcsv($outstream, $result);
}
fclose($outstream);
exit();
php://output은 데이터를 요청자에게 직접 제공할 수 있는 읽기 전용 스트림입니다.
편집: $wpdb도 사용해야 합니다.
HTML 코드를 출력하는 코드로 인해 많은 문제를 겪은 후 사이트 전면에서 사용했을 때 찾은 해결책입니다.관건은 출구를 '다이'로 바꾸는 것이다.이것은 제 사이트에서 사용하고 있는 코드입니다.
header('Content-Type: text/csv');
$FileName = 'Content-Disposition: attachment; filename="'. 'Report.csv"';
header($FileName);
$fp = fopen('php://output', 'w');
$header_row = array(
0 => 'data1',
1 => 'data2',
2 => 'data3',
);
fputcsv($fp, $header_row);
$rows = GetDataBaseData();
if(!empty($rows))
{
foreach($rows as $Record)
{
// where data1, data2, data3 are the database column names
$OutputRecord = array($Record['data1'], $Record['data1'], $Record['data1']);
fputcsv($fp, $OutputRecord);
}
unset($rows);
}
fclose( $fp );
die; <===== key point. Use DIE not Exit. Exit will only work on the back end. Die will work on both.
```
Works on the front and backend of wordpress.
언급URL : https://stackoverflow.com/questions/32012440/how-to-download-csv-file-from-function-in-wordpress-plugin
'programing' 카테고리의 다른 글
국가/스토어에서 레독스가 기능을 통해 물건을 얻는 방법은 무엇입니까? (0) | 2023.04.05 |
---|---|
AngularJS - 백엔드에서 프런트엔드로 값 전달 (0) | 2023.04.05 |
Oracle의 DATIFF 함수 (0) | 2023.04.05 |
반응 테스트 라이브러리 - 빈 div가 있는지 점검하십시오. (0) | 2023.04.05 |
글로벌 스코프의 확대는 외부 모듈 또는 주변 모듈 선언에만 직접 중첩할 수 있습니다(2669). (0) | 2023.04.05 |