WordPress分页伪静态加html后缀
<p><strong>问题</strong></p>
<p>
当文章有分页的时候,wordpress生成的永久链接是page.html/2的形式,前面一段是文章的$link,后面的数字代表分页$number。那么问题来了,挖掘……不对,从逻辑上讲这到底是个html文件还是一个目录呢?</p>
<p>
<strong>难看</strong></p>
<p>
在.html这个静态文件后面加上一个/和数字简直令人摸不着头脑,这还只是其次,重要的是,我发现搜索引擎根本不收录这样奇怪的链接,这个真是无法接受,我写的东西首尾都很重要,不能因为分个页就被忽视了。</p>
<p>
不收录</p>
<p>
拿这篇文章来看,搜索文章第一页的内容,谷歌收录了:</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress分页伪静态加html后缀" alt="WordPress分页伪静态加html后缀" src="https://zhuji.jb51.net/uploads/img/202305/5fbbe6ccb69b39befb586a3489493cc7.jpg"></p>
<p>
搜索文章第二页和第三页的内容,根本没有收录:</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress分页伪静态加html后缀" alt="WordPress分页伪静态加html后缀" src="https://zhuji.jb51.net/uploads/img/202305/e91945aa9e81ec12ca3b3b00e93c7e9b.jpg"></p>
<p>
<strong>解决方案</strong></p>
<p>
于是我决定diy wordpress的链接生成与解析规则。</p>
<p>
<strong>思路</strong></p>
<p>
利用filter wp_link_pages_link 将分页链接/123456重写为page-.html。</p>
<p>
利用wordpress或者服务器的rewriterule将page-.html还原为/123456</p>
<p>
添加钩子redirect_canonical,防止wordpress从page-.html到/123456的强行跳转。</p>
<p>
生成分页html后缀链接</p>
<p>
给wordpress主题加入:</p>
<div>
<div>
<div id="highlighter_265391">
<div>
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td>
<div>
1</div>
<div>
2</div>
<div>
3</div>
<div>
4</div>
<div>
5</div>
<div>
6</div>
<div>
7</div>
<div>
8</div>
<div>
9</div>
<div>
10</div>
<div>
11</div>
<div>
12</div>
<div>
13</div>
<div>
14</div>
<div>
15</div>
<div>
16</div>
<div>
17</div>
<div>
18</div>
<div>
19</div>
<div>
20</div>
<div>
21</div>
<div>
22</div>
<div>
23</div>
<div>
24</div>
<div>
25</div>
<div>
26</div>
<div>
27</div>
<div>
28</div>
<div>
29</div>
<div>
30</div>
<div>
31</div>
<div>
32</div>
<div>
33</div>
<div>
34</div>
<div>
35</div>
<div>
36</div>
<div>
37</div>
<div>
38</div>
<div>
39</div>
<div>
40</div>
<div>
41</div>
<div>
42</div>
<div>
43</div>
<div>
44</div>
<div>
45</div>
<div>
46</div>
<div>
47</div>
<div>
48</div>
<div>
49</div>
<div>
50</div>
<div>
51</div>
<div>
52</div>
<div>
53</div>
<div>
54</div>
<div>
55</div>
<div>
56</div>
<div>
57</div>
<div>
58</div>
<div>
59</div>
<div>
60</div>
<div>
61</div>
<div>
62</div>
<div>
63</div>
<div>
64</div>
<div>
65</div>
<div>
66</div>
<div>
67</div>
<div>
68</div>
</td>
<td>
<div>
<div>
<code>class</code> <code>rewrite_inner_page_links</code>
</div>
<div>
<code>{</code>
</div>
<div>
<code> </code><code>var</code> <code>$separator</code><code>;</code>
</div>
<div>
<code> </code><code>var</code> <code>$post_rule</code><code>;</code>
</div>
<div>
<code> </code>
</div>
<div>
<code> </code><code>function</code> <code>__construct()</code>
</div>
<div>
<code> </code><code>{</code>
</div>
<div>
<code> </code><code>$this</code><code>->separator = </code><code>'/page-'</code><code>;</code>
</div>
<div>
<code> </code><code>// (.+?)/([^/]+).html(/+)?/?</code>
</div>
<div>
<code> </code><code>$this</code><code>->post_rule = </code><code>'(.+?)/([^/]+)('</code> <code>. </code><code>$this</code><code>->separator . </code><code>'(+))+.html/?$'</code><code>;</code>
</div>
<div>
<code> </code><code>if</code> <code>(!is_admin() || defined(</code><code>'doing_ajax'</code><code>)) :</code>
</div>
<div>
<code> </code><code>add_filter(</code><code>'wp_link_pages_link'</code><code>, </code><code>array</code><code>(</code><code>$this</code><code>, </code><code>'inner_page_link_format'</code><code>), 10, 2); </code><code>// for inner pages</code>
</div>
<div>
<code> </code><code>add_filter(</code><code>'redirect_canonical'</code><code>, </code><code>array</code><code>(</code><code>$this</code><code>, </code><code>'cancel_redirect_for_paged_posts'</code><code>), 10, 2);</code>
</div>
<div>
<code> </code><code>endif</code><code>;</code>
</div>
<div>
<code> </code><code>if</code> <code>(is_admin()) :</code>
</div>
<div>
<code> </code><code>add_filter(</code><code>'rewrite_rules_array'</code><code>, </code><code>array</code><code>(</code><code>$this</code><code>, </code><code>'pagelink_rewrite_rules'</code><code>));</code>
</div>
<div>
<code> </code><code>endif</code><code>;</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code> </code>
</div>
<div>
<code> </code><code>/**</code>
</div>
<div>
<code> </code><code>* 修改post分页链接的格式</code>
</div>
<div>
<code> </code><code>* @param string $link</code>
</div>
<div>
<code> </code><code>* @param int $number</code>
</div>
<div>
<code> </code><code>* @return string</code>
</div>
<div>
<code> </code><code>*/</code>
</div>
<div>
<code> </code><code>function</code> <code>inner_page_link_format(</code><code>$link</code><code>, </code><code>$number</code><code>)</code>
</div>
<div>
<code> </code><code>{</code>
</div>
<div>
<code> </code><code>if</code> <code>(</code><code>$number</code> <code>> 1)</code>
</div>
<div>
<code> </code><code>{</code>
</div>
<div>
<code> </code><code>if</code> <code>(preg_match(</code><code>'%<a href=".*\.html/\d*"%'</code><code>, </code><code>$link</code><code>))</code>
</div>
<div>
<code> </code><code>{</code>
</div>
<div>
<code> </code><code>$link</code> <code>= preg_replace(</code><code>"%(\.html)/(\d*)%"</code><code>, </code><code>$this</code><code>->separator . </code><code>"$2$1"</code><code>, </code><code>$link</code><code>);</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code> </code><code>return</code> <code>$link</code><code>;</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code> </code>
</div>
<div>
<code> </code><code>/**</code>
</div>
<div>
<code> </code><code>* 为新的链接格式增加重定向规则,移除原始分页链接的重定向规则,防止重复收录</code>
</div>
<div>
<code> </code><code>*</code>
</div>
<div>
<code> </code><code>* 访问原始链接将返回404</code>
</div>
<div>
<code> </code><code>* @param array $rules</code>
</div>
<div>
<code> </code><code>* @return array</code>
</div>
<div>
<code> </code><code>*/</code>
</div>
<div>
<code> </code><code>function</code> <code>pagelink_rewrite_rules(</code><code>$rules</code><code>)</code>
</div>
<div>
<code> </code><code>{</code>
</div>
<div>
<code> </code><code>$new_rule</code><code>[</code><code>$this</code><code>->post_rule] = </code><code>'index.php?name=$matches&page=$matches'</code><code>;</code>
</div>
<div>
<code> </code><code>return</code> <code>$new_rule</code> <code>+ </code><code>$rules</code><code>;</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code> </code>
</div>
<div>
<code> </code><code>/**</code>
</div>
<div>
<code> </code><code>* 禁止wordpress将页面分页链接跳转到原来的格式</code>
</div>
<div>
<code> </code><code>* @param string $redirect_url</code>
</div>
<div>
<code> </code><code>* @param string $requested_url</code>
</div>
<div>
<code> </code><code>* @return bool</code>
</div>
<div>
<code> </code><code>*/</code>
</div>
<div>
<code> </code><code>function</code> <code>cancel_redirect_for_paged_posts(</code><code>$redirect_url</code><code>, </code><code>$requested_url</code><code>)</code>
</div>
<div>
<code> </code><code>{</code>
</div>
<div>
<code> </code><code>global</code> <code>$wp_query</code><code>;</code>
</div>
<div>
<code> </code><code>if</code> <code>(is_single() && </code><code>$wp_query</code><code>->get(</code><code>'page'</code><code>) > 1)</code>
</div>
<div>
<code> </code><code>{</code>
</div>
<div>
<code> </code><code>return</code> <code>false;</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code> </code><code>return</code> <code>true;</code>
</div>
<div>
<code> </code><code>}</code>
</div>
<div>
<code>}</code>
</div>
<div>
<code> </code>
</div>
<div>
<code>new</code> <code>rewrite_inner_page_links();</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
这样就得到了将类似http://www.domain.com/program/tokyodaigaku.html/2/ 的分页链接转化为形如 http://www.domain.com/program/tokyodaigaku/page-2.html 的链接。</p>
<p>
<span style="color: #ff0000">注意,我的伪静态规则是/%category%/%postname%.html,如果你的规则不同,请自行修改代码或者伪静态规则。</span></p>
<p>
<strong>重写url规则</strong></p>
<p>
如果不重写规则的话,wordpress是不认识这个链接的,它以为有个目录叫tokyodaigaku,里面有篇文章叫page-2.html,结果会给出一个无情的404错误:</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress分页伪静态加html后缀" alt="WordPress分页伪静态加html后缀" src="https://zhuji.jb51.net/uploads/img/202305/6dcf9c6ff7b8ca312f9657451afdacc4.jpg"></p>
<p>
<strong>利用服务器的重写规则</strong></p>
<p>
如果是sae的话,在config.yaml的第一行加入:</p>
<p>
</p>
<div>
<span><u>复制代码</u></span> 代码如下:</div>
<div id="code3193">
- rewrite: if ( !is_dir() && path ~ "(.+?)/([^/]+)(/page-(+))+.html/?$") goto "index.php?name=$2&page=$4"</div>
<p>
</p>
<p>
</p>
<p>
如果不是的话,可以利用wordpress自带的rewrite_rules:</p>
<p>
登陆后台——设置——固定链接:</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress分页伪静态加html后缀" alt="WordPress分页伪静态加html后缀" src="https://zhuji.jb51.net/uploads/img/202305/1baf27138a9dd9261b5b1a7ad88fae2b.jpg"></p>
<p>
什么也不用填,直接保存更改即可。代码会自动在数据库中硬性加入一条规则:</p>
<p>
</p>
<div>
<span><u>复制代码</u></span> 代码如下:</div>
<div id="code94907">
"(.+?)/([^/]+)(/page-(+))+.html/?$" => "index.php?name=$matches&page=$matches"</div>
<p>
</p>
<p>
<strong>最终效果</strong></p>
<p>
无论是用http://www.domain.com/program/tokyodaigaku.html/2/ 还是 http://www.domain.com/program/tokyodaigaku/page-2.html,都可以访问第二页。</p>
<p>
具体效果放在第二页,顺便测试一下分页后缀效果</p>
<p>
<img style="max-width:100%!important;height:auto!important;"title="WordPress分页伪静态加html后缀" alt="WordPress分页伪静态加html后缀" src="https://zhuji.jb51.net/uploads/img/202305/62240071e059a7a57b1bdedbdd06722e.jpg"></p>
<p>
好了,基本功能已经实现了,小伙伴们是否明白了呢,如有问题,请留言</p>
頁:
[1]