WordPress Rest API отправить пустой файл JSON - PullRequest
0 голосов
/ 17 ноября 2018

извините :: мой английский очень плохой :)) Я разрабатываю плагин для WordPress, и мне нужно получить строку из пользовательской таблицы с помощью остальных API и формата Excel. по этим кодам, Excel файл создать в WordPress корень и запрос работает, но я не могу скачать это, когда запросить адрес, когда запросить адрес, файл excell, который загружен, пуст и просто пишет "ресурс ..." в нем пожалуйста, помогите мне, спасибо

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 голосов
/ 18 ноября 2018

Я думаю, что $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, используйте подготовленные запросы вместо.

...