WordPress分頁偽靜態(tài)加html后綴
問題
當文章有分頁的時候,WordPress生成的永久鏈接是page.html/2的形式,前面一段是文章的$link,后面的數字代表分頁$number。那么問題來了,挖掘……不對,從邏輯上講這到底是個html文件還是一個目錄呢?
難看
在.html這個靜態(tài)文件后面加上一個/和數字簡直令人摸不著頭腦,這還只是其次,重要的是,我發(fā)現(xiàn)搜索引擎根本不收錄這樣奇怪的鏈接,這個真是無法接受,我寫的東西首尾都很重要,不能因為分個頁就被忽視了。
不收錄
拿這篇文章來看,搜索文章第一頁的內容,谷歌收錄了:

搜索文章第二頁和第三頁的內容,根本沒有收錄:

解決方案
于是我決定DIY WordPress的鏈接生成與解析規(guī)則。
思路
利用filter wp_link_pages_link 將分頁鏈接/123456重寫為page-[123456].html。
利用WordPress或者服務器的RewriteRule將page-[123456].html還原為/123456
添加鉤子redirect_canonical,防止WordPress從page-[123456].html到/123456的強行跳轉。
生成分頁html后綴鏈接
給WordPress主題加入:
class Rewrite_Inner_Page_Links
{
var $separator;
var $post_rule;
function __construct()
{
$this->separator = '/page-';
// (.+?)/([^/]+).html(/[0-9]+)?/?
$this->post_rule = '(.+?)/([^/]+)(' . $this->separator . '([0-9]+))+.html/?$';
if (!is_admin() || defined('DOING_AJAX')) :
add_filter('wp_link_pages_link', array($this, 'inner_page_link_format'), 10, 2); // for inner pages
add_filter('redirect_canonical', array($this, 'cancel_redirect_for_paged_posts'), 10, 2);
endif;
if (is_admin()) :
add_filter('rewrite_rules_array', array($this, 'pagelink_rewrite_rules'));
endif;
}
/**
* 修改post分頁鏈接的格式
* @param string $link
* @param int $number
* @return string
*/
function inner_page_link_format($link, $number)
{
if ($number > 1)
{
if (preg_match('%<a href=".*\.html/\d*"%', $link))
{
$link = preg_replace("%(\.html)/(\d*)%", $this->separator . "$2$1", $link);
}
}
return $link;
}
/**
* 為新的鏈接格式增加重定向規(guī)則,移除原始分頁鏈接的重定向規(guī)則,防止重復收錄
*
* 訪問原始鏈接將返回404
* @param array $rules
* @return array
*/
function pagelink_rewrite_rules($rules)
{
$new_rule[$this->post_rule] = 'index.php?name=$matches[2]&page=$matches[4]';
return $new_rule + $rules;
}
/**
* 禁止WordPress將頁面分頁鏈接跳轉到原來的格式
* @param string $redirect_url
* @param string $requested_url
* @return bool
*/
function cancel_redirect_for_paged_posts($redirect_url, $requested_url)
{
global $wp_query;
if (is_single() && $wp_query->get('page') > 1)
{
return false;
}
return true;
}
}
new Rewrite_Inner_Page_Links();
這樣就得到了將類似http://www.domain.com/program/tokyodaigaku.html/2/ 的分頁鏈接轉化為形如 http://www.domain.com/program/tokyodaigaku/page-2.html 的鏈接。
注意,我的偽靜態(tài)規(guī)則是/%category%/%postname%.html,如果你的規(guī)則不同,請自行修改代碼或者偽靜態(tài)規(guī)則。
重寫URL規(guī)則
如果不重寫規(guī)則的話,WordPress是不認識這個鏈接的,它以為有個目錄叫tokyodaigaku,里面有篇文章叫page-2.html,結果會給出一個無情的404錯誤:

利用服務器的重寫規(guī)則
如果是SAE的話,在config.yaml的第一行加入:
如果不是的話,可以利用WordPress自帶的rewrite_rules:
登陸后臺——設置——固定鏈接:

什么也不用填,直接保存更改即可。代碼會自動在數據庫中硬性加入一條規(guī)則:
最終效果
無論是用http://www.domain.com/program/tokyodaigaku.html/2/ 還是 http://www.domain.com/program/tokyodaigaku/page-2.html,都可以訪問第二頁。
具體效果放在第二頁,順便測試一下分頁后綴效果

好了,基本功能已經實現(xiàn)了,小伙伴們是否明白了呢,如有問題,請留言
相關文章
PHP數組函數array_multisort()用法實例分析
這篇文章主要介紹了PHP數組函數array_multisort()用法,結合實例形式詳細分析了array_multisort函數的功能,定義及進行數組排序過程中的使用技巧,需要的朋友可以參考下2016-04-04
php使用mysqli和pdo擴展,測試對比mysql數據庫的執(zhí)行效率完整示例
這篇文章主要介紹了php使用mysqli和pdo擴展,測試對比mysql數據庫的執(zhí)行效率,結合完整實例形式對比分析了php分別使用mysqli與pdo進行數據庫插入操作的執(zhí)行時間,需要的朋友可以參考下2019-05-05
Android ProgressBar進度條和ProgressDialog進度框的展示DEMO
本篇文章是對Android中ProgressBar進度條和ProgressDialog進度框的展示DEMO進行了詳細的分析介紹,需要的朋友參考下2013-06-06

