站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
▼
建站程序
开发
服务器
办公软件
开发教程
▼
服务器教程
软件使用教程
运营教程
热门电子书
▼
CSS教程
WordPress教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
热点词条
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
Function Reference/WP Rewrite
”
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
阅读这个文件的前提是,你熟悉[http://httpd.apache.org Apache]的[http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html mod_rewrite]。如果你从没有听说过这个,试着阅读[http://www.sitepoint.com/article/guide-url-rewriting Beginner's Guide to URL Rewriting]。 == WP_Rewrite角色== <tt>WP_Rewrite</tt>是WordPress的class,用来管理rewrite 规则,使你能够使用[[WordPress:Introduction_to_Blogging#Pretty_Permalinks|Pretty Permalinks]]功能。从数据库中的参数值中产生rewrite 规则,有几种方法,当上传rewrite 规则的时候,是在内部使用的,同时查找某篇文章,某个网页,类别归档,等等的URL。定义在<tt>wp-includes/rewrite.php</tt>中而且一个全局[[WordPress:Glossary#Singleton|singleton]], <tt>$wp_rewrite</tt>,在<tt>wp-settings.php</tt>中初始化。 ==方法和属性== 这是<tt>WP_Rewrite</tt>一个正式的文档。试着不要直接地访问或者设置属性,而是使用方法与<tt>$wp_rewrite</tt> object互动。 ===属性=== ; <tt>$permalink_structure</tt> :数据库中的permalnk结构。这是你在Permalink选项网页上设置的内容,而且包含'标签' 像 %year%, %month% 和 %post_id%。 ; <tt>$category_base</tt> :在类别归档URLs之前插入的任何内容。默认为'类别/'。 ; <tt>$category_structure</tt> :类别归档URLs的结构。这只是<tt>$category_base</tt>和'%category%'。 ; <tt>$author_base</tt> :作者归档URLs之前插入的任何内容。默认为'作者/'。 ; <tt>$author_structure</tt> :作者归档URLs的结构。这只是<tt>$author_base</tt>和 '%author%'。 ; <tt>$feed_base</tt> : feed URLs之前插入的任何内容。默认为'feed/'。 ; <tt>$feed_structure</tt> : feed URLs的结构。这只是<tt>$feed_base</tt> 和 '%feed%'。 ; <tt>$search_base</tt> : searchs之前插入的任何内容。默认为'搜索/'。 ; <tt>$search_structure</tt> :搜索URLs的结构。这只是<tt>$search_base</tt> 和 '%search%'。 ; <tt>$comments_base</tt> : <tt>$feed_structure</tt>之前插入的任何内容,以得到最新的评论feed。默认为'评论'。 ; <tt>$comments_feed_structure</tt> :最新的评论feed的结构。这只是<tt>$comments_base</tt> 和 <tt>$feed_base</tt> 和'%feed%'。 ; <tt>$date_structure</tt> :有日期的归档URLs的结构。试着为'%year%/%monthnum%/%day%', '%day%/%monthnum%/%year%' 或者 '%monthnum%/%day%/%year%',但是如果在你的<tt>$permalink_structure</tt>中没有发现这些,默认为'%year%/%monthnum%/%day%'。不同的函数使用这个结构得到更普通的结构:例如<tt>get_year_permastruct()</tt>这是从<tt>$date_structure</tt>中移除了'%monthnum%' 和 '%day%'标签。 ; <tt>$page_structure</tt> :网页结构。只是'%pagename%'。 ; <tt>$front</tt> :任何关于你的<tt>$permalink_structure</tt>第一个标签启动的内容。 ; <tt>$root</tt> :你的WordPress安装的根,是所有结构开始的地方。 ; <tt>$matches</tt> :当计算rewrite 规则的references的时候,在内部使用这个。 ; <tt>$rules</tt> : The rewrite rules. Set when <tt>rewrite_rules()</tt> is called. ; <tt>$rules</tt> : rewrite规则。当调用<tt>rewrite_rules()</tt>时候,得到设置。 ; <tt>$non_wp_rules</tt> : Associative array of "rules that don't redirect to WP's index.php (and thus shouldn't be handled by WP at all)" roughly in the form <code>'Pattern' => 'Substitution'</code> (see below). ; <tt>$non_wp_rules</tt> : "没有redirect to WP's index.php的规则 (因此不应该由WP处理)"的结合数组,基本形式是<code>'Pattern' => 'Substitution'</code>(请看看下面的)。 ; <tt>$rewritecode</tt> : An array of all the tags available for the permalink structure. See [[WordPress:Using_Permalinks#Structure_Tags|Using Permalinks]] for a list. ; <tt>$rewritecode</tt> :permalink结构可以使用的所有标签的数组。请看看[[WordPress:Using_Permalinks#Structure_Tags|Using Permalinks]]的列表。 ; <tt>$rewritereplace</tt> :对于rewrite 规则的regex部分,每个标签会由什么取代。<tt>$rewritereplace</tt>中的第一个元素是<tt>$rewritecode</tt>中第一个元素的regex,第二个元素对应着第二个,等等。 ; <tt>$queryreplace</tt> :在rewrite规则的rewrite部分,每个标签会由什么来取代。在<tt>$rewritereplace</tt>中可以取代的部分,在这里也可以适用。 ===方法=== ; <tt>add_rewrite_tag(<var>$tag</var>, <var>$pattern</var>, <var>$query</var>)</tt> :给<var>$rewritecode</var>, <var>$rewritereplace</var>和<var>$queryreplace</var>添加一个元素,单独地使用每个参数。如果<var>$rewritecode</var>中已经存在<var>$tag</var>,当前的参数值就会被覆盖。 ; <tt>flush_rules()</tt> :重新产生rewrite规则,并将这个规则保存到数据库中。 ; <tt>generate_rewrite_rule(<var>$permalink_structure</var>, <var>$walk_dirs</var> = false)</tt> :从permalink结构中产生不提供必要服务的rewrite规则。没有将要创建的额外网页或者feeds的规则。 ; <tt>generate_rewrite_rules(<var>$permalink_structure</var>, <var>$ep_mask = EP_NONE</var>, <var>$page</var> =true, <var>$feed</var> = true, <var>$forcomments</var> = false, <var>$walk_dirs</var> =true)</tt> : 一个很大的函数,为一个给定的结构<var>$permalink_structure</var>产生rewrite规则。如果<var>$page</var> 是true,会产生额外的rewrite 规则,来访问不同的网页(例如 /category/tech/page/2 指向'tech' 类别归档的第二个页面)。如果<var>$feed</var> 是true,会产生额外的rewrite规则,得到当前页面的feed,而且如果<var>$walk_dirs</var> 是true,那么会产生当前结构的每个目录的rewrite规则,例如,如果你提供 '/%year%/%month%/%day/', rewrite 规则会产生 '/%year%/', /%year%/%month%/' 和'/%year%/%month%/%day%/'。这返回了结合数组,使用rewrite 规则的regex部分作为keys,使用 redirect part of the rewrite 规则的redirect部分作为参数值。 ; <tt>get_date_permastruct()</tt>, <tt>get_category_permastruct()</tt>, <tt>get_date_permastruct()</tt>等等 :在相关的属性上加上内容(例如<var>$date_structure</var>关于<tt>get_date_permastruct()</tt>)。如果没有设置,将其返回。函数<tt>get_month_permastruct()</tt> 和<tt>get_year_permastruct()</tt>没有相关的属性:是通过获得<var>$date_structure</var>并且移除其不需要的标签(如<tt>get_month_permastruct()</tt> 移除了'%day%' 标签,因为其只要表明年份和月份)得到结构。 ; <tt>init()</tt> :设置object,从数据库中设置<var>$permalink_structure</var>和<var>$category_base</var>。将<var>$root</var>设置为<var>$index</var>加上'/'。将<var>$front</var>设置为permalink结构中第一个标签开始的任何内容。取消所有其它属性。 ; <tt>mod_rewrite_rules()</tt> :返回所有规则的字符串(不是数组)。包含在Apache <tt>[http://httpd.apache.org/docs/2.0/mod/core.html#ifmodule <IfModule>]</tt> block,确保激活了mod_rewrite。 ; <tt>page_rewrite_rules()</tt> :返回你已经创建的任何网页的规则。 ; <tt>rewrite_rules()</tt> :如<tt>generate_rewrite_rules()</tt>中那样,使用结合的数组填充并且返回<var>$rules</var>变数。这是从文章,日期,评论,搜索,类别,作者和网页结构中返回的。 ; <tt>set_category_base(<var>$category_base</var>)</tt> :更改类别基础。 ; <tt>set_permalink_structure(<var>$permalink_structure</var>)</tt> : 更改permalink 结构。 ; <tt>using_index_permalinks()</tt> :如果你的博客使用PATHINFO permalinks,返回<tt>true</tt>。 ; <tt>using_mod_rewrite_permalinks</tt> :如果你的博客通过mod_rewrite使用"pretty"permalinks,返回<tt>true</tt>。 ; <tt>using_permalinks()</tt> :如果你的博客正在使用任何permalink结构(例如,不是默认的查询URIs <tt>?p=n</tt>, <tt>?cat=n</tt>),返回<tt>true</tt>。 ; <tt>WP_Rewrite</tt> (构造器) : 调用 <tt>init()</tt>。 ; <tt>wp_rewrite_rules()</tt> :如<tt>rewrite_rules()</tt>,返回rewrite规则的数组,但是使用<tt><var>$matches</var>[xxx]</tt>(xxx是个数字的位置),而不是普通的mod_rewrite backreferences,<var>$xxx</var>(xxx是个数字的位置)。当你准备在PHP内部使用规则的时候而不是在.htaccess文件中编写,这很有用。 ==插件Hooks== 因为rewrite规则是你的网络博客泛函性的一个重要的方面,WordPress允许插件hook into几点的产生过程。<tt>rewrite_rules()</tt>包含有九个过滤器和一个hook来精确地控制rewrite规则的过程。下面是你可以在<tt>rewrite_rules()</tt>中过滤什么: *要过滤为permalinks URLs产生的重写规则,请使用<tt>post_rewrite_rules</tt>。 *要过滤为日期归档 URLs产生的重写规则,请使用<tt>date_rewrite_rules</tt>。 *要过滤为类别归档 URLs产生的重写规则,请使用<tt>category_rewrite_rules</tt>。 *要过滤为搜索 URLs产生的重写规则,请使用<tt>search_rewrite_rules</tt>。 *要过滤为最近评论feed URLs产生的重写规则,请使用<tt>comments_rewrite_rules</tt>。 *要过滤为作者归档 URLs产生的重写规则,请使用<tt>author_rewrite_rules</tt>。 *要过滤为你的网页产生的重写规则,请使用<tt>page_rewrite_rules</tt>。 *要过滤为你的网络日志根目录产生的重写规则,请使用<tt>root_rewrite_rules</tt>。 *要过滤整个内容,请使用<tt>rewrite_rules_array</tt>。 * action hook <tt>generate_rewrite_rules</tt>在所有规则创建<strong>之后</strong>,才运行。如果你的函数获得一个参数,会得到[http://www.php.net/manual/en/language.references.php reference]传递到整个<tt>$wp_rewrite</tt> object。 <tt>mod_rewrite_rules()</tt>是个函数,获得<tt>rewrite_rules()</tt>产生的数组,而且将这个转变为.htaccess文件的rewrite规则。这个函数也有过滤器<tt>mod_rewrite_rules</tt>,会传递函数所有规则的字符串,为.htaccess编写,包含<tt><IfModule></tt>周围的部分。(注:你可能也会看到插件使用<tt>rewrite_rules</tt>hook,但是这个已经[[WordPress:Glossary#Deprecated|取消了]])。 ===例子=== (也看看:[[WordPress:Custom_Queries#Permalinks_for_Custom_Archives|自定义归档的Permalinks]]) 插件处理<tt>$wp_rewrite</tt> 对象,典型的就是添加插件自身的rewrite 规则。这非常简单。过滤一般的<tt>rewrite_rules_array</tt>。[http://vapourtrails.ca/wp-keywords Jerome's Keywords]插件执行这个操作,激活URLs,如<tt><nowiki>http://example.com/tag/sausages</nowiki></tt>。 <pre> function keywords_createRewriteRules($rewrite) { global $wp_rewrite; //添加rewrite记号 $keytag_token = '%tag%'; $wp_rewrite->add_rewrite_tag($keytag_token, '(.+)', 'tag='); $keywords_structure = $wp_rewrite->root . "tag/$keytag_token"; $keywords_rewrite = $wp_rewrite->generate_rewrite_rules($keywords_structure); return ( $rewrite + $keywords_rewrite ); } </pre> Jerome没有将rewrite 规则插入到<tt>$rewrite</tt>数组,而是又创建了一个数组<tt>$keywords_rewrite</tt>,使用<tt>WP_Rewrite</tt> 函数<tt>generate_rewrite_rules()</tt>。使用那个函数,意味着这插件不需要为额外的网页(像<tt>page/2</tt>),或者feeds(像e <tt>feed/atom</tt>),等等创建rewrite规则。这个数组会附加到<tt>$rewrite</tt>数组上,并且会返回。 关于这个的一个简单的例子是Ryan Boren的[http://boren.nu/archives/2005/03/29/feed-director-plugin/ Feed Director]插件。这只是将URLs象http://example.com/feed.xml 导向了http://example.com/feed/rss2: <pre> function feed_dir_rewrite($wp_rewrite) { $feed_rules = array( 'index.rdf' => 'index.php?feed=rdf', 'index.xml' => 'index.php?feed=rss2', '(.+).xml' => 'index.php?feed=' . $wp_rewrite->preg_index(1) ); $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules; } // Hook in. add_filter('generate_rewrite_rules', 'feed_dir_rewrite'); </pre> 因为这里的数组非常简单,没有必要调用<tt>generate_rewrite_rules()</tt>。同时,插件的规则添加到WordPress。注意因为这个函数过滤了<tt>generate_rewrite_rules</tt>,函数接受了整个<tt>$wp_rewrite</tt> object作为一个参数,而不仅仅rewrite 规则。 当然,因为你将你的rewrite规则添加到数组后,WordPress才能够处理这个规则,你的插件rewrite规则可能包含在WordPress处理rewrite规则的任何内容之中,象将其写入.htaccess文件一样。 == 非Wordpress rewrite规则 == %%% <?php $wp_rewrite->non_wp_rules = array( 'Pattern' => 'Substitution' ); print_r($wp_rewrite->mod_rewrite_rules()); ?> %%% prints <IfModule mod_rewrite.c> RewriteEngine On RewriteBase <var>/wp_home/</var> RewriteRule ^Pattern <var>/wp_home/</var>Substitution [QSA,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /<var>wp_home</var>/index.php [L] </IfModule> <var>/wp_home/</var>是WordPress的主目录(如果WordPress安装在你的网络根目录上,是根URL <tt>/</tt>。)
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)