升級版!Cookies 記錄你的 WordPress 側邊欄關閉/顯示的狀態

升級版!Cookies 記錄你的 WordPress 側邊欄關閉/顯示的狀態
之前寫過的《關閉/顯示你的 WordPress 側邊欄,享受閱讀快感》,當時並沒有考慮到 Cookies 記錄狀態欄被改變後的狀態問題,實在是我的不專業。總不能讓用戶不厭其煩的點擊關閉/顯示側邊欄吧。體驗很不好!所以抽空對其進行了修改,讓其可以根據 Cookies 來記錄你的 WordPress 側邊欄的狀態是關閉的還是顯示的。

在本篇教程的開始之前,先感謝下 PhilNa 兄的幫助,讓我解決了 Cookies 保存路徑的問題,這樣的話不管在哪個內頁設置側邊欄的狀態,Cookies 都將保存到根路徑 “/”。

因為之前寫過很詳細的關閉/顯示 你的 WordPress 側邊欄的教程了,所以請搭配前文觀看。

如果你對之前的那篇文章沒有理解上的困難的話,那麼就開始我們的升級版之旅吧!

1.js的更新,使用這段js代碼:

<script type="text/javascript" language="javascript">
$(document).ready(function(){
//SetCookies 
(function(){
function SetCookie(c_name,value,expiredays){
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+"="+escape(value)+((expiredays==null)?"":";expires="+exdate.toGMTString())+";path=/"; 
//如果你希望每個頁面都有個獨立的 Cookies 設置的話請去掉+";path=/",這樣的話leeiio.me/xxx/ 和leeiio.me/yyy/ 的側邊欄狀態都將是獨立的           
}
window['RootCookies'] = {};
window['RootCookies']['SetCookie'] = SetCookie;
//JavaScript 的命名空間,假使你已有一個 SetCookie 的函數的話將不會與之衝突,通過 RootCookie.SetCookie() 調用
})();
//Toggle Sidebar
$('.close-sidebar').click(function() { 
   RootCookies.SetCookie('show_sidebar', 'no', 1);      //設置一個名為show_sidebar的cookie,值為no,保存天數為1
   $('.close-sidebar').hide();                           //隱藏"關閉側邊欄"按鈕
   $('.show-sidebar').show();                          //顯示"顯示側邊欄"按鈕
   $('.sidebar').fadeOut(1000);
   $('#content').animate({width: "910px"}, 1000); });
$('.show-sidebar').click(function() {  
   RootCookies.SetCookie('show_sidebar', 'no', -1);       
   //設置一個名為show_sidebar的cookie,值為no,保存天數為-1,也就是說讓cookies失效,也就是刪除這個cookie
   $('.show-sidebar').hide();                             //隱藏"顯示側邊欄"按鈕
   $('.close-sidebar').show();                            //顯示"關閉側邊欄"按鈕
   $('#content').animate({width: "690px"}, 1000);
   $('.sidebar').animate({opacity: 1.0}, 500).fadeIn('slow');}); 
});
</script>

2.插入控制按鈕

<?php if(!$_COOKIE['show_sidebar']=='no'):?>      //當Cookie為show_sidebar的值為0的時候
<li class="close-sidebar" title="關閉側邊欄">關閉側邊欄</li>
<li class="show-sidebar" style="display:none;" title="顯示側邊欄">顯示側邊欄</li>
<?php else: ?>                                                      
<li class="close-sidebar" style="display:none;" title="關閉側邊欄">關閉側邊欄</li>
<li class="show-sidebar" title="顯示側邊欄">顯示側邊欄</li>
<?php endif;?>

將這段代碼插入你模板中需要顯示功能按鈕的地方即可!

3.設置css,當側邊欄不顯示的時候,讓正文區域寬度增大,側邊欄不顯示

<?php if($_COOKIE['show_sidebar']=='no'):?>   
//當Cookie為show_sidebar的值為no的時候,載入一下的兩個css
<style type="text/css">
#content {width:910px;}                             
//讓主題部分的寬度為910px,請參照自己的blog進行調整
.sidebar {display:none;}                               
//讓側邊欄不顯示
</style>
<?php endif;?>

將以上這段代碼插入index.php以及single.php以及page.php頁面,如果你還有別的頁面的話,同理插入這段代碼!

如果你不想讓自己的模板文件插入這些css的話,第3步還可以這樣寫。將第1步的js修改為如下

<script type="text/javascript" language="javascript">
$(document).ready(function(){
//SetCookies 
(function(){
function SetCookie(c_name,value,expiredays){
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+"="+escape(value)+((expiredays==null)?"":";expires="+exdate.toGMTString())+";path=/"; 
//如果你希望每個頁面都有個獨立的 Cookies 設置的話請去掉+";path=/",這樣的話leeiio.me/xxx/ 和leeiio.me/yyy/ 的側邊欄狀態都將是獨立的           
}
window['RootCookies'] = {};
window['RootCookies']['SetCookie'] = SetCookie;
//JavaScript 的命名空間,假使你已有一個 SetCookie 的函數的話將不會與之衝突,通過 RootCookie.SetCookie() 調用
})();
//Toggle Sidebar
$('.close-sidebar').click(function() { 
   RootCookies.SetCookie('show_sidebar', 'no', 1);      //設置一個名為show_sidebar的cookie,值為no,保存天數為1
   $('.close-sidebar').hide();                           //隱藏"關閉側邊欄"按鈕
   $('.show-sidebar').show();                          //顯示"顯示側邊欄"按鈕
   $('.sidebar').fadeOut(1000);
   $('#content').animate({width: "910px"}, 1000); });
$('.show-sidebar').click(function() {  
   RootCookies.SetCookie('show_sidebar', 'no', -1);       
   //設置一個名為show_sidebar的cookie,值為no,保存天數為-1,也就是說讓cookies失效,也就是刪除這個cookie
   $('.show-sidebar').hide();                             //隱藏"顯示側邊欄"按鈕
   $('.close-sidebar').show();                            //顯示"關閉側邊欄"按鈕
   $('#content').animate({width: "690px"}, 1000);
   $('.sidebar').animate({opacity: 1.0}, 500).fadeIn('slow');}); 
//與第1步不同的地方開始,以下是區別與第一步js的新增代碼
//Get cookies Value  獲取cookies的值
var cookies = document.cookie.split("; ");
function GetCookieValue(cookieName) {
    var ret = null;
    for (var i = 0; i < cookies.length; i++) {
        var leeiiocookies = cookies[i].split("=");
        if (cookieName == leeiiocookies[0]) {
            ret = unescape(decodeURI(leeiiocookies[1]))
        }
    }
    return ret
}
//判斷cookies的值
if ('no' == GetCookieValue('show_sidebar')){
    $('#content').css({'width':'910px'});   
    //讓正文區域的寬度設置為910px,也就是隱藏sidebar之後的可使寬度,你也可以修改為關閉側邊欄時候的動態效果
    $('.sidebar').hide();
    //讓側邊欄隱藏
});
</script>

不過我還是推薦將 css 寫入模板文件,因為這樣通過 php 判斷的話,用戶看到的直接就是側邊欄已經消失了且正文寬度增大後的效果,通過 js 的話在 js 未載入完全之前頁面還是先前的樣子,然後側邊欄才會消失,正文也會變寬。

大功告成!代碼裡面加了很詳細的注釋了,沒加註釋的在前篇也都已經注釋並解釋過,怎麼樣,很 easy 吧!如果你耐心地看完了本文的話,確實是很 easy 的!jQuery 真簡便啊真簡便!

謝謝觀賞!

43 Responses to 升級版!Cookies 記錄你的 WordPress 側邊欄關閉/顯示的狀態

  1. Sivan says:

    這次沙發該是我的了吧~ 😛

  2. Leeiio says:

    @Sivan 沒錯,feedsky的rss都還沒刷新呢呵呵~

  3. Sivan says:

    簡單試了一下,沒成功,側欄也沒消失。 😥
    時間緊迫,明天我再仔細研究吧。

  4. Jinwen says:

    嗯,支持不斷完善。

  5. Jinwen says:

    再說那個代碼高亮的插件讓頁面的w3c標準下很多問題呢。

  6. Leeiio says:

    @Jinwen
    那你的代碼是如何處理的?你博客上的代碼似乎都是正常顯示而沒有被解析!

  7. Zoll says:

    恩 不錯啦~
    前幾天逛論壇,發現 Discuz! 也有這樣的功能 呵呵~

  8. 吖Bee says:

    來插小紅花~~暫時不折騰~呵呵!

  9. 吖Bee says:

    跟PhilNa一樣,也有一串的錯誤代碼….

  10. Sivan says:

    知道哪裡的問題了。
    window[‘RootCookies’] = {};
    window[‘RootCookies’][‘SetCookie’] = SetCookie;
    這裡改成
    window[‘PHC’] = {};
    window[‘PHC’][‘SetCookie’] = SetCookie;
    或者把PHC.SetCookie(‘show_sidebar’, ‘no’, 1); 改成
    RootCookies.SetCookie(‘show_sidebar’, ‘no’, 1);
    都可以正常運作,但是打開別的頁面後,導航顯示的開關鈕正確,但是側欄沒有隱藏。

  11. Sivan says:

    對了,還有我的頁面http://demo.sivan.in/把那個”easeOutBounce”刪除了才有效果,不知道是不是跟我改變兩個類的長度有關。默認的代碼只能隱藏邊欄,正文區域不能變寬。

    現在只有按鈕那裡正常了,是不是sidebar那裡也要加一個
    <?php if(!$_COOKIE[‘show_sidebar’]==’no’):?>
    這樣的判定呢?

  12. Leeiio says:

    @Zoll
    恩,關閉側邊欄的功能還是滿常見的。
    @吖Bee
    錯誤代碼是新評論發送簡訊提醒所致,暫時先停掉那個功能了~
    @Sivan RootCookies只是一個命名空間,我下面忘記改了,現在修改了模板的部分了,應該可以正常了。你最好先清除下你的cookies再進行測試,應該是沒有問題了的。

  13. Leeiio says:

    @Sivan
    我的疏忽,easeOutBounce是我的插件,原文又修改了。sidebar那裡不用加判斷不然的話側邊欄就不能調用了。

  14. Leeiio says:

    @Sivan
    繼續疏忽,發現自己漏寫了一段代碼…昨天我肯定腦袋被門板夾過了,更新中。

  15. Leeiio says:

    @Sivan
    我昏頭了確實,還真對不起讀者啊,半成品都發出來了,好在我的站目前關注度還不高哈~

  16. Jinwen says:

    @Leeiio
    因為我根本沒有用代碼高亮的插件,呵呵。現在每次更改主題我都得看w3c上是否通過的,那些東西很麻煩,還不如不加。

  17. eddie says:

    😀 謝謝leeiio的辛勤勞動啊 等我學到Cookies部分就來好好研究研究

  18. eddie says:

    @Jinwen
    http://thisblog.usejquery.com/2009/03/11/highlight-your-source-code-with-jquery-and-chili
    這篇文章是教人利用jQuery與Chili來高亮代碼的 貌似可以通過W3C驗證的,有心情可以研究研究

  19. welee says:

    越來越專業了,絕對收藏!!

  20. sytao says:

    twitter看到好幾條了.一直在更新??我的那個theme不知道能用不能用,有時間我也研究研究…

  21. xxx says:

    試試啊 😀 😀

  22. kerby says:

    問一下第三部的css插入到那些頁面的具體什麼位置呀??還是說頁面的什麼位置都可以嗎??

  23. Leeiio says:

    @kerby
    頁面的最頂上即可~

  24. Pingback: RSSA頻道 » Blog Archive » 美化 Wordpress 標題,個性字體生成圖片標題插件推薦!

  25. 程曉濤 says:

    我現在想要的效果是,主頁顯示側邊欄,內容頁去除側邊欄,並且內容頁變大,我覺得比你現在的效果簡單多了,但是我不知道怎麼解決,謝謝!

  26. Leeiio says:

    @程曉濤
    wordpress後台編輯主題那裡不是分開了首頁index.php和單獨也single.php么,兩個頁面分開定義格式就可以了~

  27. QiQiBoY says:

    最近我也在用cookie結合js做一些東西。。

  28. Pingback: JQuery(側邊欄(開/關)測試…完美 | MOPVHS's Blog

  29. says:

    試了很多次,關閉側邊欄刷新後還是會出現

  30. 龍飛揚 says:

    現在的代碼算完整了嗎?我怎麼用了沒有效果呢?

  31. 小白 says:

    我是新手我用了點了也沒效果,代碼頁看不太懂。麻煩能不能整合成文件,直接用函數來調用。謝謝!其實我是想要一個滑動隱藏的側邊欄效果。呵呵。這個對我來說就更是天方夜譚了。。。。就類似一些滑動的分享按鈕那樣的。望能收到你的答覆。

  32. 愛惜 says:

    按照這樣弄的。還是沒有效果。

  33. 愛惜 says:

    不知道那裡出錯了。請教了。

  34. 金蟬子 says:

    😥 咋就看不懂呢.. 不知道放到什麼地方 js 要新建文件嗎 ?

  35. Pingback: 開關邊欄和cookies那些事 | Ben is Me

Leave a Reply

Your email address will not be published. Required fields are marked *