Wordpress Plugin in 12 hours

Published: 01/03/2009

Programming, Code

In “Why I’m writing my own blog system” I announced my plans to build a custom blog platform. Seeing as I wrote about it before I’d actually written the script I had to publish the announcement on a different blog system; Wordpress. Something happened while I was using Wordpress though; I actually started enjoying it. The sophistication behind the scenes really started to pique my interest and get me excited. I started looking at plugins and getting into how themes are put together; it’s a really a well thought out and executed product.

Now, with the above realization came another; I shouldn’t write a blog system anymore, Wordpress is just too damn good at it. Doing so would be the picture of reinventing the wheel; it would just be a waste of my time. That’s not to say it’s perfect. There are definitely a few areas that Wordpress is lacking in, for my needs especially. It’s not really an issue though because the developers thought of this and implemented a very well thought out plugin system.

One of the more obvious features I wanted, that Wordpress is lacking, is some sort of tracking mechanism for links in posts. Basically, I want to know how many times links in my posts have been clicked so I decided to write a plugin to handle this. Surprisingly, I was able to get a working version up and going in about 12 hours of total work.

The Plan

Well, as I stated above the plugin is going to allow the tracking of link clicks in posts and pages. I want this to be as painless as possible to manage so there won’t be any CRUD portion. Initially, the plugin will extract all links out of the post on the user side and modify them to allow for tracking. The tracking should delineate between unique and repeat clicks and stats should be displayed on the edit page. The plugin should be installable through the Wordpress plugin manager

The Basics

A plugin is just a php script that follows some formatting and business rules so it’s pretty straight forward once you get the requirements out of the way. Here are the basics:

Plugins should all be placed in the /wp-content/plugins directory. It’s also a good idea to place your plugin in it’s own sub directory; this way all your files are segregated into a single place.

All plugins require a specific header comment format:

1
2
3
4
5
6
7
8
9
10
<?php
/*
Plugin Name: Name Of The Plugin
Plugin URI: http://URI_Of_Page_Describing_Plugin_and_Updates
Description: A brief description of the Plugin.
Version: The Plugin's Version Number, e.g.: 1.0
Author: Name Of The Plugin Author
Author URI: http://URI_Of_The_Plugin_Author
*/
?>

Right away I noticed how the above comment isn’t in phpdoc but it turns out that’s ok; you can still put that above anything else.

After that is where you can put the license:

11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
/*  Copyright YEAR  PLUGIN_AUTHOR_NAME  (email : PLUGIN AUTHOR EMAIL)
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
?>

Having the above in a file placed in the plugin directory is enough to have the plugin displayed in the plugin manager.

The functionality of the plugin comes from custom functions that are placed in hook wrappers. The hook wrappers work through various actions and filters which are accessed through add_action() and add_filter() like the below:

29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
function plugin_filter_function($content){
	//do something to the post content
	return $content;
}
 
function plugin_action_function(){
	//execute some code&#8230;
 
}
add_filter('the_content', 'plugin_filter_function', 1);
add_action('wp_head', 'plugin_action_function');
?>

To activate a plugin there might be some preparation needed for the plugin; the same for deactivating. To execute functionality during both processes:

40
41
42
43
44
45
46
47
48
49
50
51
<?php
function plugin_install_function(){
	//execute some code&#8230;
}
 
function plugin_deactivate_function(){
	//execute some code&#8230;
 
}
register_activation_hook(__FILE__,'plugin_install_function');
register_deactivation_hook(__FILE__, 'plugin_deactivate_function');
?>

It’s also possible to disable some built in actions and functions, though I didn’t need to do this on my plugin.

50
51
52
53
<?php
remove_filter('filter_hook','filter_function')
remove_action('action_hook','action_function')
?>

The Program

With the above out of they way all that’s left is the actual plugin code. Here’s the basic outline:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
<?php
/**
 * Wordpress Click Tracker
 *
 * Contains all the click tracker functions.
 *
 * @author Eric Lamb <eric@ericlamb.net>
 * @package    wp-click-tracker
 * @version 0.1
 * @filesource
 * @copyright 2009 Eric Lamb.
 */
/*
Plugin Name: Click Tracker
Plugin URI: http://blog.ericlamb.net/
Description: Tracks all links in posts.
Version: 0.1
Author: Eric Lamb
Author URI: http://blog.ericlamb.net
*/
 
/*  Copyright 2009  Eric Lamb  (email : eric@ericlamb.net)
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
 
/**
 * Version of wp-click-tracker code
 * @global string	$click_tracker_version
 */
$click_tracker_version = "0.1";
 
/**
 * Version of wp-click-tracker database
 * @global string	$click_tracker_db_version
 */
$click_tracker_db_version = "0.1";
 
/**
 * Wrapper for click track filter
 *
 * @param   string  $content	string to parse
 * @return  string				The completed
 */
function wp_click_tracker_filter($content)
{
	return wp_click_tracker_replace_uris($content);
}
 
/**
 * Takes a string and extracts all the links (URIs)
 *
 * @param   string  $content     string to parse
 * @return  array	The links
 */
function wp_click_tracker_extract_urls($content){
 
}
 
/**
 * Replaces all the URLs in a string with newly created URLs for tracking
 *
 * @param   string  $content	string to parse
 * @return  string	$content	The filtered content
 */
function wp_click_tracker_replace_uris($content){
 
}
 
/**
 * Installs the database tables and settings
 *
 * @return  void
 */
function wp_click_tracker_install () {
	global $wpdb;
	global $click_tracker_db_version;
	global $click_tracker_version;
 
	add_option("click_tracker_version", $click_tracker_version);
	add_option("click_tracker_db_version", $click_tracker_db_version);
}
 
/**
 * Handles the removal of a plugin
 *
 * @return  void
 */
function wp_click_tracker_deactivate(){
 
}
 
/**
 * Adds the javascript embed to the header
 *
 * @return  void
 */
function wp_click_tracker_head()
{
 
}
 
/**
 * Execution of click tracker
 *
 * @return  void
 */
function wp_click_tracker_go(){
 
}
 
/**
 * Displays administration quick view
 *
 * @return  void
 */
function wp_click_tracker_link_data(){
 
}
 
/**
 * Adds the click tracker options page to the administration module
 *
 * @return	void
 */
function wp_click_tracker_menu() {
  add_options_page('Click Tracker Options', 'Click Tracker', 8, __FILE__, 'wp_click_tracker_options');
}
 
/**
 * Displays the click tracker administration module
 *
 * @return  void
 */
function wp_click_tracker_options() {
 
}
 
register_activation_hook(__FILE__,'wp_click_tracker_install');
register_deactivation_hook(__FILE__, 'wp_click_tracker_deactivate');
 
add_action('edit_form_advanced', 'wp_click_tracker_link_data');
add_action('edit_page_form', 'wp_click_tracker_link_data');
 
add_action('wp_head', 'wp_click_tracker_head');
add_action('init','wp_click_tracker_go');
 
add_filter('the_content', 'wp_click_tracker_filter', 1);
add_filter('the_excerpt', 'wp_click_tracker_filter', 1);
?>

Granted, the above doesn’t really do anything; it’s only the framework. Still, I was able to get the research and above code done in a little under 6 hours. After that it’s just like any other project (write function, test, fix bugs, write new funtion, etc…) which only took an additional 6 hours.

Download the complete plugin.
Click Tracker

Resources

Writing a Plugin
Plugin API
Wordpress Hooks
Wordpress Code Documentation