I am using ajax on my template to load a file called counter.php. When I click a button, it is supposed to increase the counter. But when I click the button I get this error "Fatal error: Call to undefined function get_option()".

This is what I have on counter.php

$post_ID = $_POST['ID'];
$opn_name = 'fb_counter'.$post_ID;
$counter_value = get_option($opn_name);
$counter_value = 0;
update_option($opn_name, $counter_value+1);

echo get_option($opn_name);

I am not sure what is wrong. Do I have to include any wordpress files on this php file ?

1 Answer 1


Basically, if you're going to be making calls to WordPress functions, then you should be in the WordPress environment, which means that you should not be calling your own files to begin with, but should implement your AJAX call within a WordPress hook.

Read up on this: http://codex.wordpress.org/AJAX_in_Plugins

That article describes how to implement AJAX requests within WordPress plugins, but it works equally well in themes or in any other code that WP loads.

Essentially, you hook a function to wp_ajax_* or wp_ajax_nopriv_* and then make your request through the the admin-ajax.php file instead of directly to your own file.

Side note: Implementing a counter like you're trying to do won't work particularly well, because you have a race-condition there. More than one person can be visiting your site at the exact same time. Storing counter data in the DB like that isn't going to scale to a very large site with lots of requests, although it will work fine for smaller sites.

  • Thanks man you are a life saver. I will look into the these worpdpress functions. But how can this race condition be avoided or dealt with. I want to create a counter that counts how many times a button is pressed. I am expecting 20,000 to 30,000 visitors p/m.
    – Atif
    Commented Sep 19, 2012 at 4:37
  • I doubt you'll have a problem with only that many visitors.
    – Otto
    Commented Sep 19, 2012 at 19:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.