WordPress中對(duì)訪客評(píng)論功能的一些優(yōu)化方法
前幾天見到某 Blog (忘記名字和網(wǎng)址了) 有一個(gè)相當(dāng)實(shí)用的評(píng)論功能. 訪客留言之后資料輸入框會(huì)被隱藏起來, 如同登錄了一般. 訪客可以選擇修改相關(guān)資料再進(jìn)行評(píng)論. 給予訪客很好的用戶體驗(yàn). 今天我將這個(gè)功能移植到了自己的主題上, 制作不難, 分享一下吧.

需求
細(xì)心的朋友可能已經(jīng)注意到了: 當(dāng)在某個(gè) WordPress 發(fā)表評(píng)論后再次訪問該 Blog, 資料就不需要再次填寫, 因?yàn)樗鼈兌家呀?jīng)在資料輸入框里面. 但沒評(píng)論過的或者清除了 Cookie 之后, 資料輸入框?qū)⒖湛杖缫?
1. 當(dāng)訪客的資料已經(jīng)存在的情況下, 訪客很少關(guān)注資料本身, 那些資料輸入框就會(huì)變成 "礙眼的東西", 我們要想辦法將它們隱藏起來. 同時(shí), 我們需要將這位訪客的名字顯示出來, 否則他/她根本不知道自己的身份.
2. 訪客有可能郵箱更換了, 或者就想換個(gè)酷點(diǎn)的名字, 此時(shí)的他/她肯定想更改一下那些資料. 所以要求有一些措施, 讓訪客可以重新看到資料輸入框.
3. 對(duì)于那些從未提供資料的訪客, 資料輸入框必須讓他們看到.
分析
由需求可以看到, 我們要處理的是兩種狀態(tài)的訪客: 有資料的, 無資料的.
對(duì)于有資料的, 具有顯示資料輸入框 (顯示昵稱) 和 隱藏資料輸入框 (顯示昵稱) 兩種狀態(tài).
而無資料的訪客只有顯示資料輸入框 (沒有昵稱) 一種狀態(tài).
好, 我們就為有資料的訪客配備兩個(gè)按鈕 (更改和取消), 一個(gè)用來顯示資料輸入框, 一個(gè)用來隱藏它.
思路
1. 頁(yè)面怎么寫? 編碼前, 我們還應(yīng)該理一下頭緒. 用偽代碼吧.
if (有資料的訪客) {
放置訪客昵稱
放置更改按鈕 (點(diǎn)擊后: 隱藏更改按鈕, 顯示取消按鈕, 顯示資料輸入框)
放置取消按鈕 (點(diǎn)擊后: 顯示更改按鈕, 隱藏取消按鈕, 隱藏資料輸入框)
}
放置資料輸入框
if (有資料的訪客) {
隱藏取消按鈕
隱藏資料輸入框
}
2. 怎么獲知訪客是否評(píng)論過? 前面已經(jīng)談到, 已評(píng)論訪客的資料會(huì)在顯示出來, 也就是說, 代碼中已經(jīng)實(shí)現(xiàn)了獲取資料的方法. 那我們找找吧...
<input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" tabindex="1" />
就是它! $comment_author 是訪客的昵稱, 當(dāng)它為空的時(shí)候就說明訪客資料為空.
3. 有些控件又顯示又隱藏的, 怎么弄呢? 我們不需要為此轉(zhuǎn)跳頁(yè)面, 用 JavaScript 吧. 我們可以寫一個(gè)方法, 用來設(shè)定某些控件的顯示與否, 只是一個(gè)很簡(jiǎn)單的方法:
/**
* 設(shè)定控件的顯示風(fēng)格
* @param id 控件的 ID
* @param status 控件的顯示狀態(tài) (顯示時(shí)為 '', 隱藏時(shí)為 'none')
*/
function setStyleDisplay(id, status) {
document.getElementById(id).style.display = status;
}
編碼
接著干嘛? 大概可以寫代碼了. 看我的...
<!-- 有資料的訪客 -->
<?php if ( $comment_author != "" ) : ?>
<!--
轉(zhuǎn)換顯示狀態(tài)用的 JavaScript
Q1: 為什么這段代碼放在這里呢?
A1: 因?yàn)橹挥挟?dāng)訪客有資料時(shí), 它才被用上, 這樣可以減少無資料訪客下載頁(yè)面時(shí)的開銷.
Q2: 為什么不用外部文件將 JavaScript 放起來? 也許那樣維護(hù)起來更方便.
A2: 因?yàn)樗辉谶@個(gè)地方用到了. 而且加載文件的數(shù)量也會(huì)影響頁(yè)面下載速度, 為了這么點(diǎn)字節(jié)的代碼, 不值得新開一個(gè)文件.
-->
<script type="text/javascript">function setStyleDisplay(id, status){document.getElementById(id).style.display = status;}</script>
<div class="form_row small">
<!-- 訪客昵稱 (隨便歡迎一下) -->
<?php printf(__('Welcome back <strong>%s</strong>.'), $comment_author) ?>
<!-- 更改按鈕 (點(diǎn)擊后: 隱藏更改按鈕, 顯示取消按鈕, 顯示資料輸入框) -->
<span id="show_author_info"><a href="javascript:setStyleDisplay('author_info','');setStyleDisplay('show_author_info','none');setStyleDisplay('hide_author_info','');"><?php _e('Change »'); ?></a></span>
<!-- 取消按鈕 (點(diǎn)擊后: 顯示更改按鈕, 隱藏取消按鈕, 隱藏資料輸入框) -->
<span id="hide_author_info"><a href="javascript:setStyleDisplay('author_info','none');setStyleDisplay('show_author_info','');setStyleDisplay('hide_author_info','none');"><?php _e('Close »'); ?></a></span>
</div>
<?php endif; ?>
<!-- 資料輸入框 -->
<div id="author_info">
<div class="form_row">
<input type="text" name="author" id="author" value="<?php echo $comment_author; ?>" tabindex="1" />
<label for="author" class="small"><?php _e('Name'); ?> <?php if ($req) _e('(required)'); ?></label>
</div>
<div class="form_row">
<input type="text" name="email" id="email" value="<?php echo $comment_author_email; ?>" tabindex="2" />
<label for="email" class="small"><?php _e('E-Mail (will not be published)');?> <?php if ($req) _e('(required)'); ?></label>
</div>
<div class="form_row">
<input type="text" name="url" id="url" value="<?php echo $comment_author_url; ?>" tabindex="3" />
<label for="url" class="small"><?php _e('Website'); ?></label>
</div>
</div>
<!-- 有資料的訪客 -->
<?php if ( $comment_author != "" ) : ?>
<!-- 隱藏取消按鈕, 隱藏資料輸入框 -->
<script type="text/javascript">setStyleDisplay('hide_author_info','none');setStyleDisplay('author_info','none');</script>
<?php endif; ?>
訪客評(píng)論顯示歡迎信息

關(guān)鍵問題:獲取訪客信息
花點(diǎn)時(shí)間去研究,其實(shí)整個(gè)實(shí)現(xiàn)過程并不復(fù)雜。這里的關(guān)鍵點(diǎn)是,如何判斷訪客已經(jīng)在近期發(fā)表過評(píng)論。
當(dāng)訪客評(píng)論時(shí),會(huì)在 Cookie 中保存評(píng)論者的信息。我們可以通過 Firebug 或者 Chrome 的 Developer Tool 來查看:
>>> document.cookie "comment_author_bbfa5b726c6b7a9cf3cda9370be3ee91=helloworld; comment_author_email_bbfa5b726c6b7a9cf3cda9370be3ee91=dangoakachan%40gmail.com; comment_author_url_bbfa5b726c6b7a9cf3cda9370be3ee91=http%3A%2F%2Fexample.com"
從上面可以看到有三個(gè)與評(píng)論相關(guān)的信息,它們分別是comment_author,comment_author_url,comment_author_email。不過中間夾雜著字符串 bbfa5b726c6b7a9cf3cda9370be3ee91,我們可以看下 default-constants.php 的代碼,就可以知道這一段叫做 COOKIEHASH,它的值是博客 URL 的 md5值。
>>> import hashlib
>>> hashlib.md5('http://localhost/wordpress').hexdigest()
'bbfa5b726c6b7a9cf3cda9370be3ee91'
我們只需要了解到這一點(diǎn)就可以了,因?yàn)檫@些信息 WordPress 已經(jīng)在comments_template方法中,通過wp_get_current_commenter為我們從 Cookie 中解析了訪客的信息。例如,我們可以在 comment.php 文件中,直接用$comment_author來獲取保存在 Cookie 中的訪客姓名。
代碼實(shí)現(xiàn)
接下來的實(shí)現(xiàn)就很簡(jiǎn)單了,我們通過判斷$comment_author變量值是否為空,來確定訪客是否在近期有評(píng)論(有 Cookie)。
if (!is_user_logged_in() && !empty($comment_author)) {
...
}
如果有,則在評(píng)論框上方顯示歡迎信息:
if (!is_user_logged_in() && !empty($comment_author)) {
$welcome_login = '<p id="welcome-login"><span>歡迎回來, <strong>' . $comment_author . '</strong>.</span>';
$welcome_login .= ' <span id="toggle-author"><u>更改</u> <i class="icon-signout"></i></span></p>';
$comments_args['comment_field'] = '</div>' . $comments_args['comment_field'];
$comments_args['comment_notes_before'] = $welcome_login . '<div id="author-info" class="hide">';
}
以上代碼,需要添加到主題的 comment.php 文件 comment_form($comments_args) 方法調(diào)用之前。
接下來,我們通過 Javascript 來實(shí)現(xiàn)訪客信息更改:
/* Toggle comment user */
$('#comments').on('click', '#toggle-author', function () {
$('#author-info').slideToggle(function () {
if ($(this).is(':hidden')) {
/* Update author name in the welcome messages */
$('#welcome-login strong').html($('#author').val());
/* Update the toggle action name */
$('#toggle-author u').html('更改');
} else {
/* Update the toggle action name */
$('#toggle-author u').html('隱藏');
}
});
});
這樣,如果用戶需要更新信息時(shí),可以點(diǎn)擊歡迎信息右側(cè)的更改按鈕;修改完成之后,用戶信息會(huì)在評(píng)論后更新。
- 使用jQuery實(shí)現(xiàn)WordPress中的Ctrl+Enter和@評(píng)論回復(fù)
- 利用AJAX實(shí)現(xiàn)WordPress中的文章列表及評(píng)論的分頁(yè)功能
- WordPress中利用AJAX異步獲取評(píng)論用戶頭像的方法
- WordPress中限制非管理員用戶在文章后只能評(píng)論一次
- 講解WordPress中用于獲取評(píng)論模板和搜索表單的PHP函數(shù)
- 利用jQuery實(shí)現(xiàn)WordPress中@的ID懸浮顯示評(píng)論內(nèi)容
- 修改PHP腳本使WordPress攔截垃圾評(píng)論的方法示例
- 在WordPress中實(shí)現(xiàn)評(píng)論頭像的自定義默認(rèn)和延遲加載
- WordPress過濾垃圾評(píng)論的幾種主要方法小結(jié)
相關(guān)文章
一個(gè)簡(jiǎn)單的PHP驗(yàn)證碼實(shí)現(xiàn)代碼
為提高網(wǎng)站安全性,登陸采用驗(yàn)證碼是必不可少的。一款簡(jiǎn)單精致的PHP驗(yàn)證碼應(yīng)運(yùn)而生!此驗(yàn)證碼簡(jiǎn)潔美觀,源碼簡(jiǎn)單,可以自定義修改樣式,是一款不錯(cuò)的驗(yàn)證碼。2014-05-05
Redis在Laravel項(xiàng)目中的應(yīng)用實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Redis在Laravel項(xiàng)目中應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用laravel具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
codeigniter使用技巧批量插入數(shù)據(jù)實(shí)例方法分享
CI批量插入數(shù)據(jù),CodeIgniter是一個(gè)小巧但功能強(qiáng)大的 PHP 框架,作為一個(gè)簡(jiǎn)單而“優(yōu)雅”的工具包,它可以為 PHP 程序員建立功能完善的 Web 應(yīng)用程序2013-12-12
thinkPHP數(shù)據(jù)查詢常用方法總結(jié)【select,find,getField,query】
這篇文章主要介紹了thinkPHP數(shù)據(jù)查詢常用方法,結(jié)合實(shí)例形式總結(jié)分析了select,find,getField,query等方法進(jìn)行數(shù)據(jù)庫(kù)查詢操作的具體操作步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03

