【问题标题】:Wordpress redirect based on the presence of a cookie基于 cookie 存在的 Wordpress 重定向
【发布时间】:2020-04-11 15:38:22
【问题描述】:

首先,在编码方面,我是一个完全的业余爱好者,但我一直在阅读 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文件中的上述代码下方时,它会导致白屏死机。但它确实在一定程度上起作用,因为当 cookie“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' );

【问题讨论】:

  • 这看起来通常是正确的。需要注意的简单问题:在重定向之前是否有任何内容被发送到浏览器?这将停止重定向。 cookie 设置正确吗?我会在您的页面顶部 print_r($_COOKIE) 看看是什么造成的。或者:使用 Chrome 浏览您的网站,点击“查看-> 开发人员 -> 开发人员工具”,然后点击“应用程序”——然后您可以在左侧选择“cookies”以查看设置了哪些 cookie。
  • 感谢您的反馈!我的第一步是将顶部代码添加到 functions.php 文件并测试该站点。这似乎有效;当我使用 chrome 时,当我转到品牌 2 页面时,brand_1 cookie 会换成 brand_2 cookie。当我添加 wp_redirect 代码时,整个站点都是白色的;然而,有了brand_2 cookie,它会自动重定向到我想要的brand 2页面。我就是想不通为什么这一切都是白色的。
  • 全白页通常意味着错误。您可以访问错误日志吗?
  • 我应该拥有它们,我得四处挖掘一下,看看能不能找到它们。它是我的网站,但我对后端的工作方式一无所知。我大部分时间都在 wordpress 仪表板上。我会检查它!谢谢你带领我朝着正确的方向前进,威尔!
  • 很抱歉,我没有为您提供更多帮助。我刚刚检查了 wordpress 的文档。尝试将其添加到您的 functions.php 文件的顶部:define('WP_DEBUG', true);这可能会使错误(如果发生错误,而且看起来确实如此)被打印到屏幕上,这样您就可以看到它们是什么。

标签: php wordpress function redirect cookies


【解决方案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' );

【讨论】:

  • 这工作完美!!谢谢!!在过去的几天里,我一直在尝试添加重定向代码,有一次我完全崩溃了网站,不得不通过我的 cPanel 重新上传 footer.php 脚本,而没有重定向。所以,这方面的工作仍在进行中,但你的 cookie 脚本正是我解决第一部分所需要的。
  • 我刚刚用一些更新的重定向脚本更新了我的原始问题。希望它们有意义!
  • 解决了问题!起初,当我添加它时,它没有做任何事情,无论是积极的还是消极的。玩了一会儿,发现如果我将 if 语句从 "if($pagename ==" 更改为 "if(is_page('home')" 它有效。我不知道为什么会这样,但它确实有效!非常感谢您的帮助!
  • 感谢您的彻底回复,这救了我!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多