Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wordpress: Use method="post" for multiple language selection

I'm building a website that has dual languages with two flags as an entry page. I'm planning on using <form method="post"> around the flags so the user can select the language they want.

Then on the following pages I want to use something like:

<?php
if( $_POST['language']=='uk' ){
    echo $uk;
}elseif( $_POST['language']=='french' ){
    echo $french;}
?>

So on clicking the flag, they have selected the language they want. Will that only work on the next page after they have clicked the flag or can they carry on navigating to different pages and it still pick up what language was selected?

If that doesn't work, how else can it be done?


UPDATE:

I don't think I made it clear before that I'm using Wordpress, which apparently doesn't like $_SESSION.

I have this on a template called region.php to submit the language selection:

    <form action="<?php the_permalink(); ?>/home" name="region" method="post">              
        <div id="uk">
            <a href="javascript:document.region.submit()" name="UK">
                <img style="margin-bottom:10px;" src="<?php bloginfo('stylesheet_directory'); ?>/images/-uk.png" width="259" height="160" alt="UK" />
            </a>
            <h1 style="color:black!IMPORTANT;">Enter United Kingdom site</h1>
        </div>

        <div id="world">
            <a href="javascript:document.region.submit()" name="World">
                <img style="margin-bottom:10px;" src="<?php bloginfo('stylesheet_directory'); ?>/images/
world.png" width="258" height="160" alt="
Rest of the World" />
            </a>
            <h1 style="color:black!IMPORTANT;">Enter Rest of the World site</h1>                    
            </div>  
    </form>

What do I need to put on every other template to check what language was selected? To help with the example if UK has been selected then it can just echo "UK", if the rest of the world was selected then it can just show "World".

This needs to work across several pages so if they goto the about page it checks the language, then if they navigate to the contact page it checks the language again - all that has to come from the initial language selection.

like image 271
Rob Avatar asked Aug 03 '12 12:08

Rob


4 Answers

I would drop the selection into a $_SESSION variable. That will stay with them until they leave. You could also use a cookie quite nicely. Actually a combination of the two would be great, it ties up users who don't allow cookies to run on a visit to visit basis, and folks who have cookies enables will only have to pick once.

Edit: Example of working code:

<form action="<?php the_permalink(); ?>/home" name="region" method="post">              
    <div id="uk">
    <a href="javascript:document.region.submit()" name="UK">
        <img style="margin-bottom:10px;" src="<?php bloginfo('stylesheet_directory'); ?>/images/=uk.png" width="259" height="160" alt="UK" />
    </a>
    <h1 style="color:black!IMPORTANT;">Enter United Kingdom site</h1>
    </div>

    <div id="world">
    <a href="javascript:document.region.submit()" name="World">
        <img style="margin-bottom:10px;" src="<?php bloginfo('stylesheet_directory'); ?>/images/world.png" width="258" height="160" alt="Rest of the World" />
    </a>
    <h1 style="color:black!IMPORTANT;">Enter Rest of the World site</h1>                    
    </div>  
</form>
// I assume that this form sends a POST request to the following page URL.

page that the form redirects to:

<?php

    session_start();
    if(isset($_POST['country'])) 
    // assuming that your form returns a field called 'country'...
    {
        $_SESSION['myCountry'] = htmlspecialchars($_POST['country']);
        // Assumes that myCountry is now 'UK' or 'World'...
    }
    header('Location: http://www.example.com/yourIndexPage.php');
    // You want to use a quick snippet to process the form and 
    // then redirect them away. This makes for less stupid BACK actions
    // in the browser as well as data being resent to the code.
?>

yourIndexpage.php

<?php

    // As the $_SESSION is now set, we can use it in the page as follows:
    session_start();
    switch($_SESSION['myCountry'])
    {
        case 'UK':
            echo $UK;
            // And anything else you want to do with the UK language.
            break;
        case 'World':
            echo $world;
            // etc etc etc...
            break;
        default:
            // echo out default stuff, probably 'World' at a guess.
            break;
    }

?>

If you are using wordpress you should probably read this.

like image 177
Fluffeh Avatar answered Nov 09 '22 23:11

Fluffeh


Answers

Firstly, for adding regional / multilingual support to a wordpress site there is no better alternative than this plugin: http://wpml.org/. It has a cost associated with it, but its not prohibitive (you pay for awesome support).

Secondly, You cannot use $_SESSION by default. WP is stateless by design. That said there are tons of plugins and tutorials online for getting this functionality.

Code stuff

Your original form html had no inputs. It was a form that submitted nothing. This form has two submits named the same thing location. So whichever button is clicked will submit its value against the $_POST['location'].

<form action="<?php the_permalink(); ?>/home" name="region" method="post">              
    <div id="uk">
        <input type="submit" name="location" value="UK" />
        <img style="margin-bottom:10px;" src="<?php bloginfo('stylesheet_directory'); ?>/images/uk.png" width="259" height="160" alt="UK" />
        <h1 style="color:black!IMPORTANT;">Enter United Kingdom site</h1>
    </div>

    <div id="world">
        <input type="submit" name="location" value="World" />
        <img style="margin-bottom:10px;" src="<?php bloginfo('stylesheet_directory'); ?>/images/world.png" width="258" height="160" alt="Rest of the World" />
        <h1 style="color:black!IMPORTANT;">Enter Rest of the World site</h1>                    
    </div>  
</form>

Write a wordpress action to handle the post. Add this to your theme's functions file. look at http://php.net/manual/en/function.setcookie.php for setcookie docs.

function set_location_cookie()
{
    if(isset($_POST['location']))
    {
        setcookie('location', $_POST['location'], time()+1209600);
    }
}
add_action('init', 'set_location_cookie');

Then, anywhere you want to know the location:

<?php echo $_COOKIE["location"]; ?>

ADDITIONAL INFO

I initially clicked UK to start with and this set the cookie, I then went back and clicked World but that didn't copy over the cookie with world, it just showed UK again. Is it possible to wipe over the cookie each time a different selection is made?

So this is an issue regarding how cookies work at a technical level:

When the browser does this [requests a site], it will look on your machine for a cookie file that [your site] has set. If it finds a cookie file, your browser will send all of the name-value pairs in the file to [the] server along with the URL. If it finds no cookie file, it will send no cookie data.

The new cookie data is not initially sent, b/c it inst until after the request has been sent from your browser to the server that the new cookie data is saved and available for sending with the request.

How do you make this work then? redirect after a successful set cookie event.

function set_location_cookie()
{
    if(isset($_POST['location']))
    {
        // Set Cookie
        setcookie('location', $_POST['location'], time()+1209600);
        // Reload the current page so that the cookie is sent with the request
        header('Location: '.$_SERVER['REQUEST_URI']);
    }
}
add_action('init', 'set_location_cookie');

Also is it possible to use the images of the flags as the submit buttons? Yes, use CSS to style your input buttons.

Add an id to each input: id="uk-button" and id="world-button"

CSS:

#uk-button {
    background-image: url(uk-flag.png);
    background-size: 100%;
    background-repeat:no-repeat;
}
#world-button {
    background-image: url(world-flag.png);
    background-size: 100%;
    background-repeat:no-repeat;
}
like image 39
Francis Yaconiello Avatar answered Nov 09 '22 22:11

Francis Yaconiello


If you don't want to use cookies you could do it this way.

session_start();    
if(!isset($_SESSION['language'])){
    $_SESSION['language'] = 'English'; //default language
}

then when you have 2 buttons, where one is English and the other is German or whatever you desire.

<a href="?language=English">English</a>
<a href="?language=German">German</a>

you could use this check to varify what language the page should be.

if(isset($_GET['language'])){
    if($_GET['language'] == 'English'){
        $_SESSION['language'] = 'English';
    }
    if($_GET['language'] == 'German'){
        $_SESSION['language'] = 'German';
    }
} 
like image 45
gildra Avatar answered Nov 09 '22 22:11

gildra


The $_POST variable contains data contained in single request only (see POST (HTTP)) so they will see appropriate content after "click" or post some form, so after request to your page only.

For more permanent storage of the user settings it's necessary to save these settings to the "sessions" data which are available in $_SESSION variable and are persistent, so will be available until your visitors will browse your pages. More permanent but slightly less pure solution is saving settings to the cookies for which case you can define expiration so they will be used also while next visit.

See some example:

<?php

session_start();
$language = $_POST['language'];
$_SESSION['language'] = $language;

...and elsewhere:

<?php

session_start();
$language = $_SESSION['language'];

Or you can use cookies:

<?php

session_start();
$language = $_POST['language'];
set_cookie('language', $language, 365 * 24 * 60 * 60);   
// will live for one year

...and elsewhere:

$language = $_COOKIE['language'];
like image 33
Martin Poljak Avatar answered Nov 09 '22 23:11

Martin Poljak