root/blogtimes/trunk/blogtimes.php

Revision 457, 4.8 kB (checked in by matt, 3 years ago)

Moving into trunk

Line 
1 <?php
2
3 /*
4 Plugin Name: Blogtimes
5 Plugin URI: http://dev.wp-plugins.org/wiki/BlogTimes
6 Description: This plugin generates a bar graph image showing when posts are made during a period of time. For this to work <code>wp-images/blogtimes.png</code> must be writable by the web server. Original code by Sanjay Sheth of sastools.com.
7 Author: Matt Mullenweg
8 Author URI: http://photomatt.net/
9 Version: 0.2
10 */
11
12
13 // Change the defaults to modify anything
14 function updateBlogTimePNG($dummy = 'placeholder', $saveFile = '', $last_x_days = 30,
15     $width = 480, $height = 65, $horzpadding = 5, $vertpadding = 5,
16     $show_ticks = 1, $title = "Blog Post Times") {
17
18     if (!$saveFile) $saveFile = ABSPATH . 'wp-images/blogtimes.png';
19     // constants defining image
20     $fontheight = ImageFontHeight(2);
21     $fontwidth  = ImageFontWidth(2);
22     $monthtext = "Last $last_x_days days";
23     $unitname = "hour of day";
24     $show_units = 1;
25
26     // create the basic image
27     $im = @ImageCreate ($width, $height)
28        or die ('Cannot create a new GD image.');
29
30     // generate some colors, format: RED, GREEN, BLUE
31     $white      = ImageColorAllocate ($im, 255,255,255);
32     $black      = ImageColorAllocate ($im, 0,0,0);
33     $beige      = ImageColorAllocate ($im, 238,238,238);
34     $blue       = ImageColorAllocate ($im, 102,102,102);
35     $silver     = ImageColorAllocate ($im, 0xE0,0xE0,0xE0);
36
37     // define what color to use where
38     $back_color = $white;    # this is background of entire image (text & all)
39     $box_color  = $beige;    # this is background of just the posts box
40     $text_color = $black;
41     $line_color = $blue;     # this is color of lines for each post
42     $border_color = $black;
43
44     # query the db and build the list
45     $posttimes = getPostTimes($last_x_days);
46
47     # calculate how many intervals to show
48     $intervals = floor( ($width / 40) );
49     if ($intervals >= 24) $i_mod = 1;
50     else if ($intervals >= 12) $i_mod = 2;
51     else if ($intervals >= 8) $i_mod = 3;
52     else if ($intervals >= 6) $i_mod = 4;
53     else if ($intervals >= 4) $i_mod = 6;
54     else if ($intervals >= 3) $i_mod = 8;
55     else if ($intervals >= 2) $i_mod = 16;
56     else $i_mod = 24;
57
58     # fill the image with the background color
59     ImageFill($im, 0, 0, $back_color);
60
61     # create a filled  rectangle with a solid border
62     $left = $horzpadding; $right = $width - $horzpadding;
63     $top = $fontheight + $vertpadding;
64     $bottom = $height - $vertpadding - $fontheight;
65
66     if ($show_units)
67         $bottom -= $fontheight;
68
69     ImageFilledRectangle($im, $left,$top,$right,$bottom, $box_color);
70     ImageRectangle($im, $left,$top,$right,$bottom, $border_color);
71
72     # write title and monthtext
73     ImageString($im, 2, $left, 0, $title,$text_color);
74     $txtwidth = strlen($monthtext) * $fontwidth;
75     ImageString($im, 2, $right - $txtwidth, 0,$monthtext,$text_color);
76
77     # add the legend on the bottom
78     for ($i = 0; $i <= 23; $i=$i+1)
79     {
80         if ($i % $i_mod == 0) {
81             $curX = $left + ($right - $left)/24 * $i;
82
83             if ($i > 9) {$strX = $curX - 5;}
84             else        {$strX = $curX - 2;}
85
86             ImageString($im, 2, $strX , $bottom, $i, $text_color);
87             if ($show_ticks)
88                 ImageLine($im, $curX, $bottom, $curX, $bottom - 5, $tick_color);
89         }
90     }
91     ImageString($im, 2, $right - 5, $bottom0, $text_color);
92     if ($show_units) {
93         $curX = ($right + $left) / 2 - ($fontwidth * strlen($unitname)/2);
94         $curY = $bottom + $fontheight + 2;
95         ImageString($im, 2, $curX, $curY, $unitname, $text_color);
96     }
97
98     # now we draw the lines for each post
99     # the post times should be in terms of # of minutes since midnight
100     $arrcount = count($posttimes);
101     for ($i = 0; $i < $arrcount; $i++)
102     {
103         # make sure postTime is between 0 and 1439
104         $curPostTime = abs($posttimes[$i]) % 1440;
105         
106         # calculate the horz pos inside box             
107         $curX = $left + ($right - $left)/1440 * $curPostTime;    # 1440 minutes per day
108
109         # draw the post line
110         ImageLine($im, $curX, $bottom, $curX, $top, $line_color);
111     }
112
113     # save the file to disk in PNG format
114     ImagePNG ($im,$saveFile);
115 }
116
117 # This function will query the db for all the posts in last x days
118 # and build an array of # of minutes since midnight for each post
119 function getPostTimes( $last_x_days = 30 ) {
120     global $wpdb, $tableposts;
121
122     $result = $wpdb->get_results("
123         SELECT HOUR(post_date)*60+MINUTE(post_date) AS totmins
124         FROM $tableposts
125         WHERE (TO_DAYS(CURRENT_DATE) - TO_DAYS(post_date)) <= $last_x_days
126         AND post_status = 'publish'
127         ORDER BY totmins ASC
128         ");
129
130     foreach ($result as $row) {
131       $postTimes[] = $row->totmins;
132     }
133     
134     return $postTimes;
135 }
136
137
138 add_action('publish_post', 'updateBlogTimePNG');
139 ?>
Note: See TracBrowser for help on using the browser.