-
-
Save kingkool68/567527d28f82bd3a0107970b624fea0a to your computer and use it in GitHub Desktop.
<?php | |
/** | |
* Plugin Name: River Height Levels | |
* Plugin URI: https://gist.github.com/kingkool68/567527d28f82bd3a0107970b624fea0a | |
* Description: Fetch the current river height values and display it as different data visualization. | |
* Version: 0.0.2 | |
* Author: Russell Heimlich | |
* Author URI: https://twitter.com/kingkool68 | |
* License: GPL v2 or later | |
* License URI: https://www.gnu.org/licenses/gpl-2.0.html | |
*/ | |
class River_Height_Levels { | |
/** | |
* Get an instance of this class | |
*/ | |
public static function get_instance() { | |
static $instance = null; | |
if ( null === $instance ) { | |
$instance = new static(); | |
$instance->setup_actions(); | |
} | |
return $instance; | |
} | |
/** | |
* Hook into WordPress via actions | |
*/ | |
public function setup_actions() { | |
add_action( 'init', array( $this, 'action_init' ) ); | |
} | |
/** | |
* Register the Google Charts loader script | |
*/ | |
public static function action_init() { | |
wp_register_script( | |
'google-charts-library', | |
'https://www.gstatic.com/charts/loader.js', | |
$deps = array(), | |
$ver = null, | |
$in_footer = true | |
); | |
// Register dummy script handlers so we can dynamically enqueue wp_add_inline_script() | |
// See https://wordpress.stackexchange.com/a/311279/2744 | |
wp_register_script( | |
'river-gauge-chart', | |
'', | |
$deps = array( 'google-charts-library' ), | |
$ver = null, | |
$in_footer = true | |
); | |
wp_register_script( | |
'river-line-chart', | |
'', | |
$deps = array( 'google-charts-library' ), | |
$ver = null, | |
$in_footer = true | |
); | |
add_shortcode( | |
'river-height-gauge', | |
function() { | |
wp_enqueue_script( 'river-gauge-chart' ); | |
$the_javascript_goodness = static::render_gauge_chart_javascript(); | |
wp_add_inline_script( 'google-charts-library', $the_javascript_goodness, $position = 'after' ); | |
return '<div id="river-gauge-chart" style="width: 400px; height: 200px;"></div>'; | |
} | |
); | |
add_shortcode( | |
'river-level-chart', | |
function() { | |
wp_enqueue_script( 'river-line-chart' ); | |
$the_javascript_goodness = static::render_line_chart_javascript(); | |
wp_add_inline_script( 'google-charts-library', $the_javascript_goodness, $position = 'after' ); | |
return '<div id="river-line-chart" style="width: 900px; height: 500px"></div>'; | |
} | |
); | |
} | |
/** | |
* Load an external CSV file and store it as a transient | |
*/ | |
public static function get_the_csv_data() { | |
$transient_key = 'river-height-csv-data'; | |
$data = get_transient( $transient_key ); | |
// If the data already exists then return it. We're done here! | |
if ( false !== $data ) { | |
return $data; | |
} | |
// Fetch the CSV data. | |
$request = wp_remote_get( 'https://check-for-flooding.service.gov.uk/station-csv/8056' ); | |
// Retrieve the body contents from the request. | |
$raw_csv_string = wp_remote_retrieve_body( $request ); | |
$rows = explode( "\n", $raw_csv_string ); | |
// Remove the header rows from the beginning of the array. | |
array_shift( $rows ); | |
$data = array(); | |
foreach ( $rows as $row ) { | |
$data[] = str_getcsv( $row, ',' ); | |
} | |
// Store the result for 15 minutes. | |
set_transient( $transient_key, $data, 15 * MINUTE_IN_SECONDS ); | |
return $data; | |
} | |
/** | |
* Render the latest data point as a Google Visualization Gauge Chart | |
* | |
* @link https://developers.google.com/chart/interactive/docs/gallery/gauge | |
*/ | |
public static function render_gauge_chart_javascript() { | |
$csv_data = static::get_the_csv_data(); | |
$last_row = end( $csv_data ); | |
ob_start(); | |
?> | |
google.charts.load('current', {'packages':['gauge']}); | |
google.charts.setOnLoadCallback(drawGaugeChart); | |
function drawGaugeChart() { | |
var data = google.visualization.arrayToDataTable([ | |
['Label', 'Value'], | |
['Height', <?php echo floatVal( $last_row[1] ); ?>] | |
]); | |
var options = { | |
min: 0, | |
max: 2, | |
width: 400, | |
height: 200, | |
redFrom: 1.2, | |
redTo: 2, | |
greenFrom: 0.4, | |
greenTo: 1.2, | |
yellowFrom: 0, | |
yellowTo: 0.4, | |
minorTicks: 5 | |
}; | |
var chart = new google.visualization.Gauge(document.getElementById('river-gauge-chart')); | |
chart.draw(data, options); | |
} | |
<?php | |
return ob_get_clean(); | |
} | |
/** | |
* Render the river height data point as a Google Visualization Line Chart | |
* | |
* @link https://developers.google.com/chart/interactive/docs/gallery/linechart | |
*/ | |
public static function render_line_chart_javascript() { | |
$csv_data = static::get_the_csv_data(); | |
ob_start(); | |
?> | |
google.charts.load('current', {'packages':['corechart']}); | |
google.charts.setOnLoadCallback(drawLineChart); | |
function drawLineChart() { | |
var data = google.visualization.arrayToDataTable([ | |
['Date', 'Height'], | |
<?php | |
foreach ( $csv_data as $row ) { | |
$the_date = date( 'g:i a D, M j', strtotime( $row[0] ) ); | |
echo ( "['" . $the_date . "', " . floatVal( $row[1] ) . '],' ); | |
} | |
?> | |
]); | |
var options = { | |
title: 'River Level Over Last 5 Days', | |
curveType: 'function', | |
hAxis: { | |
showTextEvery: 96, | |
format: 'D M j' | |
}, | |
vAxis: { minValue: 0, maxValue: 2 }, | |
legend: { position: 'bottom' } | |
}; | |
var chart = new google.visualization.LineChart(document.getElementById('river-line-chart')); | |
chart.draw(data, options); | |
} | |
<?php | |
return ob_get_clean(); | |
} | |
} | |
River_Height_Levels::get_instance(); |
@kingkool68 When I run your plugin code from the Gist I get the <div id="river-gauge-chart" style="width: 400px; height: 200px;"></div>
being output to the HTML but no further population of content within it.
I also worked out that I was not getting any transient data written to the DB, and additional Javascript components of the Google Visualisation charts where not being loaded / shown in my HTML page source from the google.charts.load('current', {'packages':['corechart']}); google.charts.setOnLoadCallback(drawLineChart);
If I'm reading the plugin code and its data flow correctly, the 'guts' of the plugin ( get_the_csv_data()
/ render_gauge_chart_javascript()
/ render_line_chart_javascript()
) are never being called as the checks for wp_script_is()...
aren't returning TRUE ??
When I add var_dump( 'BEEP' );
within the action_wp_enqueue_scripts
I don't get any output of BEEP unless I change it to !wp_script_is
??!
@James--Taylor Ahh I see the issue. I just updated the Gist again. got rid of the whole action_wp_enqueue_scripts()
part and simplified it. Should work as expected now.
@kingkool68 Thanks Russell, I have updated and it works!
Thank you once again!
@James--Taylor Ah yea that would do the opposite of what we want it to do. I copied the code of the gist and tested it locally as a plugin again. It worked as intended. In the
action_wp_enqueue_scripts
method you can add debugigng statements likevar_dump( 'BEEP' );
and see if that method is actually being called at all.When you try and use the shortcodes what is the output? Is it just
[river-height-gauge]
which would mean the shortcode isn't being registered. Or can you see the HTML<div id="river-gauge-chart" style="width: 400px; height: 200px;"></div>
in the source code of the page?