Add a Hit Counter – Formidable Forms
Recently a question was asked in the Formidable Forms Slack group by a user who needed to add a hit counter to a Formidable Forms View. The user also asked if there was a hook that could be used to help achieve this task and that got us thinking about how this could be done.
The code snippet below is the nice simple solution that will work well across multiple scenarios as it uses the frm_after_display_content hook and a shortcode to display the number of times a View has been ‘viewed’.
Here’s a quick demo (try refreshing the page a few times):
ID | Date | Name | Services |
---|---|---|---|
7807 | 1 Nov 2021 | Terry Jones | Form building |
7806 | 1 Nov 2021 | Chris | Web design |
7805 | 1 Nov 2021 | Terry | Form building |
7804 | 1 Nov 2021 | Terry | Form building |
7803 | 1 Nov 2021 | Chris Adam | Web design, Branding |
5129 | 8 Sep 2020 | terry vegetables | Web design |
5006 | 27 Aug 2020 | Wally Walden | Form building, Graphic design |
5005 | 27 Aug 2020 | Michael Moses | Web design, Form building |
5004 | 27 Aug 2020 | Gary Goblin | Branding, Software |
5003 | 27 Aug 2020 | Chris Adams | Web design, Software |
5002 | 27 Aug 2020 | Steve Smith | Web design, Form building, Software, Other |
5001 | 27 Aug 2020 | Minesh Kothari | Web design, Branding |
5000 | 27 Aug 2020 | Chris | Web design |
4999 | 27 Aug 2020 | Minesh Kothari | Web design, Branding |
4998 | 27 Aug 2020 | Minesh Kothari | Web design, Branding |
4997 | 27 Aug 2020 | Terry Test | Form building |
4996 | 27 Aug 2020 | Steve Smith | Web design |
4995 | 27 Aug 2020 | Terry Test | Form building |
3370 | 28 Feb 2020 | Terry Test | Form building |
3369 | 28 Feb 2020 | Steve Smith | Web design |
3368 | 28 Feb 2020 | Chris | Web design |
3367 | 28 Feb 2020 | Minesh Kothari | Web design, Branding |
3366 | 28 Feb 2020 | Chris | Web design |
3365 | 28 Feb 2020 | Terry Test | Form building |
3364 | 28 Feb 2020 | Chris | Web design |
3363 | 28 Feb 2020 | Steve Smith | Web design |
3351 | 26 Feb 2020 | Terry Test | Form building |
3350 | 26 Feb 2020 | Steve Smith | Web design |
2304 | 15 Apr 2019 | Minesh Kothari | Web design, Branding |
2289 | 10 Apr 2019 | Chris | Web design |
2284 | 8 Apr 2019 | Chris | Web design, Branding |
This post has been viewed 6666 times.
The Code
Add the code below to your functions.php file or to a new snippet in the Code Snippets plugin.
- Change 7808 to the ID of your View
- Add the shortcode
[hit_counter]
to the After Content section of your view.
add_filter('frm_after_display_content', 'view_hit_counter', 30, 4);
function view_hit_counter($after_content, $display, $show, $atts) {
if ($display - > ID == 7808) { //Change 7808 to the ID of your View
$filename = "count.txt"; // the text file to store count
$fp = fopen($filename, 'r'); // Open the file for reading current count
$count = fread($fp, filesize($filename)); // Get exiting count
fclose($fp); //close file
$count = $count + 1; // Add 1 to the existing count
$total = "<p>This page has been viewed <strong>" . $count . "</strong> times.</p>"; // Display the number of hits
$fp = fopen($filename, 'w'); // Reopen to modify content
fwrite($fp, $count); // write the new count to file
fclose($fp); // close file
$after_content = str_replace('[hit_counter]', $total, $after_content);
}
return $after_content;
}
How this works:
The script above creates a file called ‘count.txt‘ in the root directory of your site and uses this to store the number of page hits your view has had.
Each time someone visits a page containing this view the number is retrived, +1 is added and it’s saved back to the server.
This script is designed to work with any View that has a ‘Before Content‘ and ‘After Content‘ section and uses Formidable’s frm_after_display_content
hook to display the hit counter in the ‘After Content‘ section of your view.
If you want to display the hit counter in the ‘Before Content‘ section you can change the hook to frm_before_display_content
on line 1 of the code snippet and also change $after_content
to $before_content
on lines 2, 13 & 16 (4 places in total).
Single Entry Views
When using a Single Entry View you won’t have the ‘Before Content’ or ‘After Content’ sections so the script above won’t work. Instead you can use the frm_display_entry_content
hook although a few other changes are required to make it work with a single entry view which are shown in the example below.
add_filter('frm_display_entry_content', 'frm_get_row_num', 20, 7);
function frm_get_row_num($new_content, $entry, $shortcodes, $display, $show, $odd, $atts) {
if ( $display->ID==11910) {
//get a field value from the current user - Change 1792 to a field ID in the form to get it's value
$user_entry=FrmProEntriesController: :get_field_value_shortcode(array('field_id'=> 1792, 'user_id'=> 'current'));
$filename = $user_entry . "_count.txt"; // the text file to store count
$fp = fopen($filename, 'r'); // Open the file foe reading current count
$count = fread($fp, filesize($filename)); //Get exiting count
fclose($fp); //close file
$count = $count+1; //Add 1 to the existing count
$total = "<p>This post has been viewed <span>" . $count. "</span> times.</p>"; //Display the number of hits
$fp = fopen($filename, 'w'); //Reopen to modify content
fwrite($fp, $count); //write the new count to file
fclose($fp); //close file
$new_content = str_replace('[row_num]', $total, $new_content);
}
return $new_content;
}
This script is a little different in that it looks for a value from the form entry and uses it in the file count name to make sure that each entry has it’s own set of view stats.
You will need to pick a field that is unique to each entry like a time stamp or a User ID field and replace 1792 in the code above with your field ID.