2012-08-03 25 views
6

我正在建立一個網站,雙語言與兩個標誌作爲入口頁面。我打算在標誌周圍使用<form method="post">,以便用戶可以選擇他們想要的語言。WordPress的:使用方法=「帖子」多種語言選擇

然後在下面幾頁我想使用類似:

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

於是就點擊旗幟,他們選擇他們想要的語言。只有在點擊標誌後才能在下一頁上工作,還是可以繼續導航到不同的頁面,並且它仍然會選擇選擇哪種語言?

如果這不起作用,該怎麼辦?


UPDATE:

我不認爲我做之前,我使用WordPress的,這顯然不喜歡$_SESSION清楚。

我有這樣的一個叫做region.php模板提交語言選擇:

<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> 

什麼我需要把每其他模板檢查選擇什麼語言?爲了幫助這個例子,如果選擇了英國,那麼它可以回顯「英國」,如果世界其他地方被選中,那麼它可以顯示「世界」。

這需要在多個頁面上工作,所以如果他們轉到關於頁面,它會檢查語言,然後如果他們導航到聯繫頁面,它會再次檢查語言 - 所有這一切都必須來自最初的語言選擇。

+0

你的代碼會做(如果用戶使他們的選擇後提交表單,如果執行的PHP代碼在你的表單的'action'屬性中定義的頁面上)會回顯你設置了「$ uk」或「$ french」的任何內容。看起來你沒有將這些變量設置爲任何值,所以它不會打印任何內容。 – Matt 2012-08-03 12:51:03

+0

另外,在未來,你應該發佈WP相關的問題到http://wordpress.stackexchange.com/ – 2012-08-16 14:38:47

+0

@FrancisYaconiello我被告知這是一個PHP的問題,有幾個人在那裏矯枉過正! – Rob 2012-08-16 14:59:53

回答

2

答案

首先,對於一個WordPress站點加入區域/多語種支持,沒有比這個插件更好的選擇:http://wpml.org/。它有一個與之相關的成本,但它並不令人望而卻步(你支付了很棒的支持)。

其次,默認情況下不能使用$ _SESSION。 WP是無國界的設計。這就是說有大量的插件和教程在線獲取這個功能。

代碼填充

您的原始格式html沒有輸入。這是一種什麼都沒有提交的表格。此表單有兩個提交名稱相同的提交location。因此,無論點擊哪個按鈕,都會將其值反對$_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> 

寫一個wordpress動作來處理帖子。將此添加到您主題的功能文件中。 查看http://php.net/manual/en/function.setcookie.php for setcookie文檔。

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

然後,任何你想知道的位置:

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

附加信息

我最初點擊英國開始和這個設置cookie,我再回去,並點擊世界,但沒有複製與世界餅乾,它只是再次顯示英國。每次進行不同的選擇時,是否可以擦除cookie?

所以這是關於餅乾在技術層面如何工作的問題:

當瀏覽器這是否[請求網站],它會尋找你的機器上的一個cookie文件[您的網站]已設置。如果它找到一個cookie文件,瀏覽器會將該文件中的所有名稱 - 值對與URL一起發送到[]服務器。如果它找不到cookie文件,它將不發送cookie數據。

新的cookie數據最初沒有發送,直到請求從瀏覽器發送到服務器之後,新的cookie數據才被保存並可用於與請求一起發送。

那麼你如何做這項工作呢? 成功設置cookie事件後重定向。

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'); 

也就是有可能使用的提交按鈕標誌的圖片嗎? 是的,使用CSS來設置輸入按鈕的樣式。

添加ID給每個輸入:id="uk-button"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; 
} 
+0

我剛剛給出了這一點,除了一件事情之外它工作得很好 - 我最初單擊英國開始,並設置cookie,然後我回去並點擊世界,但沒有複製cookie的世界,它再次向英國顯示。每次進行不同的選擇時,是否可以擦除cookie? – Rob 2012-08-17 13:55:43

+0

也有可能使用標誌的圖像作爲提交按鈕? – Rob 2012-08-17 14:04:51

+1

更新了我的答案,讓您的所有新問題都得到解答 – 2012-08-17 17:13:54

15

我會將選擇放入$_SESSION變量。那將留在他們身邊,直到他們離開。你也可以很好地使用cookie。實際上,這兩者的結合將會非常好,它將不允許Cookie訪問的用戶連接到訪問基礎上,並且擁有Cookie功能的人員只需選擇一次。

編輯:

<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. 

頁的形式重定向到:如果您在使用WordPress你應該

<?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; 
    } 

?> 

的工作代碼示例read this

+0

一些代碼示例有可能嗎? – Rob 2012-08-06 10:20:41

+1

@Rob發表你的隊友的例子。 – Fluffeh 2012-08-06 10:57:12

+0

謝謝你的例子。我已經更新了一下我的問題,我認爲它還沒有達到我的目的(因此額外幫助的賞金!!)。 – Rob 2012-08-06 12:48:17

0

它不適用於其他頁面。 POST變量不會一直髮送。它只在提交表單時發送。你可以使用COOKIES來完成你的任務。保存變量並在每個頁面上檢查它。

1

$ _POST變量包含僅包含在單個請求中的數據(請參閱POST (HTTP)),以便他們在「點擊」或張貼某些表單後看到適當的內容,因此僅在請求到您的頁面之後。

爲了更持久地存儲用戶設置,必須將這些設置保存到$ _SESSION變量中提供的「會話」數據中,並且這些數據是永久性的,因此在您的訪問者瀏覽您的頁面之前將一直存在。更永久但略微不純的解決方案是將設置保存到Cookie,在這種情況下,您可以定義到期時間,以便在下次訪問時也可以使用它們。

看到一些例子:

<?php 

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

...和其他地方:

<?php 

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

或者你也可以使用Cookie:

<?php 

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

...和其他地方:

$language = $_COOKIE['language']; 
2

如果你不想使用cookies,你可以這樣做。

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

然後當你有2個按鈕,其中一個是英語,另一個是德語或任何你想要的。

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

你可以用這個檢查來改變頁面應該是什麼語言。

if(isset($_GET['language'])){ 
    if($_GET['language'] == 'English'){ 
     $_SESSION['language'] = 'English'; 
    } 
    if($_GET['language'] == 'German'){ 
     $_SESSION['language'] = 'German'; 
    } 
} 
+0

在最後一個代碼框中,它表示'$ _SESSION ['language'] ='英語';'我是否用真實的英文內容替換它? – Rob 2012-08-03 13:49:09

+1

@Rob否,您使用會話變量來確定您的代碼的作用。例如,如果會話包含「en」,則您的代碼以英文顯示網站,而如果變量具有「es」,則以西班牙文顯示網站。 – Fluffeh 2012-08-03 13:56:50

+0

@Fluffeh我不認爲我的理解正確。所以第一個代碼框應該像標題頁一樣?第二種顯然是選擇,第三種是檢查選擇什麼語言? – Rob 2012-08-03 14:12:20

0

你真的需要會話/餅乾,如果你想選擇堅持(或保持傳遞值通過GET?lang=uk,但不是很優雅)。順便說一下,在超鏈接中不需要默認行爲被阻止,並且其父窗體使用JavaScript提交的圖像。你可以簡單地使用這樣的東西:

<input alt="en-UK" name="lang" src="uk-flag.png" type="image" value="en-UK"> 

這將作爲一個圖像,也是一個表單提交按鈕。

+0

謝謝。我現在真的很困難,你似乎對這一切都有很好的瞭解,是否可以展示更多有關會話步驟的代碼? – Rob 2012-08-16 08:17:27

+0

對不起,直到現在我才注意到這個評論。儘管如此,其他人似乎也提供了一些非常好的指標。你是好還是有什麼具體的,我可以幫你? – ACJ 2012-08-17 23:26:40