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

搜索文章第二頁(yè)和第三頁(yè)的內(nèi)容,根本沒(méi)有收錄:

解決方案
于是我決定DIY WordPress的鏈接生成與解析規(guī)則。
思路
利用filter wp_link_pages_link 將分頁(yè)鏈接/123456重寫為page-[123456].html。
利用WordPress或者服務(wù)器的RewriteRule將page-[123456].html還原為/123456
添加鉤子redirect_canonical,防止WordPress從page-[123456].html到/123456的強(qiáng)行跳轉(zhuǎn)。
生成分頁(yè)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分頁(yè)鏈接的格式
* @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ī)則,移除原始分頁(yè)鏈接的重定向規(guī)則,防止重復(fù)收錄
*
* 訪問(wèn)原始鏈接將返回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將頁(yè)面分頁(yè)鏈接跳轉(zhuǎn)到原來(lái)的格式
* @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/ 的分頁(yè)鏈接轉(zhuǎn)化為形如 http://www.domain.com/program/tokyodaigaku/page-2.html 的鏈接。
注意,我的偽靜態(tài)規(guī)則是/%category%/%postname%.html,如果你的規(guī)則不同,請(qǐng)自行修改代碼或者偽靜態(tài)規(guī)則。
重寫URL規(guī)則
如果不重寫規(guī)則的話,WordPress是不認(rèn)識(shí)這個(gè)鏈接的,它以為有個(gè)目錄叫tokyodaigaku,里面有篇文章叫page-2.html,結(jié)果會(huì)給出一個(gè)無(wú)情的404錯(cuò)誤:

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

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

好了,基本功能已經(jīng)實(shí)現(xiàn)了,小伙伴們是否明白了呢,如有問(wèn)題,請(qǐng)留言
相關(guān)文章
Php 構(gòu)造函數(shù)construct的前下劃線是雙的_
最近寫php的class時(shí),總是碰到function non object的錯(cuò)誤,知道是類沒(méi)有實(shí)例化,但就是不知道錯(cuò)誤在哪里。2009-12-12
PHP數(shù)組函數(shù)array_multisort()用法實(shí)例分析
這篇文章主要介紹了PHP數(shù)組函數(shù)array_multisort()用法,結(jié)合實(shí)例形式詳細(xì)分析了array_multisort函數(shù)的功能,定義及進(jìn)行數(shù)組排序過(guò)程中的使用技巧,需要的朋友可以參考下2016-04-04
php使用mysqli和pdo擴(kuò)展,測(cè)試對(duì)比mysql數(shù)據(jù)庫(kù)的執(zhí)行效率完整示例
這篇文章主要介紹了php使用mysqli和pdo擴(kuò)展,測(cè)試對(duì)比mysql數(shù)據(jù)庫(kù)的執(zhí)行效率,結(jié)合完整實(shí)例形式對(duì)比分析了php分別使用mysqli與pdo進(jìn)行數(shù)據(jù)庫(kù)插入操作的執(zhí)行時(shí)間,需要的朋友可以參考下2019-05-05
PHP共享內(nèi)存使用與信號(hào)控制實(shí)例分析
這篇文章主要介紹了PHP共享內(nèi)存使用與信號(hào)控制,結(jié)合實(shí)例形式分析了php基于shmop擴(kuò)展實(shí)現(xiàn)共享內(nèi)存的進(jìn)程間通信以及信號(hào)控制等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
『PHP』PHP截?cái)嗪瘮?shù)mb_substr()使用介紹
截?cái)辔恼聵?biāo)題,控制在15個(gè)文字,接下來(lái)為大家講解下如何實(shí)現(xiàn)這個(gè)需求,感興趣的朋友可以參考下哈2013-04-04
PHP對(duì)文件夾遞歸執(zhí)行chmod命令的方法
這篇文章主要介紹了PHP對(duì)文件夾遞歸執(zhí)行chmod命令的方法,可實(shí)現(xiàn)遞歸執(zhí)行chmod命令改變文件夾執(zhí)行權(quán)限的功能,需要的朋友可以參考下2015-06-06
Android ProgressBar進(jìn)度條和ProgressDialog進(jìn)度框的展示DEMO
本篇文章是對(duì)Android中ProgressBar進(jìn)度條和ProgressDialog進(jìn)度框的展示DEMO進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
php 不使用js實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)
頁(yè)面跳轉(zhuǎn)大多情況下是使用js,其實(shí)也可以不用,下面為大家介紹下具體的實(shí)現(xiàn),需要的朋友可以參考下2014-02-02

