wordpress控制固定链接相关函数或者相关文件

wordpress控制固定链接相关函数或者相关文件

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)转换为实际的数据库查询,从而决定显示什么内容。

三、数据存储位置

  1. 重写规则 (Rewrite Rules)

    • 存储在数据库的 wp_options 表中,option_name 为 rewrite_rules。这是一个序列化(serialized)的数组。

    • 注意:这是一个缓存。每次你更改固定链接结构或调用 flush_rewrite_rules() 时,它都会重新生成。

  2. 固定链接结构 (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 ); }

总结与最佳实践

  1. 永远使用API函数:不要手动拼接URL,始终使用 get_permalink() 等函数,以确保与所有设置兼容。

  2. 谨慎刷新规则flush_rewrite_rules() 是一个昂贵的操作,绝不要在每次页面加载时都执行。只在插件/主题激活设置更改时执行一次。

  3. 调试技巧:使用插件如 Rewrite Rules Inspector 来查看当前生效的所有重写规则,这对于调试自定义规则非常有用。

  4. 性能:重写规则匹配是一个顺序过程。将最具体、最常用的规则放在顶部(使用 'top' 参数)以提高效率。

THE END
喜欢就支持以下吧
点赞 0
评论 抢沙发
友好交流,请勿发纯表情,请勿灌水,会被封号喔
提交