如果是_PAGE(‘PAGE’),如何设置cookie?我应该使用ADD_ACTION(‘init’)还是有另一个操作?

时间:2013-09-10 作者:usama sulaiman

如果is\\u page(\'arabic\')或is\\u page(\'english\'),我想设置cookie,然后仅当页面名称/段塞arabicenglish, 我认为init操作发生在代码确定当前页面之前,如何做到这一点

此外,在解决该问题后,我如何确保setcookie将在重定向之前发生,以便显示刚刚设置的cookie(因为cookie需要刷新)

下面是我的代码

function site_set_user_language() {
    if(!isset($_COOKIE[\'site_language\'])){
        setcookie(\'site_language\', \'ar\', time()+3600*24*365*3,\'/\',\'.site.com\');
    }elseif(is_page(\'arabic\') || is_page(\'english\')){
        if($_COOKIE[\'site_language\'] == \'en\'){
            setcookie(\'site_language\', \'ar\', time()+3600*24*365*3,\'/\',\'.site.com\');
            wp_redirect( home_url());
            exit();
        }elseif($_COOKIE[\'site_language\'] == \'ar\'){
            setcookie(\'site_language\', \'en\', time()+3600*24*365*3,\'/\',\'.site.com\');
            wp_redirect( home_url());
            exit();
        }   
    }   
}
add_action( \'init\', \'site_set_user_language\',10,1);
add_action( \'template_redirect\', \'site_lang_home_redirect\' );

2 个回复
SO网友:brasofilo

template_redirectwp (正如OP在评论中指出的)是实现这一点的好挂钩。但示例代码中存在逻辑问题。我想应该是这样的:

add_action( \'template_redirect\', \'cookie_redirect_wpse_113662\' );

function cookie_redirect_wpse_113662() {
    # No cookie set, let\'s do it
    if( !isset( $_COOKIE[\'site_language\'] ) )
        set_cookie_wpse_113662( \'ar\' );

    # One of our pages, check/change cookie and redirect
    if( is_page( array( \'arabic\', \'english\' ) ) ) 
    {
        # Page is Arabic and cookie was English, change cookie
        if( is_page( \'arabic\' ) && $_COOKIE[\'site_language\'] == \'en\' )
            set_cookie_wpse_113662( \'ar\' );

        # Page is English and cookie was Arabic, change cookie
        elseif( is_page( \'english\' ) && $_COOKIE[\'site_language\'] == \'ar\' ) 
            set_cookie_wpse_113662( \'en\' );

        # Redirect 
        do_redirect_wpse_113662();
    }
});
function set_cookie_wpse_113662( $lingo ) {
    setcookie( \'site_language\', $lingo, time() + 3600 * 24 * 365 * 3, \'/\', \'.example.com\' );
}
function do_redirect_wpse_113662( $where = \'\' ) {
    $where = empty( $where ) ? home_url() : $where;
    wp_redirect( $where );
    exit();
}
还有一个问题,当我们单击阿拉伯语和英语链接时,最好返回到原始页面:home_url() 应该是site_url($last_url). 看见this post, 作者:Konstantin Kovshenin。

为此,在每个页面上,这些页面的链接应为http://example.com/LANGUAGE/?original_url=$last_url. 但这是另一个问题的主题*

<支持>* 我玩过这个概念this plugin.

SO网友:usama sulaiman

最后,我做到了,我在一周多的时间里试着解决这个问题,然后发送了我的问题,在发送了20分钟的问题后,它终于起作用了:)我需要等待8个小时,因为我是wordpress的新手。stackexchange

因此,正如我在问题评论中提到的,解决问题的思路是:

1-使用wp instead of init 使is\\U页发挥作用。

2-separate the redirect code 从cookie函数

因此,工作代码是:

function site_set_user_language() {
    if(!isset($_COOKIE[\'site_language\'])){
        setcookie(\'site_language\', \'ar\', time()+3600*24*365*3,\'/\',\'.site.com\');
    }elseif(is_page(\'arabic\') || is_page(\'english\')){
        if($_COOKIE[\'site_language\'] == \'en\'){
            setcookie(\'site_language\', \'ar\', time()+3600*24*365*3,\'/\',\'.site.com\');
        }elseif($_COOKIE[\'site_language\'] == \'ar\'){
            setcookie(\'site_language\', \'en\', time()+3600*24*365*3,\'/\',\'.site.com\');
        }   
    }   
}
add_action( \'wp\', \'site_set_user_language\',10,1);
和重定向功能:

function site_lang_home_redirect()
{
    if(is_page(\'arabic\') || is_page(\'english\')){
        wp_redirect( home_url());
        exit();
    }
}
add_action( \'template_redirect\', \'site_lang_home_redirect\',9 );

结束