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' );
template_redirect
とwp
(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週間以上後に私の質問を送った、そしてそれは私の質問を送った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 );