Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I've been searching on the net for a solution to my problem all day, but I can't make sense of anything I see, since I know absolutely NOTHING about coding.

What I'd like to do:

  1. I'd like to set a cookie when a person visits one particular page on my website, let's call it Page 1.
  2. Then, when that visitor goes to another unrelated page (Page 2), he/she gets automatically redirected to Page 3 (because of the cookie that was set when they visited Page 1). Visitors without the cookie, don't ever get to see Page 3.

What I've managed to do so far:

I've managed to SET the cookie in Wordpress functions.php, by inserting the following:

function set_newuser_cookie() {
    if (!isset($_COOKIE['subscriber'])) {
        setcookie('subscriber', no, 0, COOKIEPATH, COOKIE_DOMAIN, false);
    }
}
add_action( 'init', 'set_newuser_cookie');

I've managed to define a redirect by inserting the following in functions.php:

if (!isset ($_COOKIE['subscriber']))
header ("Location: page2");
else
header ("Location: page3");

That's as far as I've gotten. It doesn't work because neither of the above are page-specific. I only want the cookie to be set (or variable changed) when the visitor visits one specific page, and then get redirected when he visits another specific page.

Is this doable?

Oh, and by the way, I'm on a self-hosted Wordpress site.

Thanks so much.

Sammie

share|improve this question

3 Answers 3

So the only part that is missing from your code is checking what page you are currently on. The is_page() function is a good way to get this context.

You could try it this way (I did not test it, only writeup out of my head to show the concept):

function set_newuser_cookie() {
    if (!isset($_COOKIE['subscriber']) && is_page('my-page-slug-page1')) {
        setcookie('subscriber', no, 0, COOKIEPATH, COOKIE_DOMAIN, false);
    }
}
add_action( 'init', 'set_newuser_cookie');

function my_cookie_redirect() {
   if (isset($_COOKIE['subscriber']) && is_page('my-page-slug-page2')) {
      wp_redirect('/page3');
      exit;
   }
}
add_action('template_redirect', 'my_cookie_redirect', 1);

The wordpress is_page() function either takes the page id, page slug or page_title as param. http://codex.wordpress.org/Function_Reference/is_page

You should also always exit after an redirect, because otherwise the user would first load page-2 before beeing redirect to page-3

share|improve this answer
    
Thanks for replying s1lv3r. Unfortunately this didn't work. For some reason, identifying either posts or pages using is_page() doesn't seem to work, in that the cookie doesn't get set. I tried using both slugs and page IDs. –  Sammie Apr 26 '13 at 15:23
    
My fault. init is too early to use is_page() please exchange it with template_redirect in the first add_action call. –  s1lv3r Apr 26 '13 at 15:31
function template_redir_wpse_97315() {
   global $post;
   if (!isset($post->ID)) return;

   if ($post->ID == 1) {
     if (!isset($_COOKIE['subscriber'])) {
        setcookie('subscriber', no, 0, COOKIEPATH, COOKIE_DOMAIN, false);
     }          
   }

   if (is_single() && $post->ID == 2 && isset($_COOKIE['subscriber'])) {
     wp_safe_redirect(home_url('/page-3/'));
     exit;
   }

   if (is_single() && $post->ID == 2 && !isset ($_COOKIE['subscriber'])) {
     wp_safe_redirect(home_url());
     exit;
   }
}
add_filter('template_redirect','template_redir_wpse_97315',1);

I admit that I am not quite sure if the logic is right. You description of the redirects plus the code you posted has me a bit confused. However, that should be the basic idea.

The post IDs are obviously wrong. You will need to sort those out. get_permalink(<post-id>) should do it. You may need other conditions to make those redirects behave.

Reference

http://codex.wordpress.org/Plugin_API/Action_Reference/template_redirect
http://codex.wordpress.org/Function_Reference/wp_safe_redirect http://codex.wordpress.org/Function_Reference/home_url

share|improve this answer
    
hmmm... wp_safe_redirect(). Interesting. Never saw that before. Thank's for introducing! –  s1lv3r Apr 26 '13 at 13:51
    
wp_safe_redirect is a local redirect. There is also wp_redirect –  s_ha_dum Apr 26 '13 at 13:54
    
That worked! Can't answer my own question for another 40 minutes. I'll post my modified version of your script a little later ;p. –  Sammie Apr 26 '13 at 15:35
    
I this answer works, mark it as accepted. I am not sure why you need to post a modified version. –  s_ha_dum Apr 26 '13 at 15:39
    
Hi, sorry, modified version because I didn't want it redirecting to my home page at any point. Also, template_redir_wpse_97315() was giving me some error message on Wordpress, so I replaced it with set_newuser_cookie(). –  Sammie Apr 26 '13 at 17:16

That did it s_ha_dum! You didn't quite get what I wanted, that's my fault for not having been able to explain it properly. I didn't want the visitor to get redirected to the home page at any point.

Below is what I settled with: (edited on 27th apr 2013)

I'm still having problems though.

Trouble is, it works flawlessly on my mac (chrome, safari and firefox), but doesn't on my PC. On the PC, it sets the cookies just fine, but the redirect happens regardless of whether the cookie is set or not.

New edit: Got it working now! Thanks all. Code below works flawlessly.

function set_newuser_cookie() {
   global $post;
   if (!isset($post->ID)) return;

 if ($post->ID == 1 || $post->ID == 7 || $post->ID == 8 || $post->ID == 9) 

 {
     if (!isset($_COOKIE['subscriber'])) {
        setcookie('subscriber', no, 0, COOKIEPATH, COOKIE_DOMAIN, false);
     }          
   }

   if (isset($_COOKIE['subscriber']) && $post->ID == 2 || $post->ID == 10) {
     wp_safe_redirect('/page3/');
     exit;
   }


}
add_filter('template_redirect','set_newuser_cookie',1);
share|improve this answer
    
if( in_array($post->ID, array(1,524,624) ) ) The $post->ID is unique among all post types. It will work for post, pages and every other custom post types you may have defined. –  s1lv3r Apr 27 '13 at 1:42
    
Hi s1lv3r, thanks, but that didn't work. I did some digging around and here's what DID work: if ($post->ID == 1 || $post->ID == 24 || $post->ID == 441 || $post->ID == 4414). I Have a new problem though. Though it's working fine on my Mac, it isn't working on my PC. On the PC, the setting of the cookie is working perfectly, but the redirect is triggered regardless of whether the cookie is set or not. Any ideas? Please refer to my modified code. –  Sammie Apr 27 '13 at 17:20
    
Working now, thanks –  Sammie Apr 27 '13 at 18:23

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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