近來有人在評論中添加了一些網(wǎng)址,可惡的是,WordPress默認(rèn)會為這些評論中的網(wǎng)址自動添加鏈接,那么如何防止WordPress評論里的網(wǎng)址自動轉(zhuǎn)換為可點擊的鏈接呢?
解決方案
編輯你的WordPress主題的functions.php文件,在其中添加如下代碼:
remove_filter( 'comment_text', 'make_clickable', 9 );
添加以上代碼后,不但可以防止新發(fā)表的評論中的網(wǎng)址自動添加鏈接,而且可以去除之前的已經(jīng)發(fā)布的評論中的網(wǎng)址鏈接。
非常簡單對嗎?但只是知道這個似乎意義不大,學(xué)習(xí)講究舉一反三,知道這樣做的理由似乎更重要。
為什么鏈接被自動轉(zhuǎn)換
禁用的方法很簡單,但我喜歡弄清來龍去脈。先說一下為什么鏈接會被自動轉(zhuǎn)換。
WordPress加載過程中會include一個叫做default-filters.php的文件,位于wp-includes/目錄下,該文件包含WordPress默認(rèn)添加的actions和filters,看一下這個文件,滿眼的add_action或者add_filter。
在評論表單中,用 comment_text() 函數(shù)輸出用戶的評論,comment_text()函數(shù)提供了一個filter叫做comment_text,在comment_text()函數(shù)返回評論結(jié)果前過濾結(jié)果。WordPress默認(rèn)向這個filter添加了哪些函數(shù)?打開default-filters.php看一下,發(fā)現(xiàn)添加了如下功能:
//將Wordpress更正為WordPress
add_filter( 'comment_text', 'capital_P_dangit', 31 );
//格式化特殊符號
add_filter( 'comment_text', 'wptexturize' );
//轉(zhuǎn)換符號,例如將<br>變成<br />
add_filter( 'comment_text', 'convert_chars' );
//將url自動變成可點擊的鏈接,我們要找的東西
add_filter( 'comment_text', 'make_clickable', 9 );
//如其名字所說,將不完整的標(biāo)簽補全
add_filter( 'comment_text', 'force_balance_tags', 25 );
//將符號轉(zhuǎn)換為表情
add_filter( 'comment_text', 'convert_smilies', 20 );
//自動添加<p>和<br />標(biāo)簽
add_filter( 'comment_text', 'wpautop', 30 );
WordPress將評論存入數(shù)據(jù)庫時,是原封不動的存入的,例如用戶輸入
<blockquote>引用 <strong>小明的話
數(shù)據(jù)庫存入的內(nèi)容和上面相同,標(biāo)簽結(jié)構(gòu)是不完整的,當(dāng)程序調(diào)用comment_text()函數(shù)輸出評論內(nèi)容時,數(shù)據(jù)需要被上面提到的7個函數(shù)過濾一遍,當(dāng)被force_balance_tags()處理時,就會將標(biāo)簽補全,于是輸出的結(jié)果是
<blockquote>引用 <strong>小明的話</strong></blockquote>
既然WordPress用add_filter添加了make_clickable功能,我們只需要用于其相反的remove_filter移除這個功能就可以了,于是就有了開頭的解決方案。
remove_filter中的9代表什么?
添加filter時,9代表優(yōu)先級,規(guī)定了所有添加到某個hook的函數(shù)的執(zhí)行順序,移除的時候也一樣。想象一下add_filter會讓一個函數(shù)進(jìn)入隊列排隊,數(shù)字越大的排的越靠后,即執(zhí)行越晚。當(dāng)我們需要移除某個函數(shù)時,必須保證移除功能在添加功能之后執(zhí)行,在該函數(shù)還沒有添加的時候移除它,沒有任何意義。
make_clickable函數(shù)位于wp-includes/formatting.php中,不僅將鏈接變成可點擊的,而且會自動添加rel=”nofollow”屬性,如果你希望跟隨某些鏈接,可以先移除默認(rèn)的功能,然后寫一個自己的功能加進(jìn)去。
舉一反三
這種remove_filter和add_filter的把戲可以用到很多地方,比如很多插件會用wp_enqueue_script和wp_enqueue_style添加自己的腳本和樣式表,如果插件把腳本放到head中,可能會拖慢網(wǎng)頁加載速度;有的插件自帶的樣式表只有幾句話,單獨存放成一個文件完全沒必要,這些行為都會讓你的head標(biāo)簽內(nèi)容變長,對SEO也是有害的。你想制止這種行為,怎么辦?
用上面提到的先remove再add的思想,只不過這次我們調(diào)用的是另外兩對函數(shù):
- wp_dequeue_style
- wp_enqueue_style
- wp_dequeue_script
- wp_enqueue_script
例如,想將WP-PageNavi插件的樣式表移除,將樣式合并到主題的style.css中,可以在functions.php中如是說
add_action('wp_print_styles', 'dequeue_stylesheets');
function dequeue_stylesheets() {
wp_dequeue_style('wp-pagenavi');
}
這樣WP-PageNavi的樣式表link就從head中消失了。
再舉個移動腳本的例子,wp-codebox插件默認(rèn)將腳本codebox.js放在head中,我希望將其挪到</body>標(biāo)簽之前,在主題的functions.php中寫如下代碼
add_action('wp_print_scripts', 'move_codebox_script');
function move_codebox_script() {
wp_dequeue_script('codebox');
wp_enqueue_script('codebox', get_bloginfo ( 'wpurl' )
. '/wp-content/plugins/wp-codebox/js/codebox.js',
array('jquery'), '0.1',1,true);
}
同樣,先注銷這個腳本, 再引入。注意wp_enqueue_scriopt函數(shù)最后一個參數(shù)設(shè)置為true,即表示在footer引入腳本。
通過這種方法,可以達(dá)到優(yōu)化網(wǎng)站結(jié)構(gòu)的目的,最佳模式是:
- 樣式表在head中引入
- 腳本在</body>標(biāo)簽前引入
- 引入的樣式表和腳本越少越好,這樣可以減少http請求次數(shù),方法是將所有腳本合并,所有樣式表合并,當(dāng)然這樣會令使用便利性打折扣,平衡在哪里要根據(jù)自己的具體情況來。
- 異步請求的追蹤腳本,例如google分析腳本,推薦加載head中。
結(jié)語
從禁止評論自動轉(zhuǎn)換URL為可點擊的鏈接找到了根源,了解了如何知曉WordPress默認(rèn)添加了哪些filter函數(shù)(翻閱default-filters.php),知道WordPress有哪些格式化函數(shù)(查看formatting.php)。
通過舉一反三,聯(lián)想到一種WordPress中優(yōu)化網(wǎng)站HTML結(jié)構(gòu)、提升網(wǎng)頁加載速度的方法,這就是了解來龍去脈的好處。
參考自:http://www.solagirl.net/how-to-disable-comment-make-clickable-function.html






謝謝分享
能設(shè)置某一頁面不啟用嗎?
我博客的評論直接把所有HTML標(biāo)簽過濾了
很強大,漲姿勢了
有用,感謝分享。收藏備轉(zhuǎn)。
這個功能不錯。挺實用的。
多說的話,可以直接設(shè)置不解析評論網(wǎng)址
謝謝倡萌對文章的補充,本來我的原文只有文章開頭的“解決方案”那么一小豆腐塊,呵呵。
本來我也是只知其然,而不知其所以然,當(dāng)時還納悶為何代碼中會有一個 9 。現(xiàn)在明白了為什么,而且了解了更多。
我想,這就是倡萌創(chuàng)辦的WordPress大學(xué)的一個治學(xué)精神吧——讓你學(xué)得更多,讓你理解得更透徹更明白!
用多說的飄過
后面引申的部分很有用