PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 1.6.5
Visualizer – Tables & Charts Manager with Built-in AI Generator v1.6.5
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 3.10.4 All 148 releases
visualizer / classes / Visualizer / Module / Chart.php

Chart.php in Visualizer – Tables & Charts Manager with Built-in AI Generator 1.6.5, at classes/Visualizer/Module/Chart.php

618 lines 20.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // +----------------------------------------------------------------------+
4 // | Copyright 2013 Madpixels (email : visualizer@madpixels.net) |
5 // +----------------------------------------------------------------------+
6 // | This program is free software; you can redistribute it and/or modify |
7 // | it under the terms of the GNU General Public License, version 2, as |
8 // | published by the Free Software Foundation. |
9 // | |
10 // | This program is distributed in the hope that it will be useful, |
11 // | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 // | GNU General Public License for more details. |
14 // | |
15 // | You should have received a copy of the GNU General Public License |
16 // | along with this program; if not, write to the Free Software |
17 // | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, |
18 // | MA 02110-1301 USA |
19 // +----------------------------------------------------------------------+
20 // | Author: Eugene Manuilov <eugene@manuilov.org> |
21 // +----------------------------------------------------------------------+
22
23 /**
24 * The module for all stuff related to getting, editing, creating and deleting charts.
25 *
26 * @category Visualizer
27 * @package Module
28 *
29 * @since 1.0.0
30 */
31 class Visualizer_Module_Chart extends Visualizer_Module {
32
33 const NAME = __CLASS__;
34
35 /**
36 * The chart object.
37 *
38 * @since 1.0.0
39 *
40 * @access private
41 * @var WP_Post
42 */
43 private $_chart;
44
45 /**
46 * Constructor.
47 *
48 * @since 1.0.0
49 *
50 * @access public
51 * @param Visualizer_Plugin $plugin The instance of the plugin.
52 */
53 public function __construct( Visualizer_Plugin $plugin ) {
54 parent::__construct( $plugin );
55
56 $this->_addAjaxAction( Visualizer_Plugin::ACTION_GET_CHARTS, 'getCharts' );
57 $this->_addAjaxAction( Visualizer_Plugin::ACTION_DELETE_CHART, 'deleteChart' );
58 $this->_addAjaxAction( Visualizer_Plugin::ACTION_CREATE_CHART, 'renderChartPages' );
59 $this->_addAjaxAction( Visualizer_Plugin::ACTION_EDIT_CHART, 'renderChartPages' );
60 $this->_addAjaxAction( Visualizer_Plugin::ACTION_UPLOAD_DATA, 'uploadData' );
61 $this->_addAjaxAction( Visualizer_Plugin::ACTION_CLONE_CHART, 'cloneChart' );
62
63 // Added by Ash/Upwork
64 $this->_addAjaxAction( Visualizer_Plugin::ACTION_EXPORT_DATA, 'exportData' );
65 if( defined( 'Visualizer_Pro' ) ){
66 global $Visualizer_Pro;
67 list($action, $name, $class) = $Visualizer_Pro->_getAjaxAction($this);
68 $this->_addAjaxAction($action, $name, $class);
69 }
70 // Added by Ash/Upwork
71
72 }
73
74 /**
75 * Sends json response.
76 *
77 * @since 1.0.0
78 *
79 * @access private
80 * @param array $results The response array.
81 */
82 public function _sendResponse( $results ) {
83 header( 'Content-type: application/json' );
84 nocache_headers();
85
86 echo json_encode( $results );
87 exit;
88 }
89
90 /**
91 * Returns chart data required for rendering.
92 *
93 * @since 1.0.0
94 *
95 * @access private
96 * @param WP_Post $chart The chart object.
97 * @return array The array of chart data.
98 */
99 private function _getChartArray( WP_Post $chart = null ) {
100 if ( is_null( $chart ) ) {
101 $chart = $this->_chart;
102 }
103
104 $type = get_post_meta( $chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
105 $series = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_SERIES, get_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, true ), $chart->ID, $type );
106 $data = apply_filters( Visualizer_Plugin::FILTER_GET_CHART_DATA, unserialize( $chart->post_content ), $chart->ID, $type );
107
108 return array(
109 'type' => $type,
110 'series' => $series,
111 'settings' => get_post_meta( $chart->ID, Visualizer_Plugin::CF_SETTINGS, true ),
112 'data' => $data,
113 );
114 }
115
116 /**
117 * Fetches charts from database.
118 *
119 * @since 1.0.0
120 *
121 * @access public
122 */
123 public function getCharts() {
124 $query_args = array(
125 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
126 'posts_per_page' => 9,
127 'paged' => filter_input( INPUT_GET, 'page', FILTER_VALIDATE_INT, array(
128 'options' => array(
129 'min_range' => 1,
130 'default' => 1,
131 )
132 ) )
133 );
134
135 $filter = filter_input( INPUT_GET, 'filter', FILTER_SANITIZE_STRING );
136 if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes() ) ) {
137 $query_args['meta_query'] = array(
138 array(
139 'key' => Visualizer_Plugin::CF_CHART_TYPE,
140 'value' => $filter,
141 'compare' => '=',
142 ),
143 );
144 }
145
146 $query = new WP_Query( $query_args );
147
148 $charts = array();
149 while( $query->have_posts() ) {
150 $chart = $query->next_post();
151
152 $chart_data = $this->_getChartArray( $chart );
153 $chart_data['id'] = $chart->ID;
154
155 $charts[] = $chart_data;
156 }
157
158 $this->_sendResponse( array(
159 'success' => true,
160 'data' => $charts,
161 'total' => $query->max_num_pages,
162 ) );
163 }
164
165 /**
166 * Deletes a chart from database.
167 *
168 * @since 1.0.0
169 * @uses wp_delete_post() To delete a chart.
170 *
171 * @access public
172 */
173 public function deleteChart() {
174 $is_post = $_SERVER['REQUEST_METHOD'] == 'POST';
175 $input_method = $is_post ? INPUT_POST : INPUT_GET;
176
177 $chart_id = $success = false;
178 $nonce = wp_verify_nonce( filter_input( $input_method, 'nonce' ) );
179 $capable = current_user_can( 'delete_posts' );
180 if ( $nonce && $capable ) {
181 $chart_id = filter_input( $input_method, 'chart', FILTER_VALIDATE_INT, array( 'options' => array( 'min_range' => 1 ) ) );
182 if ( $chart_id ) {
183 $chart = get_post( $chart_id );
184 $success = $chart && $chart->post_type == Visualizer_Plugin::CPT_VISUALIZER;
185 }
186 }
187
188 if ( $success ) {
189 wp_delete_post( $chart_id, true );
190 }
191
192 if ( $is_post ) {
193 $this->_sendResponse( array( 'success' => $success ) );
194 }
195
196 wp_redirect( wp_get_referer() );
197 exit;
198 }
199
200 /**
201 * Renders appropriate page for chart builder. Creates new auto draft chart
202 * if no chart has been specified.
203 *
204 * @since 1.0.0
205 *
206 * @access public
207 */
208 public function renderChartPages() {
209 define ( 'IFRAME_REQUEST', 1 );
210
211 // check chart, if chart not exists, will create new one and redirects to the same page with proper chart id
212 $chart_id = filter_input( INPUT_GET, 'chart', FILTER_VALIDATE_INT );
213 if ( !$chart_id || !( $chart = get_post( $chart_id ) ) || $chart->post_type != Visualizer_Plugin::CPT_VISUALIZER ) {
214 $default_type = 'line';
215
216 $source = new Visualizer_Source_Csv( VISUALIZER_ABSPATH . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR . $default_type . '.csv' );
217 $source->fetch();
218
219 $chart_id = wp_insert_post( array(
220 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
221 'post_title' => 'Visualization',
222 'post_author' => get_current_user_id(),
223 'post_status' => 'auto-draft',
224 'post_content' => $source->getData(),
225 ) );
226
227 if ( $chart_id && !is_wp_error( $chart_id ) ) {
228 add_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, $default_type );
229 add_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, 1 );
230 add_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
231 add_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
232 add_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, array('focusTarget' => 'datum') );
233 }
234
235 wp_redirect( add_query_arg( 'chart', (int)$chart_id ) );
236 exit;
237 }
238
239 // enqueue and register scripts and styles
240 wp_register_style( 'visualizer-frame', VISUALIZER_ABSURL . 'css/frame.css', array(), Visualizer_Plugin::VERSION );
241
242 wp_register_script( 'visualizer-frame', VISUALIZER_ABSURL . 'js/frame.js', array( 'jquery' ), Visualizer_Plugin::VERSION, true );
243 wp_register_script( 'google-jsapi-new', '//www.gstatic.com/charts/loader.js', array(), null, true );
244 wp_register_script( 'google-jsapi-old', '//www.google.com/jsapi', array('google-jsapi-new'), null, true );
245 wp_register_script( 'visualizer-render', VISUALIZER_ABSURL . 'js/render.js', array( 'google-jsapi-old', 'google-jsapi-new', 'visualizer-frame' ), Visualizer_Plugin::VERSION, true );
246 wp_register_script( 'visualizer-preview', VISUALIZER_ABSURL . 'js/preview.js', array( 'wp-color-picker', 'visualizer-render' ), Visualizer_Plugin::VERSION, true );
247
248 // added by Ash/Upwork
249 if( defined( 'Visualizer_Pro' ) ){
250 global $Visualizer_Pro;
251 $Visualizer_Pro->_addScriptsAndStyles();
252 }
253
254 // dispatch pages
255 $this->_chart = $chart;
256 switch ( filter_input( INPUT_GET, 'tab' ) ) {
257 case 'settings':
258 // changed by Ash/Upwork
259 $this->_handleDataAndSettingsPage();
260 break;
261 case 'type':
262 default:
263 $this->_handleTypesPage();
264 break;
265 }
266
267 exit;
268 }
269
270 /**
271 * Handles chart type selection page.
272 *
273 * @since 1.0.0
274 *
275 * @access private
276 */
277 private function _handleTypesPage() {
278 // process post request
279 if ( $_SERVER['REQUEST_METHOD'] == 'POST' && wp_verify_nonce( filter_input( INPUT_POST, 'nonce' ) ) ) {
280 $type = filter_input( INPUT_POST, 'type' );
281 if ( in_array( $type, Visualizer_Plugin::getChartTypes() ) ) {
282 // save new chart type
283 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_CHART_TYPE, $type );
284
285 // if the chart has default data, update it with appropriate default data for new type
286 if ( filter_var( get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, true ), FILTER_VALIDATE_BOOLEAN ) ) {
287 $source = new Visualizer_Source_Csv( VISUALIZER_ABSPATH . DIRECTORY_SEPARATOR . 'samples' . DIRECTORY_SEPARATOR . $type . '.csv' );
288 $source->fetch();
289
290 $this->_chart->post_content = $source->getData();
291 wp_update_post( $this->_chart->to_array() );
292
293 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
294 }
295
296 // redirect to next tab
297 // changed by Ash/Upwork
298 wp_redirect( add_query_arg( 'tab', 'settings' ) );
299 return;
300 }
301 }
302
303 $render = new Visualizer_Render_Page_Types();
304 $render->type = get_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_CHART_TYPE, true );
305 $render->types = Visualizer_Plugin::getChartTypes();
306 $render->chart = $this->_chart;
307
308 wp_enqueue_style( 'visualizer-frame' );
309 wp_enqueue_script( 'visualizer-frame' );
310
311 wp_iframe( array( $render, 'render') );
312 }
313
314 /**
315 * Handles chart data page.
316 *
317 * @since 1.0.0
318 *
319 * @access private
320 */
321 private function _handleDataPage() {
322 $data = $this->_getChartArray();
323
324 $render = new Visualizer_Render_Page_Data();
325 $render->chart = $this->_chart;
326 $render->type = $data['type'];
327
328 unset( $data['settings']['width'], $data['settings']['height'] );
329
330 wp_enqueue_style( 'visualizer-frame' );
331 wp_enqueue_script( 'visualizer-render' );
332 wp_localize_script( 'visualizer-render', 'visualizer', array(
333 'l10n' => array(
334 'remotecsv_prompt' => esc_html__( 'Please, enter the URL of CSV file:', Visualizer_Plugin::NAME ),
335 'invalid_source' => esc_html__( 'You have entered invalid URL. Please, insert proper URL.', Visualizer_Plugin::NAME ),
336 ),
337 'charts' => array(
338 'canvas' => $data,
339 ),
340 ) );
341
342 // Added by Ash/Upwork
343 if( defined( 'Visualizer_Pro' ) ){
344 global $Visualizer_Pro;
345 $Visualizer_Pro->_enqueueScriptsAndStyles($data);
346 }
347 // Added by Ash/Upwork
348
349 $this->_addAction( 'admin_head', 'renderFlattrScript' );
350
351 wp_iframe( array( $render, 'render') );
352 }
353
354 // changed by Ash/Upwork
355 private function _handleDataAndSettingsPage(){
356 if ( $_SERVER['REQUEST_METHOD'] == 'POST' && wp_verify_nonce( filter_input( INPUT_GET, 'nonce' ) ) ) {
357 if ( $this->_chart->post_status == 'auto-draft' ) {
358 $this->_chart->post_status = 'publish';
359 wp_update_post( $this->_chart->to_array() );
360 }
361
362 update_post_meta( $this->_chart->ID, Visualizer_Plugin::CF_SETTINGS, $_POST );
363
364 $render = new Visualizer_Render_Page_Send();
365 $render->text = sprintf( '[visualizer id="%d"]', $this->_chart->ID );
366
367 wp_iframe( array( $render, 'render') );
368 return;
369 }
370
371 $data = $this->_getChartArray();
372
373 $sidebar = '';
374 $sidebar_class = 'Visualizer_Render_Sidebar_Type_' . ucfirst( $data['type'] );
375 if ( class_exists( $sidebar_class, true ) ) {
376 $sidebar = new $sidebar_class( $data['settings'] );
377 $sidebar->__series = $data['series'];
378 $sidebar->__data = $data['data'];
379 } else {
380 $sidebar = apply_filters("visualizer_pro_chart_type_sidebar", '', $data);
381 if ($sidebar != '') {
382 $sidebar->__series = $data['series'];
383 $sidebar->__data = $data['data'];
384 }
385 }
386
387 unset( $data['settings']['width'], $data['settings']['height'] );
388
389 wp_enqueue_style( 'visualizer-frame' );
390 wp_enqueue_style( 'wp-color-picker' );
391 wp_enqueue_style( 'visualizer-frame' );
392
393 wp_enqueue_script( 'visualizer-preview' );
394 wp_enqueue_script( 'visualizer-render' );
395 wp_localize_script( 'visualizer-render', 'visualizer', array(
396 'l10n' => array(
397 'remotecsv_prompt' => esc_html__( 'Please, enter the URL of CSV file:', Visualizer_Plugin::NAME ),
398 'invalid_source' => esc_html__( 'You have entered invalid URL. Please, insert proper URL.', Visualizer_Plugin::NAME ),
399 ),
400 'charts' => array(
401 'canvas' => $data,
402 ),
403 ) );
404
405 $render = new Visualizer_Render_Page_Data();
406 $render->chart = $this->_chart;
407 $render->type = $data['type'];
408
409 $render->sidebar = $sidebar;
410 if ( filter_input( INPUT_GET, 'library', FILTER_VALIDATE_BOOLEAN ) ) {
411 $render->button = filter_input( INPUT_GET, 'action' ) == Visualizer_Plugin::ACTION_EDIT_CHART
412 ? esc_html__( 'Save Chart', Visualizer_Plugin::NAME )
413 : esc_html__( 'Create Chart', Visualizer_Plugin::NAME );
414 } else {
415 $render->button = esc_attr__( 'Insert Chart', Visualizer_Plugin::NAME );
416 }
417
418 if( defined( 'Visualizer_Pro' ) ){
419 global $Visualizer_Pro;
420 $Visualizer_Pro->_enqueueScriptsAndStyles($data);
421 }
422
423 $this->_addAction( 'admin_head', 'renderFlattrScript' );
424
425 wp_iframe( array( $render, 'render') );
426 }
427 // changed by Ash/Upwork
428
429 /**
430 * Renders flattr script in the iframe <head>
431 *
432 * @since 1.4.2
433 * @action admin_head
434 *
435 * @access public
436 */
437 public function renderFlattrScript() {
438 echo '';
439 }
440
441 /**
442 * Parses uploaded CSV file and saves new data for the chart.
443 *
444 * @since 1.0.0
445 *
446 * @access public
447 */
448 public function uploadData() {
449 // validate nonce
450 if ( !wp_verify_nonce( filter_input( INPUT_GET, 'nonce' ) ) ) {
451 status_header( 403 );
452 exit;
453 }
454
455 // check chart, if chart exists
456 $chart_id = filter_input( INPUT_GET, 'chart', FILTER_VALIDATE_INT );
457 if ( !$chart_id || !( $chart = get_post( $chart_id ) ) || $chart->post_type != Visualizer_Plugin::CPT_VISUALIZER ) {
458 status_header( 400 );
459 exit;
460 }
461
462 $source = null;
463 $render = new Visualizer_Render_Page_Update();
464 if ( filter_input( INPUT_POST, 'remote_data', FILTER_VALIDATE_URL ) ) {
465 $source = new Visualizer_Source_Csv_Remote( $_POST['remote_data'] );
466 } elseif ( isset( $_FILES['local_data'] ) && $_FILES['local_data']['error'] == 0 ) {
467 $source = new Visualizer_Source_Csv( $_FILES['local_data']['tmp_name'] );
468
469 // Added by Ash/Upwork
470 } elseif ( defined( 'Visualizer_Pro' ) && isset( $_POST['chart_data'] ) && strlen( $_POST['chart_data'] ) > 0){
471 global $Visualizer_Pro;
472 $source = $Visualizer_Pro->_handleChartData($_POST['chart_data']);
473 // Added by Ash/Upwork
474
475 } else {
476 $render->message = esc_html__( "CSV file with chart data was not uploaded. Please, try again.", Visualizer_Plugin::NAME );
477 }
478
479 if ( $source ) {
480 if ( $source->fetch() ) {
481 $chart->post_content = $source->getData();
482 wp_update_post( $chart->to_array() );
483
484 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SERIES, $source->getSeries() );
485 update_post_meta( $chart->ID, Visualizer_Plugin::CF_SOURCE, $source->getSourceName() );
486 update_post_meta( $chart->ID, Visualizer_Plugin::CF_DEFAULT_DATA, 0 );
487
488 $render->data = json_encode( $source->getRawData() );
489 $render->series = json_encode( $source->getSeries() );
490 } else {
491 $render->message = esc_html__( "CSV file is broken or invalid. Please, try again.", Visualizer_Plugin::NAME );
492 }
493 }
494
495 $render->render();
496 exit;
497 }
498
499 /**
500 * Clones the chart.
501 *
502 * @since 1.0.0
503 *
504 * @access public
505 */
506 public function cloneChart() {
507 $chart_id = $success = false;
508 $nonce = wp_verify_nonce( filter_input( INPUT_GET, 'nonce' ), Visualizer_Plugin::ACTION_CLONE_CHART );
509 $capable = current_user_can( 'edit_posts' );
510 if ( $nonce && $capable ) {
511 $chart_id = filter_input( INPUT_GET, 'chart', FILTER_VALIDATE_INT, array( 'options' => array( 'min_range' => 1 ) ) );
512 if ( $chart_id ) {
513 $chart = get_post( $chart_id );
514 $success = $chart && $chart->post_type == Visualizer_Plugin::CPT_VISUALIZER;
515 }
516 }
517
518 $redirect = wp_get_referer();
519 if ( $success ) {
520 $new_chart_id = wp_insert_post( array(
521 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
522 'post_title' => 'Visualization',
523 'post_author' => get_current_user_id(),
524 'post_status' => $chart->post_status,
525 'post_content' => $chart->post_content,
526 ) );
527
528 if ( $new_chart_id && !is_wp_error( $new_chart_id ) ) {
529 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_CHART_TYPE, get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true ) );
530 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, get_post_meta( $chart_id, Visualizer_Plugin::CF_DEFAULT_DATA, true ) );
531 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SOURCE, get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true ) );
532 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SERIES, get_post_meta( $chart_id, Visualizer_Plugin::CF_SERIES, true ) );
533 add_post_meta( $new_chart_id, Visualizer_Plugin::CF_SETTINGS, get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true ) );
534
535 $redirect = add_query_arg( array(
536 'page' => 'visualizer',
537 'type' => filter_input( INPUT_GET, 'type' ),
538 ), admin_url( 'upload.php' ) );
539 }
540 }
541
542 wp_redirect( $redirect );
543 exit;
544 }
545
546 /**
547 * Exports the chart data
548 *
549 * @since 1.0.0
550 *
551 * @access public
552 */
553 public function exportData() {
554 check_ajax_referer(Visualizer_Plugin::ACTION_EXPORT_DATA . Visualizer_Plugin::VERSION, "security");
555
556 $chart_id = $success = false;
557 $capable = current_user_can( 'edit_posts' );
558 if ( $capable ) {
559 $chart_id = filter_input( INPUT_GET, 'chart', FILTER_VALIDATE_INT, array( 'options' => array( 'min_range' => 1 ) ) );
560 if ( $chart_id ) {
561 $chart = get_post( $chart_id );
562 $success = $chart && $chart->post_type == Visualizer_Plugin::CPT_VISUALIZER;
563 }
564 }
565
566 if ( $success ) {
567 $settings = get_post_meta($chart_id, Visualizer_Plugin::CF_SETTINGS, true);
568 $filename = $settings["title"];
569 if (empty($filename)) {
570 $filename = "export.csv";
571 } else {
572 $filename .= ".csv";
573 }
574 $rows = array();
575 $series = get_post_meta($chart_id, Visualizer_Plugin::CF_SERIES, true);
576 $data = unserialize($chart->post_content);
577 if (!empty($series)) {
578 $row = array();
579 foreach ($series as $array) {
580 $row[] = $array["label"];
581 }
582 $rows[] = $row;
583
584 $row = array();
585 foreach ($series as $array) {
586 $row[] = $array["type"];
587 }
588 $rows[] = $row;
589 }
590
591 if (!empty($data)) {
592 foreach ($data as $array) {
593 $rows[] = $array;
594 }
595 }
596
597 $fp = tmpfile();
598 foreach ($rows as $row) {
599 fputcsv($fp, $row);
600 }
601 rewind($fp);
602
603 $csv = "";
604 while (($array = fgetcsv($fp)) !== FALSE) {
605 if (strlen($csv) > 0) $csv .= PHP_EOL;
606 $csv .= implode(",", $array);
607 }
608 fclose($fp);
609
610 echo wp_send_json_success(array(
611 "csv" => $csv,
612 "name" => $filename
613 ));
614 }
615
616 exit;
617 }
618 }