web-dev-qa-db-fra.com

Comment configurer cookie si is_page ('page')? devrais-je utiliser add_action ('init') ou y a-t-il une autre action?

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' );
1
usama sulaiman

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 .

1
brasofilo

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 );
0
usama sulaiman