Je veux définir set si i_page ('arabic') ou is_page ('anglais') puis rediriger vers home_url () uniquement si le nom de la page/slug arabic
ou english
, je pense que l'action init se produit avant que le code ne détermine la page en cours, comment pour faire ça
De plus, après avoir résolu ce problème, comment puis-je être sûr que setcookie se produira avant la redirection afin que le cookie qui vient d'être défini soit affiché (car le cookie doit être actualisé)
Ci-dessous mon code
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
et wp
(comme l'OP l'a noté dans les commentaires) sont un bon moyen de faire cela. Mais il y a un problème de logique dans l'exemple de code. Je pense que cela devrait être comme:
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();
}
Il y a un autre problème, il serait préférable de revenir à la page d'origine en cliquant sur les liens en arabe et en anglais : home_url()
devrait être site_url($last_url)
. Voir ce message , de Konstantin Kovshenin.
Pour cela, à chaque page, le lien pour ces pages doit être http://example.com/LANGUAGE/?original_url=$last_url
. Mais c'est un sujet pour une autre question*
.
*
J'ai joué avec le concept et fait ce plugin .
Finalement, je l'ai fait, j'ai envoyé ma question après plus d'une semaine pour essayer de résoudre ce problème, et cela fonctionne enfin, juste après 20 minutes d'envoi de ma question :) J'ai dû attendre 8 heures parce que j'étais nouveau sur wordpress.stackexchange.
Ainsi, comme je l’ai mentionné dans le commentaire de ma question, les idées de solutions étaient les suivantes:
1- Utilisez wp
au lieu de init
pour que is_page fasse son effet.
2- sépare le code de redirection de la fonction cookie
Le code de travail est donc:
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);
et la fonction de redirection:
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 );