WordPress 是可以自定义文章的连接的,可是有些文章我们想通过文章的 ID 直接访问,而不是通过 post_name 去访问,比如自定义的分类里面的文章,比如我们有一篇文章的 ID 为 30041,自定义分类为 group,那么如何通过这样的 https://www.cdsy.com.cn/group/30041.html 链接访问文章。
如果熟悉了 WordPress 的重写规则,那么很简单:
add_action('generate_rewrite_rules', 'wj_rewrite_rules' );
function wj_rewrite_rules( $wp_rewrite ){
$new_rules = array(
'group/topic-([0-9]+)?.html
上面的重写规则中正则表达式 [0-9] 即匹配数字,在主题的 functions.php 中添加上面的代码即可,如果你需要其它类型的 URL 重写规则,你可以自己编写上面的正则表达式。
然而我们从通过模板输出的链接,或者通过后台点击查看文章,发现链接还是 https://www.cdsy.com.cn/group/post_name,那么需要在主题中添加下面的代码:
add_filter('post_type_link', 'wj_group_link', 1, 3); //过滤器post_type_link即输出链接的时候用
function wj_group_link( $link, $post = 0 ){
if ( $post->post_type == 'group' ){ //判断如果是book类型的文章
return 'https://www.cdsy.com.cn/group/topic-'.$post->ID .'html'; //返回一个正确的链接
} else {
return $link;
}
}
即可输出正确的链接,然而教程到了这里,还没进入正题:重写标签。上面两个代码知识为了熟悉一下重写规则的使用。
重写标签
重写标签在 WordPress 后台 -> 设置 -> 固定连接 里面用到的 %post_id%,%post_name% 之类的就是重写标签了,我们前面也说过,WordPress 后台设置的固定链接格式是会保存到数据库中的 wp_options 表中,重写标签的主要作用也就是用来建立一个固定链接格式。
上面添加的段代码,完全可以用下面的一段代码来代替:
add_action('init', 'wj_group_rewrite');
function wj_group_rewrite() {
global $wp_rewrite;
$queryarg = 'post_type=book&p=';
$wp_rewrite->add_rewrite_tag('%topic_id%', '([^/]+)', $queryarg);
//这里的%topic_id%就是重写标签,第二个参数为匹配这个标签的正则表达式,第三个参数这个标签匹配的翻译规则
$wp_rewrite->add_permastruct('group', '/group/topic-%topic_id%.html', false);
//add_permastruct 是往数据库中保存一个固定链接格式,第一个参数为名称
}
add_filter('post_type_link', 'wj_group_permalink', 1, 3);
function wj_group_permalink($post_link, $post = 0) {
global $wp_rewrite;
if ( $post->post_type == 'book' ){ //判断文章类型
if ( is_wp_error( $post ) )
return $post;
$newlink = $wp_rewrite->get_extra_permastruct('book'); //获取前面保存的名为book的固定链接格式
$newlink = str_replace("%post_id%", $post->ID, $newlink); //将格式里面的重写标签替换为文章ID
$newlink = home_url(user_trailingslashit($newlink)); //完整的链接地址
return $newlink; //返回
} else {
return $post_link;
}
}
上面的代码中,输出连接就不用解释了。当访客访问地址 https://www.cdsy.com.cn/group/topic-30041.html,这个地址刚好匹配了名为 group 的固定连接格式,而这个格式里面的标签 %topic_id% 是要翻译成 post_type=book&p= 的,所以翻译为 https://www.cdsy.com.cn/?post_type=group&p=30041 这样就能正确翻译了。所以上面的 add_rewrite_tag 和 add_permastruct 两个函数组合的效果和使用函数添加重写的规则。
=> 'index.php?post_type=group&p=$matches[1]',
'top'
);
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
}
上面的重写规则中正则表达式 [0-9] 即匹配数字,在主题的 functions.php 中添加上面的代码即可,如果你需要其它类型的 URL 重写规则,你可以自己编写上面的正则表达式。
然而我们从通过模板输出的链接,或者通过后台点击查看文章,发现链接还是 https://www.cdsy.com.cn/group/post_name,那么需要在主题中添加下面的代码:
add_filter('post_type_link', 'wj_group_link', 1, 3); //过滤器post_type_link即输出链接的时候用
function wj_group_link( $link, $post = 0 ){
if ( $post->post_type == 'group' ){ //判断如果是book类型的文章
return 'https://www.cdsy.com.cn/group/topic-'.$post->ID .'html'; //返回一个正确的链接
} else {
return $link;
}
}
即可输出正确的链接,然而教程到了这里,还没进入正题:重写标签。上面两个代码知识为了熟悉一下重写规则的使用。
重写标签在 WordPress 后台 -> 设置 -> 固定连接 里面用到的 %post_id%,%post_name% 之类的就是重写标签了,我们前面也说过,WordPress 后台设置的固定链接格式是会保存到数据库中的 wp_options 表中,重写标签的主要作用也就是用来建立一个固定链接格式。
上面添加的段代码,完全可以用下面的一段代码来代替:
add_action('init', 'wj_group_rewrite');
function wj_group_rewrite() {
global $wp_rewrite;
$queryarg = 'post_type=book&p=';
$wp_rewrite->add_rewrite_tag('%topic_id%', '([^/]+)', $queryarg);
//这里的%topic_id%就是重写标签,第二个参数为匹配这个标签的正则表达式,第三个参数这个标签匹配的翻译规则
$wp_rewrite->add_permastruct('group', '/group/topic-%topic_id%.html', false);
//add_permastruct 是往数据库中保存一个固定链接格式,第一个参数为名称
}
add_filter('post_type_link', 'wj_group_permalink', 1, 3);
function wj_group_permalink($post_link, $post = 0) {
global $wp_rewrite;
if ( $post->post_type == 'book' ){ //判断文章类型
if ( is_wp_error( $post ) )
return $post;
$newlink = $wp_rewrite->get_extra_permastruct('book'); //获取前面保存的名为book的固定链接格式
$newlink = str_replace("%post_id%", $post->ID, $newlink); //将格式里面的重写标签替换为文章ID
$newlink = home_url(user_trailingslashit($newlink)); //完整的链接地址
return $newlink; //返回
} else {
return $post_link;
}
}
上面的代码中,输出连接就不用解释了。当访客访问地址 https://www.cdsy.com.cn/group/topic-30041.html,这个地址刚好匹配了名为 group 的固定连接格式,而这个格式里面的标签 %topic_id% 是要翻译成 post_type=book&p= 的,所以翻译为 https://www.cdsy.com.cn/?post_type=group&p=30041 这样就能正确翻译了。所以上面的 add_rewrite_tag 和 add_permastruct 两个函数组合的效果和使用函数添加重写的规则。