打扰一下::我的英文写作很糟糕:)) 我正在开发一个wordpress插件,我需要通过rest api和excel格式从自定义表中获取一些行。 通过此代码,可以在wordpress根目录中创建excel文件并进行查询,但是我无法在请求地址时下载此文件, 当请求地址时,下载的excell文件为空,并在其中写入“ resources ...” 请帮助我,谢谢
add_action( 'rest_api_init', 'wpc_register_wp_api_endpoints' );
function wpc_register_wp_api_endpoints() {
register_rest_route( 'api', '/output/', array(
'methods' => 'GET',
'callback' => 'wpc_somename_search_callback',
'args' => array(
'date' => array(
'required' => true,
)
)
));
}
function wpc_somename_search_callback( $request ) {
global $wpdb;
$date = $request['date'];
$query = "SELECT * FROM {$wpdb->prefix}tickets where inroute_id=16 and date='$date'";
$list = $wpdb->get_results($query);
$jsonDecoded = json_decode( json_encode($list), true);
$fileName = 'example.csv';
$fp = fopen($fileName, 'w');
foreach($jsonDecoded as $row){
fputcsv($fp, $row);
}
fclose($fp);
header('Content-disposition: attachment; filename='.$fileName);
header('Content-type: application/json');
print $fp;
exit;
}
我的要求是
http://yootaabmarine.ir/wp-json/api/output/?date=13970822
答案 0 :(得分:0)
我认为$jsonDecoded = json_decode( json_encode($list), true);
在您的代码中毫无用处,您将数组转换为JSON字符串,然后将其转换回数组,最好直接使用$list
。
$fp
包含一个资源,该资源本身就是一种PHP类型(请参阅doc fopen函数的返回类型为resource
),并且该资源与字符串完全不同。 ,因此您不能使用print $fp;
。
我们可以使用readfile将文件正确发送到浏览器,这是一种解决方案:
function wpc_somename_search_callback( $request ) {
global $wpdb;
$date = $request['date'];
$query = "SELECT * FROM {$wpdb->prefix}tickets where inroute_id=16 and date='$date'";
$list = $wpdb->get_results($query);
$fileName = 'example.csv';
$fp = fopen($fileName, 'w');
foreach($list as $row){
fputcsv($fp, $row);
}
fclose($fp);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'. $fileName .'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($fileName));
readfile($fileName);
exit;
}
当心SQL注入,请改用prepared queries。