I created this pretty quick, and it is by far, not the prettiest thing out there. This uses an extra table in the MySQL table to keep track of pages that get viewed and how many times they are viewed. Here is what I did:
Step 1 – Create a new table!
Go to your MySQL database and create a table called “wp_counter” with 2 fields: Post_Id and Count. Both are Int with length 10. Here is the SQL code you can copy and paste to make it a bit shorter:
CREATE TABLE `wp_counter` (`Post_Id` INT( 10 ) NOT NULL , `Count` INT( 10 ) NOT NULL)
Step 2 – Editing post-template.php
This is the file that is used to display your posts (not the snippets on your front page, but full out posts). It is located in the “wp-includes” directory.
Open post-template.php for editing.
Search for a function called “the_content()“. It typically starts on line 165 should look like this:
165 166 167 168 169 170 | function the_content($more_link_text = null, $stripteaser = 0, $more_file = '') { $content = get_the_content($more_link_text, $stripteaser, $more_file); $content = apply_filters('the_content', $content); $content = str_replace(']]>', ']]>', $content); echo $content; } |
So what we want to do is make it so that every time it shows the content, it will update the count and display it to the user. So we are going to change that function to look like this:
165 166 167 168 169 170 171 172 | function the_content($more_link_text = null, $stripteaser = 0, $more_file = '') { $content = get_the_content($more_link_text, $stripteaser, $more_file); $content = apply_filters('the_content', $content); $content = str_replace(']]>', ']]>', $content); echo $content; update_count(); echo"<small><i>Views: ".get_content_views()."</i></small>"; } |
And immediately following that, we are going to add a couple functions:
173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | function update_count(){ global $wpdb, $id; if($wpdb->query($wpdb->prepare("SELECT * FROM wp_counter WHERE Post_Id='$id'"))==0) $wpdb->insert("wp_counter",array('Post_Id'=>$id,'Count'=>1),array('%d','%d')); else { $row=$wpdb->get_row($wpdb->prepare("SELECT * FROM wp_counter WHERE Post_Id='$id'"),ARRAY_A); $count=$row['Count']+1; $wpdb->update('wp_counter',array('Count'=>$count),array('Post_Id'=>$id),array('%d'),array('%d')); } } function content_views(){ global $wpdb, $id; $row=$wpdb->get_row($wpdb->prepare("SELECT * FROM wp_counter WHERE Post_Id='$id'"),ARRAY_A); echo $row['Count']; } |
That’s it! So your finalized post-template.php will look like this:
function the_content($more_link_text = null, $stripteaser = 0, $more_file = '') { $content = get_the_content($more_link_text, $stripteaser, $more_file); $content = apply_filters('the_content', $content); $content = str_replace(']]>', ']]>', $content); echo $content; update_count(); echo"<small><i>Views: ".get_content_views()."</i></small>"; } function update_count(){ global $wpdb, $id; if($wpdb->query($wpdb->prepare("SELECT * FROM wp_counter WHERE Post_Id='$id'"))==0) $wpdb->insert("wp_counter",array('Post_Id'=>$id,'Count'=>1),array('%d','%d')); else { $row=$wpdb->get_row($wpdb->prepare("SELECT * FROM wp_counter WHERE Post_Id='$id'"),ARRAY_A); $count=$row['Count']+1; $wpdb->update('wp_counter',array('Count'=>$count),array('Post_Id'=>$id),array('%d'),array('%d')); } } function content_views(){ global $wpdb, $id; $row=$wpdb->get_row($wpdb->prepare("SELECT * FROM wp_counter WHERE Post_Id='$id'"),ARRAY_A); echo $row['Count']; } function get_content_views(){ global $wpdb, $id; $row=$wpdb->get_row($wpdb->prepare("SELECT * FROM wp_counter WHERE Post_Id='$id'"),ARRAY_A); return $row['Count']; }
Now every time someone visits the page, they will see how many other people have viewed that page!
Views: 2067
Submitting Comment, Give me a second...
Because of the way it is written, viewing archives or topics will result in page views because they used the function “the_content()”. The fix this, I removed the lines I added to that function:
update_count();echo"Views: ".get_content_views()."";
Then I went into the theme itself on the single post template and page template. Where it says, “the_content();”, I just changed it to look like this:
the_content();update_count();echo"Views: ".get_content_views()."";Now only people who visit a single post or page will have their views counted.