重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
大体实现如下:
成都创新互联公司是一家专注于网站设计、成都网站设计与策划设计,天河网站建设哪家好?成都创新互联公司做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:天河等地区。天河做网站价格咨询:18980820575
1. 固定链接URL定义为: /health/A/
2. 实际URL为:index.php?category_name=idx=
实际代码如下:
# 找到模板目录下面的functions.php 添加下面代码
function add_query_vars($aVars) {
$aVars[] = "idx";
return $aVars;
}
// hook add_query_vars function into query_vars
add_filter('query_vars', 'add_query_vars');
function add_rewrite_rules($aRules) {
$aNewRules = array('(health)/([^/]+)/?$' = 'index.php?category_name=$matches[1]idx=$matches[2]');
$aRules = $aNewRules + $aRules;
return $aRules;
}
// hook add_rewrite_rules function into rewrite_rules_array
add_filter('rewrite_rules_array', 'add_rewrite_rules');
到这里已经实现自定义URL规则的固定链接。
那么如何获取URL中的参数呢? 其实知道这是Wordpress自身的路由实现就好明白了。 既然是WP的路由,那么我们就像别的框架一样使用WP的获取URL的参数的访问就可以了。
在需要获取idx参数值的寂寞中,如下代码就可以得到了:
#打印所有参数
var_dump($wp_query-query_vars);
#取得idx参数和值
$idx = get_query_var('idx');
# BEGIN WordPress
IfModule mod_rewrite.c
RewriteEngine On# 下面的这个是路径,如果是根目录,建议设置为 RewriteBase /# 如果有子目录,按照目录名填写
RewriteBase /目录名/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
/IfModule# END WordPress
关于wordpress的重写规则,可以查看wp-includes/rewrite.php源码
wordpress通过flush_rewrite_rules向options数据表保存规则内容
通常,使用add_rewrite_rule这个函数即可实现简单的重写规则的添加动作;
还有add_rewrite_tag、add_permastruct等等,不过这些在应用简单的重写规则时没有add_rewrite_rule来得直接。
需要注意的是,add_rewrite_rule之后要想起到预期的效果,必须执行flush_rewrite_rules动作,但不建议利用代码多次执行flush操作。
而应该在需要的时候再执行,比如插件启用时由register_activation_hook这个钩子发起该动作,或者需要时再到后台固定链接里点保存按钮也可以实现该动作。
-- 举例 --
比如新创建个movies页面,用来介绍指定的电影信息,则该页面的完整url地址应为:
;movie_name=killbill
movie_name是想传入的参数
现在需重写为
步骤:
1、add_rewrite_rule
add_action( 'init', 'wpdit_bq1579112796568320460' );
function wpdit_bq1579112796568320460() {
// 添加该规则后需手动执行flush write rules,参考上面的说明
add_rewrite_rule(
// 该正则用来匹配传入的URL
'movies/([^/]+)/?',
// `pagename` 代表这是个页面
// `movie_name` 用来保存匹配到内容
'index.php?pagename=moviesmovie_name=$matches[1]',
// rewrite rules提供的其实是一组数组用来匹配传入的URL
// 所以,当有近似的正则匹配时,总是第1个匹配到的被返回
// 因这个重写规则为后加的特定规则,故将此添加到顶部
'top' );
}
2、wordpress内置了一组查询变量存于query_vars,不在其内的变量会被忽略;
所以需事先告诉wordpress关于movie_name是什么,并允许movie_name这个变量以便后面的引用。
添加方法:
add_filter( 'query_vars', 'wpdit_bq1579112796568320460_query_vars' );
function wpdit_bq1579112796568320460_query_vars( $query_vars )
{
$query_vars[] = 'movie_name';
return $query_vars;
}
最后,后台设置固定链接里,点击保存按钮后就可以访问试试效果了。
在当前皮肤的page.php里置入下面的代码:
echo get_query_var('movie_name');
看能否显示出killbill.
检测主机是否支持伪静态的方法:在WP后台 设置 固定链接,设置为 非默认带?的那种结构,然后访问任何一篇文章,如果出现 404 错误,说明你的主机当前不支持 WordPress 伪静态。
IIS伪静态规则
IIS 环境是 Windows 主机常用的服务器环境,新建一个 txt 文件,将下面的代码添加到文件中:
[ISAPI_Rewrite]
# Defend your computer from some worm attacks
#RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]
# 3600 = 1 hour
CacheClockRate 3600
RepeatLimit 32
# Protect httpd.ini and httpd.parse.errors files
# from accessing through HTTP
# Rules to ensure that normal content gets through
RewriteRule /tag/(.*) /index\.php\?tag=$1
RewriteRule /software-files/(.*) /software-files/$1 [L]
RewriteRule /images/(.*) /images/$1 [L]
RewriteRule /sitemap.xml /sitemap.xml [L]
RewriteRule /favicon.ico /favicon.ico [L]
# For file-based wordpress content (i.e. theme), admin, etc.
RewriteRule /wp-(.*) /wp-$1 [L]
# For normal wordpress content, via index.php
RewriteRule ^/$ /index.php [L]
RewriteRule /(.*) /index.php/$1 [L]
然后另存为 httpd.ini 文件,上传到WordPress站点的根目录即可。
Apache伪静态规则
Apache是 Linux 主机下常见的环境,现在一般的 Linux 虚拟主机都采用这种环境。新建一个 htaccess.txt 文件,添加下面的代码:
IfModule mod_rewrite.c
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
/IfModule
然后上传到 WordPress 站点的根目录,重命名为 .htaccess 即可
Nginx伪静态规则
Nginx环境一般是Linux 主机 VPS或服务器用户用的比较多,这些用户一般都会自己配置Nginx,或者有专门的人帮你配置,打开 nginx.conf 或者某个站点的配置环境,比如 wpdaxue.com.conf(不同人配置的不一样),在 server { } 大括号里面添加下面的代码:
location / {
if (-f $request_filename/index.html){
rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
rewrite (.*) /index.php;
}
}
保存,重启 Nginx 即可。