wordpress博客category page 404 错误解决办法 (url静态化)

假期无事,又重新将自己的网站(第6小站)上线,放弃了原来的dokuwiki(优点:部署简单,无需数据库支持,ui简洁;缺点:文章管理逻辑奇特,需要手写markdown),然后自豪的采用wordpress,搞定主题,一阵改头换面之后,发现了一些美中不足的东西———丑陋的url,贴几个大家感受下:

sixther.me/?p=85             #特定文章的url,根据post_id查询
sixther.me/?m=201512         #查看特定日期的文章,根据date string查询
sixther.me/?category=15      #查看特定类别的文章,根据catetory_id查询
sixther.me/?tag=monitor      #查看特定标签的文章,根据tag_string查询
sixther.me/?author=1         #查看特定作者的文章,根据author_id查询
注:这些写法都省略了index.php,完整的写法应为:
https://sixther.me/index.php?author=1
url也属于UI的一部分,也应该做到简洁友好,至少也得让网络爬虫认识,第一步,先使用wordpress自带的固定链接设置将其静态化,这样设置完之后,上面的url变成了如下样子:
固定链接:https://sixther.me/%postname%.html

sixther.me/vim-template-for-python-file.html
sixther.me/2015/12
sixther.me/category/linux
sixther.me/tag/python
sixther.me/author/sixther
对,这应该是合理的,也应该是最终的目标,但这时候出现大问题了,所有的链接,包括文章,分类,日期,标签,作者都变成了404页面,不知道这一点算不算是wordpress的bug,固定链接的功能不应该就是这样的么,也或许跟版本有关系,第6小站用的是4.4的版本,也就是说,目前的网站不认识这些优雅的url,只认识上面那些丑陋的url,这种情况可以通过nginx来解决,细思一下,也不能完全解决,因为优雅的url里面都是name属性的东西,丑陋的url里都是id属性的东西,只有tag跟date可以用rewrite搞定,先加上再说:

rewrite ^/([0-9]+)/([0-9]+) /index.php?m=$1$2 last;
rewrite ^/tag/(.*) /index.php?tag=$1 last;
bingo!!
再来考虑剩下的几个,显然,解决办法有两个,一是找到index.php通过name查询结果的参数,另一个是让程序生成href的时候用id来生成,那只能去看wordpress代码了,最开始注意到了auth-template.php的文件里面有个get_author_posts_url函数:

function get_author_posts_url($author_id, $author_nicename = '') {
        global $wp_rewrite;
        $auth_ID = (int) $author_id;
        $link = $wp_rewrite->get_author_permastruct();
        if ( empty($link) ) {
                $file = home_url( '/' );
                $link = $file . '?author=' . $auth_ID;
        } else {
                if ( '' == $author_nicename ) {
                        $user = get_userdata($author_id);
                        if ( !empty($user->user_nicename) )
                                $author_nicename = $user->user_nicename;
                }
                $link = str_replace('%author%', $author_nicename, $link);
                //$link = str_replace('%author%', $author_id, $link);
                $link = home_url( user_trailingslashit( $link ) );
        }
        $link = apply_filters( 'author_link', $link, $author_id, $author_nicename );
        return $link;
}
注释那一行是我本来打算改的,后来事实证明这样可以将按照author id查询改好,可以看到,生成author_posts_url的方法就是将%author%替换为$author_nicename,有点mvc基础的同学都会明白%author%就是模版变量,那category,post应该也是这样做的吧,用"%category% && str_replace"的关键字搜索category-template.php文件,却并没有类似代码,真是搞不懂wordpress的代码逻辑,有机会一定得梳理下,第二种办法就追到这里没再下去了。
然后就是各种google了,基本关键字就是“wordpress api,wordpress category 404...”之类的,然后就发现了query.php的文件,打开文件的第一行就让我看到了解决问题的希望(是一行注释):

/**
 * WordPress Query API
 *
 * The query API attempts to get which part of WordPress the user is on. It
 * also provides functionality for getting URL query information.
 *
再往下看,犹如发现新大陆:

public function fill_query_vars($array) {
                $keys = array(
                        'error'
                        , 'm'
                        , 'p'
                        , 'post_parent'
                        , 'subpost'
                        , 'subpost_id'
                        , 'attachment'
                        , 'attachment_id'
                        , 'name'
                        , 'static'
                        , 'pagename'
                        , 'page_id'
                        , 'second'
                        , 'minute'
                        , 'hour'
                        , 'day'
                        , 'monthnum'
                        , 'year'
                        , 'w'
                        , 'category_name'
                        , 'tag'
                        , 'cat'
                        , 'tag_id'
                        , 'author'
                        , 'author_name'
                        , 'feed'
                        , 'tb'
                        , 'paged'
                        , 'comments_popup'
                        , 'meta_key'
                        , 'meta_value'
                        , 'preview'
                        , 's'
                        , 'sentence'
                        , 'title'
                        , 'fields'
                        , 'menu_order'
                );
套用琅琊榜里的一句话:“女人的感觉就是这么不讲道理”,此刻我的感觉也是百分百确认这些就是index.php支持的查询参数列表,没有再细看代码,直接修改nginx rewrite规则,没有修改哪怕是一行wordpress的代码,完整规则如下:

rewrite ^/(.*).html /index.php?name=$1 last;
rewrite ^/([0-9]+)/([0-9]+) /index.php?m=$1$2 last;
rewrite ^/tag/(.*) /index.php?tag=$1 last;
rewrite ^/page/([0-9]+) /index.php?paged=$1 last;
rewrite ^/author/(.*) /?author_name=$1 last;
rewrite ^/category/(.*) /?category_name=$1 last;
all bingo!!!
彩蛋:
查问题的过程中,发现了一个叫wp-json的东西,可以通过json查询相应内容,如果想开发wordpress的app,这个一定用的上。

时间: 2024-10-26 01:00:25

wordpress博客category page 404 错误解决办法 (url静态化)的相关文章

wordpress博客feed页面报错解决办法

google chrome报的错误如下: This page contains the following errors: error on line 4 at column 6: XML declaration allowed only at the start of the document Below is a rendering of the page up to the first error.   翻译过来的错误就是:xml文档申明只能在文档的开头部分. 于是我点开chrome的源文

thinkphp部署在nginx下 500错误或404错误解决办法

nginx是一个高性能并发的服务器软件,配置方面要稍微比apache复杂一点点. 本地部署成功的一个thinkphp框架,部署到服务器的时候,刚开始因为权限问题抛出404错误,然后chown之后,抛出了500的错误,但是首页能够访问. 复查,应该是伪静态rewrite出现问题了,找了好多文献,解决方案如下: 应该将 location ~ .*\.(php|php5)?$ { #fastcgi_pass  unix:/tmp/php-cgi.sock; fastcgi_pass  127.0.0.

struts2+UrlRewriteFilter配置404错误解决办法

1.UrlRewriteFilter 应在 struts2过滤器前. 2.struts2的filtermap应如此修改,否则会报404错误.  代码如下 复制代码 <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher&g

WordPress中文Tags、中文地址404错误解决办法

下面我们以WordPress3.8.1为例子 WordPress更新到3.8.1版本后,一如既往地出现了中文地址和中文Tags标签打不开的问题 首先打开Wordpress站点下wp-includes目录里的class-wp.php文件.操作之前复制备份一个是好的习惯.我是用EditPlus编辑的.另外以下操作都是在源文件没有被修改下进行的,从后朝前修改也是为了确保行数是原始文件的行数,另外咱们要记下,这个文件是ANSI编码. 搜索$_SERVER['REQUEST_URI']或直接定位157行.

Wordpress博客如何设置更加有利于SEO

红涛的电商圈参赛博客,就是用wordpress博客程序做的.因为之前一直自己没有过多接触这个程序,所以很多东西不是很了解.但是我还是看过很多SEO做得不错的博客,所以今天想就谈谈:wordpress博客如何设置更加有利于SEO,随着SEO行业的 发展,很多懂SEO的人,都已经迷恋上了这个程序.他的主要特点就是:程序简洁.安全系数较高.模版多.插件强大最重要的一点就是对搜索引擎非常友好,可 以简单的理解为,wordpress是一个非常好做SEO的开源程序.大家如果对wordress了解的都知道是一

WordPress博客程序常见错误的解决方法

  WordPress是主流的 Blog 搭建平台. WordPress 可以说是世界上目前最先进的 weblog 程序.目前开发的程序大多都是根据它仿造的.它更能把握搜索引擎,在你使用 WordPress 并掌握几种插件后,对于优化将不用过多的操心,它会为你想的更多. 主题"> 如果你是一个喜欢随手编上一段代码的WordPress 用户,又或者你是一个喜欢安装插件,改变主题的用户,你就会明白,错误是没有办法避免的.你也会明白当你卷入一个无法预计的错误,而又没有找到解决办法的时候是有多么的

教你三步优化wordpress博客

wordpress这几年很火,由于其开放性加之丰富的模板,支持插件拓展,越来越多的人建立博客开始选择wordpress.但是仍然有部分朋友初次接触WP博客,不了解如何去优化,笔者今天就这个问题来谈谈新手如何做好wordpress优化. 一.通过代码添加关键词和描述标签 wordpress在标题和描述标签上的做法是比较奇怪的,他自带的程序是没有关键词和描述标签,而我们如果通过插件添加又感觉会拖慢速度,基于此,我们可以使用代码来解决这个问题: <?php //判断是否为首页 if ( is_home

WordPress博客换主题网站百度收录被K

本月18号网站(Wordpress博客系统)更换了外观主题.6月28号被百度K站了. 百度收录现在为0了.Google的收录变化不大. 收录情况:   百度会K改版的网站吗? 会. 但不是一定会. 百度会根据不同的情况做不同的处理. 百度的官方说法是: 站点改版有很多种(例如改换域名.改换目录.改换版面等等),不同形式百度的处理方式和时间均有所不同. –百度站长论坛管理员如果是内容发生根本性变化,则理论上会被视为一个全新网站,旧 有超链失效.–百度搜索引擎优化指南 官方版 2.0至于为什么是6月

WordPress博客友情链接只在首页显示的方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 大家都知道,在默认情况下,wordpress博客的友情链接是全站显示的,并且后台没有仅在首页的选项.而且他网站程序如CMS.zblog的友链却是只在首页显示,所以wordpress博客与其他网站交换友情链接时会比较吃亏.你得到的仅是对方首页分散来的权重,却要分散整站所有页面的权重给对方.而且一旦对方网站出现状况,wordpress博客要承担整