dd

wordpress进阶教程(十五):url重写初步认识


wordperss的url重写一般情况写用不到,一般的,我们使用后台固定链接设置就好了。

提示:要想看懂这个,得会一些正则表达式哦

那那些地方会用到呢?

一、有自定义文章类型。wordpress后台固定连接设置是不会对自定义文章类型起作用的。

二、创建页面。这里说的创建页面科不是简单的页面模板使用,比如你的网站有一个会员系统,前台需要一个注册页面、会员资料页面(包括设置和修改页面)、会员的文章列表页面,还有投稿页面(包括文章再次编辑),确实用自定义页面模板也许可以做到这一点,但是如果你的主题是给别人用的,用户能有这么大精力来设置这些吗?

wordpress的重写规则存储于数据库中,而不是在 .htaccess  文件.

个人觉得wordpress  url重写应该分两个部分来理解(如果错误的地方,还请各路高人纠正):

一、翻译规则。wordpress运行机制是,所有请求都通过根目录的index.php来调用,访客通过一个网址来访问网站的内容时,不管url是什么,首先都调用index.php,然后调用各个文件,通过翻译规则,来分析这个url要请求的内容是什么,然后输出内容。比如访问 example.com/?p=123  首先调用index.php文件,然后各种文件调用,通过翻译规则知道,这个url是要访问ID为123的文章,如果你访问example.com/123.html,也是会首先调用index.php文件,如果你后台没有设置自定义固定链接,那这个url就翻译不了,也就是翻译规则里面没有这么一个类型的,那就会跑到404去了,如果你设置了固定连接,存在这么一个翻译规则,那么就知道,这个url也是访问ID为123的文章。这就是翻译规则。

二、“输出规则”。很简单的,在我们的模板中 the_permalink()函数是用来输出一个链接的,那我们设置了固定链接之后,重写规则就得输出正确的地址,比如原来文章url是要输出 example.com/?p=123,但是设置了重写规则后,就会根据后台设置的链接结构输出example.com/123.html这样的正确地址。

对于Linux主机来说,wordpress默认的.htaccess文件里面是这样的:

RewriteCond %{REQUEST_FILENAME} !-f    RewriteCond %{REQUEST_FILENAME} !-d    RewriteRule . /index.php [L]   function getRewriteRules() {        global $wp_rewrite; //global重写类        return $wp_rewrite->rewrite_rules();    }   Array    (           // ....           [author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$1&feed=$2          [author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$1&feed=$2          [author/([^/]+)/page/?([0-9]{1,})/?$] => index.php?author_name=$1&paged=$2          [author/([^/]+)/?$] => index.php?author_name=$1          // ...    )   echo get_option('permalink_structure');  

意思就是当服务器收到请求后,当接收到的请求不是一个文件或目录时,则会重写为WordPress根目录下的index.php文件(对于wp-admin和wp-includes这样已经存在的目录则不会重写),然后 index.php 就开始处理请求。所以说伪静态后都是从index.php文件开始的。所以如果wordpress伪静态得先让主机支持重写。

 

查看已经存在的翻译规则:

先看看你的网站已经存在的翻译规则:

RewriteCond %{REQUEST_FILENAME} !-f    RewriteCond %{REQUEST_FILENAME} !-d    RewriteRule . /index.php [L]   function getRewriteRules() {        global $wp_rewrite; //global重写类        return $wp_rewrite->rewrite_rules();    }   Array    (           // ....           [author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$1&feed=$2          [author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$1&feed=$2          [author/([^/]+)/page/?([0-9]{1,})/?$] => index.php?author_name=$1&paged=$2          [author/([^/]+)/?$] => index.php?author_name=$1          // ...    )   echo get_option('permalink_structure');  

如果你执行上面的getRewriteRules函数,将得到一个包含所有翻译规则在内的数组,如果你在网页输出或打印这个数组,你会得到一大片的代码(如果你的固定链接是默认形式,那就没有翻译规则,所以你会得到一个空数组)。类似:

RewriteCond %{REQUEST_FILENAME} !-f    RewriteCond %{REQUEST_FILENAME} !-d    RewriteRule . /index.php [L]   function getRewriteRules() {        global $wp_rewrite; //global重写类        return $wp_rewrite->rewrite_rules();    }   Array    (           // ....           [author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$1&feed=$2          [author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$1&feed=$2          [author/([^/]+)/page/?([0-9]{1,})/?$] => index.php?author_name=$1&paged=$2          [author/([^/]+)/?$] => index.php?author_name=$1          // ...    )   echo get_option('permalink_structure');  

看上面的代码,如果你访问这样一个地址:shouce.ren/author/ashu 这个url会匹配上面的第四行规则,则会翻译成index.php?author_name=ashu,这就会显示到名为ashu的作者页面。如果你访问shouce.ren/author/ashu/aaa那么没有一个翻译规则能匹配上,将会到404页面。

查看已经连接结构

前面是查看了url的翻译规则,wordpress url重写第二部分就是根据设置的链接结构输出正确的链接,怎么获取链接结构呢?后台菜单中查看设置->固定链接即可。如果你有不能查看的,不如自定义文章类型:

RewriteCond %{REQUEST_FILENAME} !-f    RewriteCond %{REQUEST_FILENAME} !-d    RewriteRule . /index.php [L]   function getRewriteRules() {        global $wp_rewrite; //global重写类        return $wp_rewrite->rewrite_rules();    }   Array    (           // ....           [author/([^/]+)/feed/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$1&feed=$2          [author/([^/]+)/(feed|rdf|rss|rss2|atom)/?$] => index.php?author_name=$1&feed=$2          [author/([^/]+)/page/?([0-9]{1,})/?$] => index.php?author_name=$1&paged=$2          [author/([^/]+)/?$] => index.php?author_name=$1          // ...    )   echo get_option('permalink_structure');  

直接获取设置选项即可了。。