web-dev-qa-db-ja.com

Is_page( 'page')の場合にcookieを設定する方法add_action( 'init')を使うべきですか、それとも別のアクションがありますか?

Is_page( 'arabic')またはis_page( 'english')の場合はsetcookieにして、home_url()にリダイレクトする場合にのみ、ページ名/スラッグarabicまたはenglishを指定します。それをする

また、その問題を修正した後、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' );
1
usama sulaiman

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)であるべきです。 Konstantin Kovsheninによる この記事 を参照してください。

このために、各ページで、それらのページへのリンクはhttp://example.com/LANGUAGE/?original_url=$last_urlであるべきです。しかし、それは別の質問のトピックです*

*私はこのコンセプトを使って this plugin をしました。

1
brasofilo

最後にそれをやった、私はその問題を解決しようとしている1週間以上後に私の質問を送った、そしてそれは私の質問を送った20分後にようやくうまくいく。

それで私が私の質問のコメントで述べたように、解決のアイデアは以下の通りでした:

1- is_pageを有効にするためにwpの代わりにinitを使います.

2- リダイレクトコードを分離する 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 );
0
usama sulaiman