基于Cookie存在的Wordpress重定向

时间:2018-01-05 21:45:18

标签: php wordpress function redirect cookies

首先,在编码时我是一个完全的业余爱好者,但我一直在阅读Stack Overflow和其他网站上的数百个帖子,试图将正确的PHP代码串在一起,以使我的网站能够运行某种方式。它可能看起来很糟糕并且格式错误,但我希望我想要实现的目标能够实现。

在我们进入代码之前,基本的想法是:当有人来到我的电子商务网站时,我想向他们展示三个(或更多)"品牌"。当他们点击他们喜欢的品牌并进入品牌页面时,网站应该在他们的浏览器中删除一个cookie。当他们以后返回网站时,我希望该网站能够自动重定向到他们选择的品牌页面,而不是再次展示这三个选项。

我作为概念证明创建的简化代码使用两个品牌选项,其中两个具有相同名称但不同值的Cookie根据访问者何时访问特定品牌页面而放置。只有第二个cookie值(brand_2)才会导致此简化代码中的重定向。当访问者访问该网站时,第一个Cookie(值" brand_1")会自动下降。我不喜欢这个解决方案,甚至不知道我是否需要这样做,但它似乎在某种程度上起作用。当访问者访问品牌2页面时,Cookie值会更改为" brand_2"正如它应该。当他们转到品牌1页时,Cookie值会恢复到Brand_1,就像他们第一次到达网站时一样。

以下是Cookie的代码,虽然不完美但似乎有效:

function brand_cookies() {
    if(!isset($_COOKIE['brands'])){
        setcookie('brands', 'brand_1', time()+3600*24*365*3, 
SITECOOKIEPATH, COOKIE_DOMAIN, false, true);
    }elseif(is_page('brand1') || is_page('brand2')){
        if($_COOKIE['brands'] == 'brand_2'){
            setcookie('brands', 'brand_1', time()+3600*24*365*3, 
SITECOOKIEPATH, COOKIE_DOMAIN, false, true);
    }elseif($_COOKIE['brands'] == 'brand_1'){
        setcookie('brands', 'brand_2', time()+3600*24*365*3, 
SITECOOKIEPATH, COOKIE_DOMAIN, false, true);
        }   
    }   
}
add_action( 'wp', ‘brand_cookies',10,1);

不起作用的部分是我的wp_redirect,当我在wordpress中的functions.php文件中将其添加到上面的代码下面时,会导致白屏死机。它确实在某种程度上起作用,就像饼干" brand_2"存在,网站重定向到该网站的品牌2页。它只是全白的。

以下是重定向的代码:

add_action( 'template_redirect', ‘brand_redirect’ );

function brand_redirect(){
    // do your check and call wp_redirect here
    if($pagename !='home' ) {
        if($_COOKIE['brands'] == 'brand_2' ) 
            wp_redirect( 'http://test.site.com/brand2' ) ;
            exit; }

}

我的最终目标是为我的三个或更多品牌及其相关网页的上层代码添加更多Cookie,然后在下面的代码中创建相应的重定向。希望这一切都有意义!任何帮助你可以提供我所做的错误,导致白屏死机将不胜感激!谢谢你的帮助!

更新:

使用Will Hine对顶级脚本的建议非常适合根据网站访问者何时到达特定品牌页面将Cookie添加到浏览器中。非常感谢他帮我解决这个问题!这是他的剧本:

function brand_cookies() {

    $brands = [
       'brand1' => 'brand_1',
       'brand2' => 'brand_2',
       'brand3' => 'brand_3'
    ];

    foreach ($brands as $page => $cookie) {
        if (is_page($page)) {
        setcookie('brands', $cookie, time()+3600*24*365*3, SITECOOKIEPATH, COOKIE_DOMAIN, false, true);
        }
    }
}

我以为我开始想出重定向并尝试根据上面的Will脚本编写我自己的脚本,以触发从主页到相应品牌页面的重定向。我只将其设置为基于其中一个品牌cookie重定向,而不是全部三个作为测试。不幸的是,当我将脚本上传到我的functions.php文件中时,整个网站崩溃了,包括wordpress仪表板。我不得不通过我的cPanel重新上载原始的Functions.php文件而不使用重定向脚本。这是我下面的网站崩溃脚本,希望在接下来的几天里我能找到一个可行的解决方案。

if( $pagename !=('home'))  {
    if (isset($_COOKIE['brands'])){
        if($_COOKIE['brands'] == 'brand_2' )
            header('Location: http://test.site.com/brand2/');
        exit;
    }
}

这是我尝试使用所有三个品牌Cookie的另一个版本,当我测试它时,它在浏览器中导致了太多的重定向:

function brand_redirect(){
    if($pagename !='home' ) {
        if($_COOKIE['brands'] == 'brand_1' ) 
            header('Location: http://test.site.com/brand1'); }
    elseif($pagename !='home' ) {
        if($_COOKIE['brands'] == 'brand_2' ) 
            header('Location: http://test.site.com/brand2'); }
    elseif($pagename !='home' ) {
        if($_COOKIE['brands'] == 'brand_3' ) 
            header('Location: http://test.site.com/brand3'); }
}
add_action( 'template_redirect', 'brand_redirect' );

1 个答案:

答案 0 :(得分:1)

试试这段代码。只有当有人登陆品牌页面时,才会设置Cookie。

数组$ brands的键是页面标识符。相应的值是应在这些页面上设置的cookie。

function brand_cookies() {

    $brands = [
       'brand1' => 'brand_1',
       'brand2' => 'brand_2',
       'brand3' => 'brand_3'
    ];

    foreach ($brands as $page => $cookie) {
        if (is_page($page)) {
        setcookie('brands', $cookie, time()+3600*24*365*3, 
SITECOOKIEPATH, COOKIE_DOMAIN, false, true);
        }
    }
}

对于第二个,我认为你只想在主页上设置cookie。

function brand_redirect(){
    $brands = [
        'brand_1' => 'http://test.site.com/brand1',
        'brand_2' => 'http://test.site.com/brand2',
        'brand_3' => 'http://test.site.com/brand1'
    ];

    if($pagename =='home' && isset($_COOKIE['brands'])) { // only on home page
        foreach ($brands as $cookie => $redirect_page) {
            if ($_COOKIE['brands'] == $cookie) {
                header("Location: $redirect_page"); 
            }
        }
}
add_action( 'template_redirect', 'brand_redirect' );