PluginProbe
SQL Chart Builder / 2.3.8
SQL Chart Builder v2.3.8
3.0.2 3.0.1 trunk 1.0.2 1.0.3 2.2.2 2.3.0 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.3.7 2.3.7.1 2.3.7.2 2.3.8 3.0.0
sql-chart-builder / functions.php

functions.php in SQL Chart Builder 2.3.8, at functions.php

964 lines 34.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if (!defined('ABSPATH')) {
3 die;
4 }
5 //postinstall function
6 function guaven_sqlcharts_load_defaults()
7 {
8 if (get_option("guaven_sqlcharts_already_installed_2") === false) {
9 update_option("guaven_sqlcharts_already_installed_2", "1");
10 guaven_sqlcharts_install_first_data();
11
12 }
13 }
14
15 function guaven_sqlcharts_install_first_data()
16 {
17 require_once(dirname(__FILE__) . "/initial_data.php");
18 gvn_chart_sample_nonxml_data();
19 }
20
21
22 function guaven_sqlcharts_recommended(){
23 if(!class_exists('WooCommerce'))return;
24 $uid=(int)get_current_user_id();
25 if(isset($_GET["gvnsql_dismiss_recommendation"])){
26 update_option('gvnsql_dismiss_recommendation_'.$uid,1);
27 return;
28 }
29 if(get_option('gvnsql_dismiss_recommendation_'.$uid)!='')return;
30 return '<table class="gf-alert gf-alert-info" style="margin-top:20px">
31 <tbody><tr><td style="width: auto;vertical-align: top;padding: 20px;">
32 <h2>WooCommerce Search Engine – INSTANT, RELEVANT AND SMART Search Box</h2>
33 <h3>Turn your website search into Smart Search which find products by price, SKU, attributes, meta data, categorys, tags etc. </h3>
34 <p>“WooCommerce Search Engine” is a very powerful and easy to use WooCommerce Search Plugin which turns a simple search box of your WooCommerce Store to the powerful multifunctional magic box which helps you to sell more products. The plugin UI is compatible with ALL THEMES.</p>
35 <a target="_blank" style="border:0px solid #6200ee;border-radius:0px;color:white;font-weight:bold;background: #6200ee;" class="button button-secondary"
36 href="https://codecanyon.net/item/woocommerce-search-box/15685698">Get the Search Box </a>
37 </td><td style="position:relative">
38 <a href="'.admin_url().'/edit.php?post_type=gvn_schart&gvnsql_dismiss_recommendation=1'.'" style="position: absolute;right: 0;top: -15px;right: -10px;">{svg}
39 </a>
40 <img src="'.plugin_dir_url( __FILE__ ) . 'asset/img/recommended1.jpg" style="max-width: 430px;"></td></tr>
41 </tbody></table>';
42 }
43
44
45
46 function guaven_sqlcharts_my_admin_notice()
47 {
48 global $post;
49
50
51 if(
52 (!empty($_SERVER["REQUEST_URI"]) and strpos(sanitize_text_field(wp_unslash($_SERVER["REQUEST_URI"])),'post_type=gvn_schart')!==false)
53 or
54 (!empty($post) and $post->post_type == 'gvn_schart')
55 ){
56 echo str_replace('{svg}','<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="11" height="14" viewBox="0 0 11 14">
57 <path d="M10.141 10.328q0 0.312-0.219 0.531l-1.062 1.062q-0.219 0.219-0.531 0.219t-0.531-0.219l-2.297-2.297-2.297 2.297q-0.219 0.219-0.531 0.219t-0.531-0.219l-1.062-1.062q-0.219-0.219-0.219-0.531t0.219-0.531l2.297-2.297-2.297-2.297q-0.219-0.219-0.219-0.531t0.219-0.531l1.062-1.062q0.219-0.219 0.531-0.219t0.531 0.219l2.297 2.297 2.297-2.297q0.219-0.219 0.531-0.219t0.531 0.219l1.062 1.062q0.219 0.219 0.219 0.531t-0.219 0.531l-2.297 2.297 2.297 2.297q0.219 0.219 0.219 0.531z"></path>
58 </svg>',wp_kses_post(guaven_sqlcharts_recommended(),[]));
59 }
60
61
62
63 if (!empty($post) and $post->post_type == 'gvn_schart'):
64 if (!current_user_can('manage_options')) {
65 echo '<br><br>
66 <div class="updated gf-alert gf-alert-danger">Only administrators can manage this page</div>';
67 die();
68 }
69 echo '<div class="updated gf-alert gf-alert-info">';
70 if (empty($_GET["post"]) && strpos(sanitize_text_field(wp_unslash($_SERVER["REQUEST_URI"])), "post-new") === false) {
71 $gf_message = __(
72 'Use <b>Add new</b> button above to create a new SQL report. And click on any existing rule names below to manage them.',
73 'guaven_sqlcharts'
74 );
75 } else {
76 $gf_message = __(
77 '1. Give any name to your report.<br>
78 2. Choose chart type, type SQL query, enter field names, labels, and then press Publish/Update.<br>
79 3. After update, you will see the name and the demo of the needed shortcode at the bottom of this admin page. You can use that shortcode anywhere in your website: in pages, posts, widgets, etc.',
80 'guaven_sqlcharts'
81 );
82 }
83
84 echo '<div style="float:left;max-width:calc(100% - 345px)">';
85 echo wp_kses_post( $gf_message );
86 echo '</div>';
87
88 echo '<div style="float: right;
89 margin-top: 0px;
90 padding-top: 0px;"><a target="_blank" style="text-align:center;border:0px solid #6200ee;border-radius:0px;color:white;font-weight:bold;background: #6200ee;"
91 class="button button-secondary" href="https://guaven.com/contact/solution-request/">Get Premium Support </a>
92 <span style="line-height: 30px;padding: 0 5px;">OR</span>
93 <a target="_blank" style="text-align:center;border:0px solid #26b286;border-radius:0px;color:white;font-weight:bold;background: #26b286;"
94 class="button button-secondary" href="https://guaven.com/service/small-thankyou-premium-support-service/">Make a Small Donation</a>
95 </div> </div>';
96 endif;
97 }
98 add_action('admin_notices', 'guaven_sqlcharts_my_admin_notice');
99
100 function guaven_sqlcharts_onboarding_notice(){
101 if((function_exists('wp_doing_ajax') and wp_doing_ajax()) or get_option('guaven_sqlcharts_onboarding_notice_dismissed') == 1)
102 return;
103
104 printf('
105 <div class="guaven-sqlcharts-notice notice notice-success is-dismissible" data-notice="onboarding_notice">
106 <p>Welcome aboard on MySQL Charts!</p>
107 </div>'
108 );
109 }
110 add_action('admin_notices', 'guaven_sqlcharts_onboarding_notice');
111
112 function guaven_sqlcharts_onboarding_notice_dismissed(){
113 check_ajax_referer('notice_dismissed', 'nonce');
114
115 if(empty($_POST['type']))return;
116 switch ($_POST['type']){
117 case 'onboarding_notice':
118 update_option('guaven_sqlcharts_onboarding_notice_dismissed', 1);
119 break;
120 }
121 }
122 add_action('wp_ajax_guaven_sqlcharts_onboarding_notice_dismissed', 'guaven_sqlcharts_onboarding_notice_dismissed');
123
124 function guaven_sqlcharts_enqueue_chart()
125 {
126 wp_enqueue_script('guaven_sqlcharts_chartjs', plugins_url('asset/bundle.min.js', __FILE__),array('jquery'),GVNSQLCHARTS_VERSION,false);
127 wp_localize_script('guaven_sqlcharts_chartjs', 'guaven_sqlcharts_notice_dismissed', array(
128 'action' => 'guaven_sqlcharts_onboarding_notice_dismissed',
129 'nonce' => wp_create_nonce('notice_dismissed')
130 ));
131
132 }
133 add_action('wp_enqueue_scripts', 'guaven_sqlcharts_enqueue_chart');
134 add_action('admin_enqueue_scripts', 'guaven_sqlcharts_enqueue_chart');
135
136 function guaven_sqlcharts_enqueue_main_style()
137 {
138 wp_enqueue_style('guaven_sqlcharts_main_style', plugins_url('asset/guaven_sqlcharts.css', __FILE__),array(),GVNSQLCHARTS_VERSION);
139 }
140 add_action('wp_enqueue_scripts', 'guaven_sqlcharts_enqueue_main_style');
141 add_action('admin_enqueue_scripts', 'guaven_sqlcharts_enqueue_main_style');
142
143
144 function guaven_sqlcharts_isJson($string)
145 {
146 json_decode($string);
147 return (json_last_error() == JSON_ERROR_NONE);
148 }
149
150 add_action('init', 'guaven_sqlcharts_register_post');
151 function guaven_sqlcharts_register_post()
152 {
153 //register_taxonomy('guaven_update_push_tag', 'termin');
154 register_post_type('gvn_schart', array(
155 'labels' => array(
156 'name' => __('My SQL Charts','guaven_sqlcharts'),
157 'singular_name' => __('My SQL chart','guaven_sqlcharts')
158 ),
159
160 'public' => true,
161 //'taxonomies' => array('guaven_update_push_tag'),
162 'supports' => array(
163 'title',
164 'postmeta'
165 ),
166 'register_meta_box_cb' => 'guaven_sqlcharts_metabox_area'
167 ));
168
169 guaven_sqlcharts_load_defaults();
170 }
171
172 add_action('admin_footer', 'guaven_sqlcharts_admin_front');
173
174
175 function guaven_sqlcharts_admin_front()
176 {
177 global $post;
178 if (!empty($post) and $post->post_type == 'gvn_schart') {
179 ?>
180 <style type="text/css">#normal-sortables{display: none}</style>
181 <?php
182 }
183 }
184
185 // metabox for editor
186 function guaven_sqlcharts_metabox_area()
187 {
188 add_meta_box('guaven_sqlcharts_metabox', 'Configure your graph chart', 'guaven_sqlcharts_metabox', 'gvn_schart', 'advanced', 'default');
189 }
190
191 function guaven_sqlcharts_metabox()
192 {
193 require_once(dirname(__FILE__) . "/admin_metabox.php");
194 }
195
196 function guaven_gutenberg_wrapper($atts){
197 if(isset($atts['sqlcharts_inserted_script'])){
198 global $sqlcharts_inserted_script;
199 $sqlcharts_inserted_script = $atts['sqlcharts_inserted_script'];
200 }
201
202 // if( isset($_GET["post_id"],$_GET["context"]) and $_GET["context"]=='edit'
203 // and strpos($_SERVER["REQUEST_URI"],'block-renderer/guaven-sqlcharts/gvn-chart-gutenberg')!==false
204 // ){
205 // $atts['chart_id']=$_GET["post_id"];
206 // }
207 $post = get_post($atts['chart_id']);
208 if( ! isset($atts['chart_id']) or !isset($post) or $post->post_type != 'gvn_schart'){
209
210 return "Invalid id";
211 }
212
213 return guaven_sqlcharts_local_shortcode(array('id' => $atts['chart_id'])); // temporary explicit value
214 }
215 function guaven_register_gutenberg_blocks()
216 {
217 wp_register_script(
218 'gvn_gutenberg_charts',
219 plugins_url( 'asset/guaven_gutenberg_charts.js', __FILE__ ),
220 array( 'wp-blocks', 'wp-i18n', 'wp-element', 'wp-server-side-render' ),
221 GVNSQLCHARTS_VERSION.'_'.filemtime( plugin_dir_path( __FILE__ ) . 'asset/guaven_gutenberg_charts.js'),
222 false
223 );
224 wp_localize_script('gvn_gutenberg_charts', 'guaven', array(
225 'description' => 'Add My SQL Chart to your post',
226 ));
227
228 register_block_type( 'guaven-sqlcharts/gvn-chart-gutenberg', array(
229 'editor_script' => 'gvn_gutenberg_charts',
230 'render_callback' => 'guaven_gutenberg_wrapper',
231 'attributes' => array(
232 'chart_id' => array(
233 'type' => 'string',
234 'default' => null
235 ),
236 'sqlcharts_inserted_script' => array(
237 'type' => 'number',
238 'default' => null
239 )
240 )
241 ));
242 }
243 add_action('init', 'guaven_register_gutenberg_blocks');
244
245
246
247 function guaven_sqlcharts_save_metabox_area($post_id, $post)
248 {
249 if (!isset($_POST['meta_box_nonce_field']) or !wp_verify_nonce($_POST['meta_box_nonce_field'], 'meta_box_nonce_action')) {
250 return $post->ID;
251 }
252 $fields = array(
253 "guaven_sqlcharts_chartheight",
254 "guaven_sqlcharts_chartwidth",
255 "guaven_sqlcharts_graphtype",
256 "guaven_sqlcharts_xarg_s",
257 "guaven_sqlcharts_xarg_l",
258 "guaven_sqlcharts_yarg_s",
259 "guaven_sqlcharts_yarg_l",
260 "guaven_sqlcharts_tablepart",
261 "guaven_sqlcharts_variables",
262 "guaven_sqlcharts_formpartrole",
263 "guaven_sqlcharts_formpartbutton",
264 "guaven_sqlcharts_dbhost",
265 "guaven_sqlcharts_dblogin",
266 "guaven_sqlcharts_dbname",
267 "guaven_sqlcharts_colors",
268 "guaven_sqlcharts_begin_with_0_x",
269 "guaven_sqlcharts_begin_with_0_y",
270 "guaven_sqlcharts_round_y_values",
271 "guaven_sqlcharts_legend_position",
272 "guaven_sqlcharts_nostacked",
273 "guaven_sqlcharts_forcetooltips"
274 );
275 foreach ($fields as $key => $value) {
276 if(isset($_POST[$value]))$newval=esc_attr($_POST[$value]);
277 else $newval='';
278
279 update_post_meta($post->ID, $value, $newval);
280 }
281 if(!empty($_POST["guaven_sqlcharts_dbpass"])){
282 $encpass=guaven_sqlcharts_encrypt_decrypt('encrypt',$_POST["guaven_sqlcharts_dbpass"]);
283 update_post_meta($post->ID, 'guaven_sqlcharts_dbpass', ['encrypted',$encpass]);
284 }
285 update_post_meta($post->ID, 'guaven_sqlcharts_code', esc_attr(str_replace("'",'"',stripslashes($_POST['guaven_sqlcharts_code']))) );
286 }
287 add_action('save_post', 'guaven_sqlcharts_save_metabox_area', 1, 2);
288 // save the custom fields
289
290
291
292 function gvn_chart_check_sql_query($sql)
293 {
294 $blacklister = array(
295 "delete",
296 "update",
297 "insert",
298 "drop",
299 "truncate",
300 "alter"
301 ); //add all
302 $blacklister_f = 0;
303 foreach ($blacklister as $key => $value) {
304 if (strpos($sql, $value) !== false)
305 $blacklister_f = 1;
306 }
307 return $blacklister_f;
308 }
309
310 function guaven_get_labels_and_values($id, $fvs)
311 {
312 $values = array();
313 $labels = array();
314 $xarg_s = get_post_meta($id, 'guaven_sqlcharts_xarg_s', true);
315 $xarg_l = get_post_meta($id, 'guaven_sqlcharts_xarg_l', true);
316 $yarg_s = get_post_meta($id, 'guaven_sqlcharts_yarg_s', true);
317 $yarg_l = get_post_meta($id, 'guaven_sqlcharts_yarg_l', true);
318 $chartype = array(
319 'line_l' => 'Line',
320 'pie_l' => 'Pie',
321 'donut_l' => 'Pie',
322 'bar_l' => 'Bar',
323 'horizontalbar_l' => 'Horizontal Bar',
324 'area_l' => 'Line'
325 );
326 foreach ($fvs as $key => $value) {
327 $values[$value->$xarg_s] = $value->$yarg_s;
328 $labels[$value->$xarg_s] = '"' . $value->$xarg_s . '"';
329 }
330 return array(
331 $labels,
332 $values,
333 explode(";", $yarg_l),
334 explode(";", $xarg_l)
335 );
336 }
337
338 function guaven_sqlcharts_print_chart_js($print_data)
339 {
340 extract($print_data);
341
342 if ($tip_g == 'line_l') {
343 guaven_sqlcharts_linedata($title, $labels, $values, $ylabel, 'false', $pid);
344 }
345 if ($tip_g == 'area_l') {
346 guaven_sqlcharts_linedata($title, $labels, $values, $ylabel, 'true', $pid);
347 } elseif ($tip_g == 'pie_l') {
348 guaven_sqlcharts_piedata($title, $labels, $values, $ylabel, $pid);
349 } elseif ($tip_g == 'donut_l') {
350 guaven_sqlcharts_piedata($title, $labels, $values, $ylabel, $pid, 'doughnut');
351 } elseif ($tip_g == 'bar_l') {
352 guaven_sqlcharts_bardata($title, $labels, $values, $ylabel, 'bar', $pid);
353 } elseif ($tip_g == 'horizontalbar_l') {
354 guaven_sqlcharts_bardata($title, $labels, $values, $ylabel, 'horizontalBar', $pid);
355 }
356 elseif($tip_g == 'custom'){
357 guaven_sqlcharts_custom($title, $labels, $values, $ylabel, $pid);
358 }
359 elseif ($tip_g == 'polar_l') {
360 guaven_sqlcharts_piedata($title, $labels, $values, $ylabel, $pid, 'polarArea');
361 }
362 }
363
364 function guaven_sqlcharts_custom($title, $labels, $values, $ylabel, $pid){
365 do_action('guaven_sqlcharts_custom',$title, $labels, $values, $ylabel, $pid);
366 }
367
368 function gvn_chart_put_variables($sql,$pid){
369 $sql_initial=$sql;
370
371
372 $default_tag_keys=['{current_user_id}','{current_user_login}','{current_user_email}','{current_user_display_name}'];
373 if(is_user_logged_in( )){
374 $currentuser=wp_get_current_user();
375 $default_tag_values=[$currentuser->ID,$currentuser->user_login,$currentuser->user_email,$currentuser->user_display_name];
376 }
377 else {
378 $default_tag_values='';
379 }
380 $sql_initial=str_replace($default_tag_keys,$default_tag_values,$sql_initial);
381
382 $variables_raw=get_post_meta($pid,'guaven_sqlcharts_variables',true);
383 $variables_arr=explode("|",$variables_raw);
384 foreach($variables_arr as $varfield){
385 $varfield_arr=explode("~",$varfield);
386 if (count($varfield_arr)<3) continue;
387 $varfield_arr=array_map("trim",$varfield_arr);
388 if (!empty($_GET[$varfield_arr[0]])) {
389 // User-supplied input: no () bypass allowed — sanitize strictly
390 $varreplacement = sanitize_text_field(wp_unslash($_GET[$varfield_arr[0]]));
391 if (is_numeric($varreplacement)) {
392 $varreplacement = $varreplacement + 0;
393 } else {
394 $varreplacement = '"' . esc_sql($varreplacement) . '"';
395 }
396 } else {
397 // Admin-configured default value: allow () for SQL functions (e.g. NOW())
398 $varreplacement = $varfield_arr[1];
399 if (!is_numeric($varreplacement) && strpos($varreplacement,'()')===false) {
400 $varreplacement = '"' . esc_sql($varreplacement) . '"';
401 }
402 }
403
404 $sql_initial=str_replace('{'.$varfield_arr[0].'}',$varreplacement,$sql_initial);
405 }
406 return $sql_initial;
407 }
408
409 function gvn_chart_top_form($atts){
410 if (get_post_meta($atts["id"],'guaven_sqlcharts_formpartrole',true)!='' and !is_user_logged_in()) return;
411 $topform='';$dateexists=false;
412 $variables_raw=get_post_meta($atts['id'],'guaven_sqlcharts_variables',true);
413 $variables_raw=explode("|",$variables_raw);
414 foreach ($variables_raw as $vrow){
415 $vrow_arr=explode("~",$vrow);
416 $vrow_arr=array_map("trim",$vrow_arr);
417 if (empty($vrow_arr[3])) continue;
418 $gvalue=!empty($_GET[$vrow_arr[0]])?esc_attr(urldecode($_GET[$vrow_arr[0]])):'';
419 $dvalue=(strpos($vrow_arr[1],'()')===false)?esc_attr($vrow_arr[1]):'';
420 if ($vrow_arr[3]=='date') {
421 $dateexists=true;
422 $topform.= $vrow_arr[2].' <input class="gws_datepicker" autocomplete="off" style="display:inline-block;max-width:210px;display:inline-block;color:red" type="text"
423 value="'.$gvalue.'"
424 data-toggle="datepicker" name="'.$vrow_arr[0].'" placeholder="'.$dvalue.'">
425 ';}
426 else {
427 $topform.= $vrow_arr[2].' <input autocomplete="off" style="display:inline-block;max-width:210px;'.($vrow_arr[3]=='number'?'width:100px;':'').'"
428 type="'.$vrow_arr[3].'"
429 value="'.$gvalue.'" name="'.$vrow_arr[0].'" placeholder="'.$dvalue.'">
430 ';
431 }
432 }
433 if (!empty($topform)) {
434 $allowed_html = array(
435 'form' => array(
436 'method' => array(),
437 'action' => array(),
438 'class' => array()
439 ),
440 'input' => array(
441 'type' => array(),
442 'value' => array(),
443 'name' => array(),
444 'class' => array(),
445 'data-toggle'=>array(),
446 'placeholder'=>array(),
447 'style'=>[]
448 ),
449 'script' => array(),
450 );
451
452 $submit_button_value = get_post_meta($atts['id'], 'guaven_sqlcharts_formpartbutton', true) != ''
453 ? esc_attr(get_post_meta($atts['id'], 'guaven_sqlcharts_formpartbutton', true))
454 : 'OK';
455
456 $topform = '<form method="get" action="" class="guaven_sqlcharts_form">' . $topform . '
457 <input type="submit" value="' . $submit_button_value . '"></form>';
458
459 if ($dateexists) {
460 $topform .= '<script>setTimeout(function(){jQuery(\'[data-toggle="datepicker"]\').datepicker({format: \'yyyy-mm-dd\'});},300);</script>';
461 }
462
463 echo wp_kses($topform, $allowed_html);
464 }
465 }
466
467
468 function guaven_sqlcharts_encrypt_decrypt($action, $string)
469 {
470 $output = false;
471 $encrypt_method = "AES-256-CBC";
472 $secret_key = 'GWSCHARTPL2022.2016.';
473 $secret_iv = 'GWSCHARTPL2016.2022';
474 $key = hash('sha256', $secret_key);
475 $iv = substr(hash('sha256', $secret_iv), 0, 16);
476 if ( $action == 'encrypt' ) {
477 $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
478 $output = base64_encode($output);
479 } else if( $action == 'decrypt' ) {
480 $output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
481 }
482 return $output;
483 }
484
485 function guaven_sqlcharts_local_shortcode($atts) {
486 if(empty($atts['id']))return 'ID is missing.';
487 $atts['id']=intval($atts['id']);
488 $remote_host=get_post_meta($atts['id'], 'guaven_sqlcharts_dbhost', true);
489 if ($remote_host!=''){
490 $remote_db=get_post_meta($atts['id'], 'guaven_sqlcharts_dbname', true);
491 $remote_login=get_post_meta($atts['id'], 'guaven_sqlcharts_dblogin', true);
492 $remote_pass=get_post_meta($atts['id'], 'guaven_sqlcharts_dbpass', true);
493 if(is_array($remote_pass)){
494 $remote_pass=guaven_sqlcharts_encrypt_decrypt('decrypt',$remote_pass[1]);
495 }
496 $wpdb=new wpdb($remote_login,$remote_pass,$remote_db,$remote_host);
497 }
498 else {
499 global $wpdb;
500 }
501
502 $GLOBALS["guaven_sqlcharts_atts"]=$atts;
503
504 $sql = html_entity_decode(get_post_meta($atts['id'], 'guaven_sqlcharts_code', true));
505 if(empty($sql))return 'SQL query is missing.';
506 $sql=gvn_chart_put_variables($sql,$atts['id']);
507
508
509 $sql=apply_filters('guaven_sqlcharts_rendered_sql',$sql,$atts);
510
511 $blacklister_f = gvn_chart_check_sql_query($sql);
512 if ($blacklister_f == 1)return 'You given SQL code contains forbidden commands. Remember that you should only use SELECT queries';
513 $tip_g = get_post_meta($atts['id'], 'guaven_sqlcharts_graphtype', true);
514
515 for($i=1;$i<20;$i++){
516 if(strpos($sql,"{arg".$i."}")!==false){
517 $replacearg=!empty($atts["arg".$i])?$atts["arg".$i]:0;
518 $sql = str_replace("{arg".$i."}", "%s", $sql);
519 $sql=$wpdb->prepare($sql,$replacearg);
520 }
521
522 }
523
524 $sql_split = explode(';', $sql);
525 $labels_and_values = array();
526 $post_g = get_post($atts['id']);
527
528 global $sqlcharts_inserted_script;
529 for ($i = 0; $i < count($sql_split); $i++) {
530 if (!empty($sql_split[$i])) {
531
532 $fvs = $wpdb->get_results($sql_split[$i]);
533 if (strpos($_SERVER["REQUEST_URI"],'wp-admin')!==false){
534 $wpdb->show_errors();
535 ob_start();
536 $wpdb->print_error();
537 $printerror = ob_get_clean();
538 if ($printerror != '' and strpos($printerror, "[]") === false)
539 return $printerror;
540 elseif (empty($fvs))
541 return 'Your SQL returnes empty data, please recheck your SQL query above';
542 }
543
544 ob_start();
545
546 if (empty($sqlcharts_inserted_script))
547 $sqlcharts_inserted_script = 1;
548 $labels_and_values[$i] = guaven_get_labels_and_values($atts['id'], $fvs);
549 $labels[$i] = $labels_and_values[$i][0];
550 $values[$i] = $labels_and_values[$i][1];
551 $ylabel[$i] = !empty($labels_and_values[$i][2][$i]) ? $labels_and_values[$i][2][$i] : '';
552 $xlabel[$i] = !empty($labels_and_values[$i][3][$i]) ? $labels_and_values[$i][3][$i] : '';
553 }
554 }
555
556 gvn_chart_top_form($atts);
557 ?>
558 <canvas
559 id="ct-chart_<?php echo esc_attr($sqlcharts_inserted_script); ?>"
560 class="guaven_chart_canvas"
561 style="width: <?php echo esc_attr(get_post_meta($atts['id']), 'guaven_sqlcharts_chartwidth', true); ?>px !important; height: <?php echo esc_attr(get_post_meta($atts['id'], 'guaven_sqlcharts_chartheight', true)); ?>px !important;"
562 ></canvas>
563
564 <script type="text/javascript" class="gvn_charts_script" async>
565 var ctx = jQuery("#ct-chart_<?php
566 echo esc_attr($sqlcharts_inserted_script);
567 ?>");
568
569 <?php
570 $print_data=apply_filters('guaven_sqlcharts_pre_print_vars',['tip_g'=>$tip_g, 'title'=>$post_g->post_title,
571 'labels'=>$labels, 'values'=>$values, 'ylabel'=>$ylabel, 'pid'=>$atts['id']]);
572 guaven_sqlcharts_print_chart_js($print_data);
573 ?>
574 </script>
575
576 <?php
577 if (!empty($atts["table"])) guaven_sqlcharts_tablepart($post_g->post_title, $labels, $values, $ylabel,$xlabel);
578 $sqlcharts_inserted_script++;
579 $ret=ob_get_clean();
580 $ret=apply_filters( 'guaven_sqlcharts_final_output', $ret, $atts );
581 return $ret;
582 }
583
584 add_shortcode('gvn_schart_2', 'guaven_sqlcharts_local_shortcode');
585
586 add_shortcode("gvn_schart_2_cached",function($atts){
587 if(empty($atts["id"]))return;
588 $atts["id"]=intval($atts["id"]);
589 $is_logged_in=is_user_logged_in()?'':'_guest';
590 $expire=!empty($atts["expire"])?intval($atts["expire"]):3600;
591 $cached=get_transient('cached_sql_charts_'.$atts["id"].$is_logged_in);
592 if(!empty($cached) and !isset($_GET["force_sql_cache_reload"]) )return $cached;
593 $tobecached=do_shortcode('[gvn_schart_2 id="'.$atts["id"].'"]');
594 set_transient('cached_sql_charts_'.$atts["id"].$is_logged_in, $tobecached,$expire);//you can change 3600 yourself
595 return $tobecached;
596 });
597
598 function guaven_sqlcharts_colors($index, $pid = null){
599 if(!isset($pid)) {
600 global $post;
601 $pid = $post->ID;
602 }
603 $colors=get_post_meta($pid,'guaven_sqlcharts_colors',true);
604 $colors=explode(",",$colors);
605 if (!empty($colors[$index])) return $colors[$index];
606 return wp_rand(0, 255) . ',' . wp_rand(0, 255) . ',' . wp_rand(0, 255);
607 }
608
609 /* TBD
610 function guaven_sqlcharts_toshowlegend($pid){
611 $guaven_sqlcharts_legend_position=get_post_meta($pid, 'guaven_sqlcharts_legend_position', true);
612 if(in_array($guaven_sqlcharts_legend_position,['top','bottom','left','right'])){
613 $display='true';$position=$guaven_sqlcharts_legend_position;
614 }
615 else {
616 $display='false';$position='top';
617 }
618 return "legend: {display: ".$display.",position:'".$position."'},";
619 }
620 */
621
622 function guaven_sqlcharts_bardata($title, $labels, $values, $ylabel, $type = 'bar', $pid = null)
623 {
624 ?>
625 var data = {
626 labels: [<?php guaven_sqlcharts_merge_labeldata($labels);?>],
627 datasets: [
628 <?php
629 $values_new=guaven_sqlcharts_key_normalizer($values,$labels,$ylabel)[0];
630 $i=-1;
631 foreach ($values_new as $key_ak=>$value_ak) {
632 $i++;
633 ?>
634 {
635 <?php
636 if(!empty($GLOBALS["guaven_sqlcharts_atts"]["params"])){
637 //passing chartJS params via the shortcode
638 echo wp_kses($GLOBALS["guaven_sqlcharts_atts"]["params"],[]);
639 }
640 ?>
641 label: "<?php
642 echo wp_kses($ylabel[$key_ak],[]);
643 ?>",
644 backgroundColor: [
645 <?php
646 echo wp_kses(guaven_sqlcharts_colorgenerator(count($values_new[$key_ak]), 0, 0, guaven_sqlcharts_colors($i, $pid)),[]);
647 ?>
648 ],
649 borderColor: [
650 <?php
651 echo wp_kses(guaven_sqlcharts_colorgenerator(count($values_new[$key_ak]), 0, 0.2, guaven_sqlcharts_colors($i, $pid)),[]);
652 ?>
653 ],
654 borderWidth: 1,
655 data: [<?php
656 echo wp_kses(implode(",", $values_new[$key_ak]),[]);
657 ?>],
658 },
659 <?php
660 }
661 ?>
662 ]
663 };
664 var options={
665 responsive: true,
666 scales: {
667 xAxes: [{
668 <?php echo (get_post_meta($pid, 'guaven_sqlcharts_nostacked', true) == 1) ? '':'stacked: true,';?>
669 ticks: {
670 beginAtZero: <?php echo (get_post_meta($pid, 'guaven_sqlcharts_begin_with_0_x', true) == 1) ? 'true':'false'; ?>
671 }
672 }],
673 yAxes: [{
674 <?php echo (get_post_meta($pid, 'guaven_sqlcharts_nostacked', true) == 1) ? '':'stacked: true,';?>
675 ticks: {
676 <?php if(get_post_meta($pid, 'guaven_sqlcharts_round_y_values', true) == 1) echo 'precision: 0,'; ?>
677 beginAtZero: <?php echo (get_post_meta($pid, 'guaven_sqlcharts_begin_with_0_y', true) == 1) ? 'true':'false'; ?>
678 }
679 }]
680 }
681 <?php
682 guaven_sqlcharts_maybe_additional_parameters($pid);
683 ?>
684 };
685 var myBarChart = new Chart(ctx, {
686 type: '<?php
687 echo esc_attr($type);
688 ?>',
689 data: data,
690 options: options
691 });
692 <?php
693 }
694
695 function guaven_sqlcharts_merge_labeldata($labels){
696 if(count($labels)==1){echo wp_kses(implode(",",$labels[0]),[]);return;}
697 $merged=[];
698 foreach($labels as $label){
699 $merged=array_merge($merged,$label);
700 }
701 echo wp_kses(implode(",",array_unique($merged)),[]);
702 }
703
704 function guaven_sqlcharts_linedata($title, $labels, $values, $ylabel, $type = 'false', $pid = null)
705 {
706 ?>
707 var data = {
708 labels: [<?php guaven_sqlcharts_merge_labeldata($labels);?>],
709 datasets: [
710 <?php
711 $values_new=guaven_sqlcharts_key_normalizer($values,$labels,$ylabel)[0];
712 $i=-1;
713 foreach ($values_new as $key_ak=>$value_ak) {
714 $i++;
715 ?>
716 {
717 <?php
718 if(!empty($GLOBALS["guaven_sqlcharts_atts"]["params"])){
719 //passing chartJS params via the shortcode
720 echo wp_kses($GLOBALS["guaven_sqlcharts_atts"]["params"],[]);
721 }
722 ?>
723 label: "<?php
724 echo esc_attr($ylabel[$key_ak]);
725 ?>",
726 fill: <?php echo $type=="false"? esc_attr($type):($i==0?'"+1"':'"origin"');
727 ?>,
728 lineTension: 0.1,
729 backgroundColor: <?php
730 echo wp_kses_post(guaven_sqlcharts_colorgenerator(1, 1, 0.2, guaven_sqlcharts_colors($i, $pid)));
731 ?>
732 borderColor: <?php
733 echo wp_kses_post(guaven_sqlcharts_colorgenerator(1, 1, 0.2, guaven_sqlcharts_colors($i, $pid)));
734 ?>
735 pointBorderColor: <?php
736 echo wp_kses_post(guaven_sqlcharts_colorgenerator(1, 1, 0.2, guaven_sqlcharts_colors($i, $pid)));
737 ?>
738 pointHoverBackgroundColor: <?php
739 echo wp_kses_post(guaven_sqlcharts_colorgenerator(1, 1, 0.2, guaven_sqlcharts_colors($i, $pid)));
740 ?>
741 pointHoverBorderColor: <?php
742 echo wp_kses_post(guaven_sqlcharts_colorgenerator(1, 1, 0.2, guaven_sqlcharts_colors($i, $pid)));
743 ?>
744 data: [<?php
745 echo wp_kses_post(implode(",", $values_new[$key_ak]));
746 ?>],
747 spanGaps: false,
748 },
749 <?php
750 }
751 ?>
752 ]
753 };
754 var myLineChart = new Chart(ctx, {
755 type: 'line',
756 data: data,
757 options: {
758 responsive: true,
759 scales: {
760 xAxes: [{
761 display: true,
762 ticks: {
763 beginAtZero: <?php echo (get_post_meta($pid, 'guaven_sqlcharts_begin_with_0_x', true) == 1) ? 'true':'false'; ?>
764 }
765 }],
766 yAxes: [{
767 ticks: {
768 <?php if(get_post_meta($pid, 'guaven_sqlcharts_round_y_values', true) == 1) echo 'precision: 0,'; ?>
769 beginAtZero: <?php echo (get_post_meta($pid, 'guaven_sqlcharts_begin_with_0_y', true) == 1) ? 'true':'false'; ?>
770 }
771 }]
772 }
773 <?php
774 guaven_sqlcharts_maybe_additional_parameters($pid);
775 ?>
776
777 }
778 });
779 <?php
780 }
781
782
783 function guaven_sqlcharts_maybe_additional_parameters($pid){
784 if(function_exists('guaven_sqlcharts_maybe_additional_parameters_custom')){
785 wp_kses(guaven_sqlcharts_maybe_additional_parameters_custom($pid),[]);
786 return;
787 }
788 $guaven_sqlcharts_legend_position=get_post_meta($pid, 'guaven_sqlcharts_legend_position', true);
789 if(in_array($guaven_sqlcharts_legend_position,['top','bottom','left','right'])){
790 $display='true';$position=$guaven_sqlcharts_legend_position;
791 }
792 else {
793 $display='false';$position='top';
794 }
795 echo wp_kses( ",legend: {display: ".$display.",position:'".$position."'}",[]);
796 }
797
798
799
800
801 function guaven_sqlcharts_piedata($title, $labels, $values, $ylabel, $pid, $type = 'pie')
802 {
803 if(get_post_meta($pid,'guaven_sqlcharts_forcetooltips',true)!=''){
804 echo 'guaven_sqlcharts_show_pie_labels();'.PHP_EOL;
805 }
806 ?>
807 var options={
808 showAllTooltips: true,
809 responsive: true
810 <?php
811 guaven_sqlcharts_maybe_additional_parameters($pid);
812 ?>
813 };
814 var data = {
815 labels: [ <?php guaven_sqlcharts_merge_labeldata($labels);?>],
816 datasets: [
817 <?php
818 for ($i = 0; $i < count($values); $i++) {
819 ?>
820 {
821 <?php
822 if(!empty($GLOBALS["guaven_sqlcharts_atts"]["params"])){
823 //passing chartJS params via the shortcode
824 echo wp_kses($GLOBALS["guaven_sqlcharts_atts"]["params"],[]);
825 }
826 ?>
827 data: [<?php
828 echo wp_kses(implode(",", $values[$i]),[]);
829 ?>],
830 backgroundColor: [
831 <?php
832 $ii=0;
833 foreach($values[$i] as $vci=>$valuecolor){
834 echo wp_kses_post(guaven_sqlcharts_colorgenerator(1, 0, -0.1, guaven_sqlcharts_colors($ii, $pid)));
835 $ii++;
836 }
837 ?>
838 ],
839 hoverBackgroundColor: [
840 <?php
841 $ii=0;
842 foreach($values[$i] as $vci=>$valuecolor){
843 echo wp_kses_post(guaven_sqlcharts_colorgenerator(1, 0, 0.2, guaven_sqlcharts_colors($ii, $pid)));
844 $ii++;
845 }
846 ?>
847 ]
848 },
849 <?php
850 }
851 ?>
852 ]
853 };
854 var myPieChart = new Chart(ctx,{
855 type: '<?php
856 echo esc_attr($type);
857 ?>',
858 data: data,
859 options: options
860 });
861 <?php
862 }
863
864
865
866
867 function guaven_sqlcharts_colorgenerator($count, $indic, $darkness = 0, $initcolor = '255,0,0')
868 {
869 if (strpos($initcolor,'#')===0) {
870 $split = str_split(substr($initcolor,1), 2);
871 $r = hexdec($split[0]);
872 $g = hexdec($split[1]);
873 $b = hexdec($split[2]);
874 $ret='';
875 for ($i = 0; $i < $count; $i++) {
876 $ret .= "'rgba(" . $r . ", " . $g . ", " . $b . ",".($darkness + 0.8 - $indic * $i * 0.8 / ($count)).")',
877 ";
878 }
879 return $ret;
880 }
881 $initial_colors = array(
882 'linebg' => 'red',
883 'linebr' => 'yellow',
884 'linebc' => 'green',
885 'linehbg' => 'white',
886 'linehbc' => 'black'
887 );
888 if (!empty($initial_colors[$count]))
889 return '"' . $initial_colors[$count] . '",
890 ';
891 $ret = '';
892 for ($i = 0; $i < $count; $i++) {
893 $ret .= "'rgba(" . $initcolor . "," . ($darkness + 0.8 - $indic * $i * 0.8 / ($count)) . ")',
894 ";
895 }
896 return $ret;
897 }
898
899 function guaven_sqlcharts_tablepart($title, $labels, $values, $ylabel,$xlabel){
900 $tabledata='';
901 $fcol=[];$scol=[];
902 $empty_cell=apply_filters( 'guaven_sqlcharts_table_empty_cell','<td></td>');
903 $tablein='';
904 foreach($values as $row=>$valuerow){
905 foreach ($valuerow as $key => $value) {
906 $putval=$labels[$row][$key]??'';
907 $fcol[$key]='<td>'.str_replace('"',"",$putval).'</td>';
908 $scol[$key][$row]='<td>'.$value.'</td>';
909 }
910 foreach($scol as $scolkey=>$scolvalue){
911 for($i=0;$i<count($values);$i++){
912 //echo $i;
913 if(!isset($scolvalue[$i]))$scol[$scolkey][$i]=$empty_cell;;
914 }
915 ksort($scol[$scolkey]);
916 }
917 }
918
919 foreach($fcol as $key=>$value){
920 $tablein.='<tr>'.$value.implode(" ",$scol[$key]).'</tr>'.PHP_EOL;
921 }
922 $tabledata.='<table><tr><th>'.$xlabel[0].'</th><th>'.implode("</th><th>",$ylabel).'</th></tr>
923 '.$tablein.'</table><br>';
924
925 echo wp_kses_post($tabledata);
926
927 }
928
929 function guaven_sqlcharts_graphtype($post){
930 if (strpos(get_post_meta($post->ID, 'guaven_sqlcharts_graphtype', true), "_l") !== false)
931 $postfix = '_2';
932 else $postfix = '';
933 return $postfix;
934 }
935
936 add_filter('the_content',function($content){
937 if(!is_singular('gvn_schart'))return $content;
938 global $post;
939 $postfix=guaven_sqlcharts_graphtype($post);
940 return '[gvn_schart'.$postfix.' id="'.$post->ID.'"'.
941 (get_post_meta($post->ID,'guaven_sqlcharts_tablepart',true)!=''?' table="1"':'')
942 .']';
943 });
944
945 function guaven_sqlcharts_key_normalizer($values,$labels,$ylabel){
946 $normalize_keys=[];
947 $empty_value=apply_filters( 'guaven_sqlcharts_table_empty_value','');
948 foreach ($values as $key_ak=>$value_ak) {
949 $normalize_keys=array_merge($normalize_keys,array_keys($values[$key_ak]));
950 }
951 $values_normalized=[];$labels_normalized=[];$ylabel_normalized=[];
952 foreach($normalize_keys as $normalized_key){
953 foreach ($values as $key_ak=>$value_ak) {
954 $values_normalized[$key_ak][$normalized_key]=isset( $values[$key_ak][$normalized_key])? $values[$key_ak][$normalized_key]:"'".$empty_value."'";
955 $labels_normalized[$key_ak][$normalized_key]=isset( $labels[$key_ak][$normalized_key])? $labels[$key_ak][$normalized_key]:"''";
956 $ylabel_normalized[$key_ak][$normalized_key]=isset( $ylabel[$key_ak][$normalized_key])? $ylabel[$key_ak][$normalized_key]:"";
957 }
958 }
959 return [$values_normalized,$labels_normalized,$ylabel_normalized];
960 }
961
962
963 add_filter('guaven_sqlcharts_table_empty_cell',function($str){return '<td>#</td>';});
964 add_filter('guaven_sqlcharts_table_empty_value',function($str){return 'N/A';});