5

What's a surefire way to check/set cookies before the php headers are sent? Is there an action or filter that would be the best place to hook a setcookie() function?

3 Answers 3

3

Depends on whether or not you need to check against WordPress' user authentication. If you need to know whether they're a logged in user, hook onto 'init'. Otherwise, the sooner the better.

If it's something that should fire on every page load, and only checks for existence of the cookie and doesn't need to tap into any of WP's APIs, I'd put it into a custom MU-plugin named 0000a.php to ensure that it fires before any non-core files could accidentally send headers.

5
  • I'm creating a custom tracking plugin that uses the $post-ID value, and will be run on every public facing page.
    – Dan Gayle
    Sep 24, 2010 at 22:04
  • Unfortunately, $post->ID is not available until after the headers have been sent. Here's how the load sequence goes after WP loads: WP::parse_request() reads the request and turns it into variables for WordPress to use, then WP::send_headers() sends the header info to the browser (one of 404, html, or xml). Then WP_Query::parse_request() and WP_Query::get_posts() fire, setting up those globals. Sep 24, 2010 at 23:26
  • 1
    As long as I send the cookies before any html is sent, all will be well. So that would be where? template_redirect? I think that's the last action hook available before the page gets send across, correct?
    – Dan Gayle
    Sep 27, 2010 at 16:50
  • 3
    I'd go with 'wp'. It fires immediately after the globals are registered; that's the absolute earliest you can use the $post global. Sep 27, 2010 at 17:42
  • Adding an action to 'wp' works perfectly!
    – Dan Gayle
    Sep 27, 2010 at 20:44
2

I think functions.php is definitely processed before any output and is fitting place for extensions.

As for hook, maybe after_setup_theme, it comes right after that.

1
  • +1 for putting it in functions.php, if you can. Worked for me.
    – Yarin
    May 10, 2011 at 11:06
0

You can create a function to check or set a cookie but you have to check for wp-config.php because if you use a redirect the file will get accessed directly before index.php on the redirect.

This is from a plugin that Mark Jaquith wrote Age Verification that requires the user to fill out an age verification form before entering the site. I modified it for a liquor, beer, wite site I did.

if ( !defined( 'ABSPATH' ) ) { // we're being called directly, to check the cookie
     if ( file_exists('../../wp-config.php') )
                  include('../../wp-config.php');
     elseif ( file_exists('../../../wp-config.php') )
               include('../../../wp-config.php');
    else
       die('Could not find wp-config.php');

A better way might exist now. The plugin was written over a year ago.

2
  • 1
    This is all being done from WITHIN WordPress, why would I need to check if WP is running?
    – Dan Gayle
    Sep 27, 2010 at 16:01
  • @Dan Gayle in your case you wouldn't. This plugin has to redirect to the verification page to set the cookie which is outside of WordPress.
    – Chris_O
    Sep 27, 2010 at 16:17

Your Answer

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

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