WordPress 的固定链接(Permalink)系统是一个核心功能,其逻辑分散在多个函数和文件中。理解它们对于主题开发、插件开发或进行高级自定义至关重要。
一、核心控制函数
这些函数是开发时最常使用的,用于获取和操作链接。
1. 获取链接的函数
| 函数名 | 说明 | 示例 |
|---|---|---|
get_permalink( $post_id ) | 最重要的函数。根据文章ID获取文章的完整固定链接。 | get_permalink( 42 ) → https://example.com/hello-world |
home_url( $path ) | 获取站点首页的链接,可附加路径。 | home_url( '/about' ) → https://example.com/about |
site_url( $path ) | 获取WordPress安装目录的链接,常用于引用核心文件。 | site_url( '/wp-load.php' ) |
get_term_link( $term_id, $taxonomy ) | 获取分类/标签等术语的归档页链接。 | get_term_link( 5, 'category' ) |
get_author_posts_url( $author_id ) | 获取作者归档页链接。 | get_author_posts_url( 1 ) |
get_post_type_archive_link( $post_type ) | 获取自定义文章类型的归档页链接。 | get_post_type_archive_link( 'product' ) |
get_search_link( $query ) | 获取搜索结果的链接。 | get_search_link( 'keyword' ) |
get_post_custom_values( $key, $post_id ) | 有时自定义字段会存储外部链接,此函数可获取。 | get_post_custom_values( 'external_url', 42 ) |
2. 操作链接的函数(常用于插件/主题)
| 函数名 | 说明 |
|---|---|
add_rewrite_rule( $regex, $query, $after ) | 添加自定义重写规则。这是最强大的函数,用于将自定义URL模式映射到WordPress的查询变量。 |
add_rewrite_tag( $tag, $regex ) | 添加自定义重写标签(如 %movie%),以便在固定链接结构中使用。 |
add_rewrite_endpoint( $name, $places ) | 为URL添加端点(如 trackback/, edit/)。 |
flush_rewrite_rules( $hard ) | 刷新重写规则。在主题或插件激活时,或修改了规则后,必须调用此函数来重新生成规则。 |
二、核心控制文件
这些是WordPress核心中处理固定链接逻辑的文件。
| 文件路径 | 说明 |
|---|---|
wp-includes/link-template.php | 链接相关函数的定义文件。包含了 get_permalink(), home_url(), site_url() 等绝大多数获取链接的函数的实现。 |
wp-includes/rewrite.php | 重写规则的核心引擎。定义了 WP_Rewrite 类,负责生成、存储和匹配重写规则。这是固定链接系统的“大脑”。 |
wp-admin/options-permalink.php | 后台 “设置” > “固定链接” 页面的控制文件。处理用户在该页面的表单提交和保存操作。 |
wp-includes/class-wp-query.php | 主查询类。它将URL解析后的查询变量(如 p=123 或 category_name=news)转换为实际的数据库查询,从而决定显示什么内容。 |
三、数据存储位置
重写规则 (Rewrite Rules):
存储在数据库的
wp_options表中,option_name为rewrite_rules。这是一个序列化(serialized)的数组。注意:这是一个缓存。每次你更改固定链接结构或调用
flush_rewrite_rules()时,它都会重新生成。固定链接结构 (Permalink Structure):
permalink_structure:文章和页面的基本结构。category_base:分类目录的前缀。tag_base:标签的前缀。同样存储在
wp_options表中。option_name:
四、实战示例:添加一个自定义重写规则
假设你想创建一个URL如 /movies/star-wars/ 来显示一个关于“星球大战”的特定页面。
##在主题的 functions.php 中添加规则和刷新逻辑:
function my_custom_rewrite_rule() { // 添加规则:将 /movies/{movie_name}/ 映射到一个查询变量 add_rewrite_rule( '^movies/([^/]+)/?$', // 正则表达式:匹配 URL 'index.php?pagename=movies&movie_name=$matches[1]', // 对应的内部查询 'top' // 将其置于规则列表的顶部(优先级高) ); // 注册 `movie_name` 为一个自定义查询变量,这样WordPress才能识别它 add_rewrite_tag( '%movie_name%', '([^&]+)' ); } add_action( 'init', 'my_custom_rewrite_rule' ); // 插件/主题激活时刷新规则(只做一次!) function my_plugin_activate() { my_custom_rewrite_rule(); flush_rewrite_rules(); } register_activation_hook( __FILE__, 'my_plugin_activate' ); // 停用时清理(可选,但是好习惯) function my_plugin_deactivate() { flush_rewrite_rules(); } register_deactivation_hook( __FILE__, 'my_plugin_deactivate' );
##在模板中处理查询: 在你的 page-movies.php 模板或通过 template_include 过滤器,你可以获取并利用这个自定义变量:
$movie_name = get_query_var( 'movie_name' );
if ( $movie_name ) {
// 根据 $movie_name 做一些事情,比如从自定义字段获取数据
echo "You are viewing information about: " . esc_html( $movie_name );
}
总结与最佳实践
永远使用API函数:不要手动拼接URL,始终使用
get_permalink()等函数,以确保与所有设置兼容。谨慎刷新规则:
flush_rewrite_rules()是一个昂贵的操作,绝不要在每次页面加载时都执行。只在插件/主题激活或设置更改时执行一次。调试技巧:使用插件如 Rewrite Rules Inspector 来查看当前生效的所有重写规则,这对于调试自定义规则非常有用。
性能:重写规则匹配是一个顺序过程。将最具体、最常用的规则放在顶部(使用
'top'参数)以提高效率。
天天下载Ttzip
2026-01-24
非常全,感谢分享
匿名
2025-12-13
大大可以找下哈狗的1030吗,太想要那首歌了~谢谢!
匿名
2025-11-09
https://collaigo.com 免费在线拼图工具
匿名
2025-10-22
盖楼盖楼!
匿名
2025-08-11
沙发沙发
匿名
2025-08-10
https://at.oiik.cn/bing.html