One of the sites I work on is using the Metro Theme by StudioPress Themes for WordPress. And on that site, I have a page dedicated to some odd stats based on the categories and tags and custom taxonomies.
What I have is a post type ‘shows’ and a custom taxonomy called ‘clichés’ and from that I was easily able to generate a percentage of how many shows use the cliché of queers in law enforcement (38%) or how many have the death of a queer (also 38% right now). But that wasn’t enough. We wanted ‘pretty graphs’ and for that I needed a tool like Chart.js and a little PHP magic.
How to Chart.js?
Chart.js is a super cool and super responsive and super flexible way to include a chart. And using it is incredibly easy once I figured out that I could just use inline script tags. A very basic chart that would show you how many days each month has looks like this:
<script src="Chart.js"></script> <canvas id="barDays" width="600" height="400"></canvas> <script> var barDaysData = { labels : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "November", "December"], datasets : [ { fillColor : "#7d3255", strokeColor : "#532138", data : ["31","28","31","30","31","30","31","31","30","31","31"] } ] } var barDays = document.getElementById("barDays").getContext("2d"); new Chart(barDays).Bar(barDaysData); </script>
If you’re using WordPress, you’ll want to use wp_enqueue_script to call it. Here’s what I did for my theme:
wp_enqueue_script( 'chart.js', get_bloginfo('stylesheet_directory').'/inc/js/Chart.min.js' , array( 'jquery' ), CHILD_THEME_VERSION );
But that’s the basics of it. Once I understood that, I was good to go.
The Code
Before I can do anything, I need to make sure I have the data I needed. What I wanted was a list of all the shows that were published and a list of all the cliches, ordered in the way I need them. The order is simply comma separated values, enclosed in quotes, enclosed in brackets:
labels : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "November", "December"],
And the data is similar:
data : ["31","28","31","30","31","30","31","31","30","31","31"]
Since I’m lazy, I checked that the array worked if it ended in a , and it did! That means my PHP looks like this:
$count_shows = wp_count_posts( 'post_type_shows' )->publish; $cliches = get_terms('cliches'); $barshow_labels = ''; foreach ( $cliches as $cliche ) { $barshow_labels .= '"'.$cliche->name.'",'; } $barshow_data = ''; foreach ( $cliches as $cliche ) { $barshow_data .= $cliche->count.','; }
And my js looks like this:
<script> var barShowsData = { labels : [<?php echo $barshow_labels; ?>], datasets : [ { fillColor : "#7d3255", strokeColor : "#532138", data : [<?php echo $barshow_data; ?>] } ] } var barShows = document.getElementById("barShows").getContext("2d"); new Chart(barShows).Bar(barShowsData); </script>
You may notice the simple call of <?php echo $barshow_data; ?>
in there? That’s where it outputs the data I sorted out in the PHP section. Done. I’m could put it more inline, but I liked to separate them as much as I could.
Putting it in the theme
This is a Genesis theme so while I am making use of the Genesis loop, the call to get_template_part
can be used by anyone. I’ll explain in a moment. First, here’s the page template:
<?php /** * Template Name: Lezbian Stats Template * Description: Used as a page template to show page contents, followed by a loop * to show the stats of lezbians and what not. */ // Show Dead count below the content: add_action( 'genesis_entry_footer', 'lez_stats_footer', 9 ); function lez_stats_footer() { get_template_part( 'stats' ); } genesis();
This works like any other page template. You make a page, you select the template, and it loads this custom design.
The magic sauce is in get_template_part( 'stats' );
which calls the file stats.php
and that file has all the code you saw above. This means I can edit my post with all the explanations I want, and then it always outputs the stats on the bottom. By calling the Genesis code in the bottom, I retain all of it’s magic while pulling in what I want.
The Result
Looks nice, doesn’t it? I’m quite fond of it.