wordpress rest api发送空的json文件

时间:2018-11-17 18:50:34

标签: wordpress wordpress-rest-api

打扰一下::我的英文写作很糟糕:)) 我正在开发一个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

1 个答案:

答案 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