WordPress利用add_rewrite_rule()函数重写标签的路由地址 解决重写地址后的分页翻页问题

导语:叶子在为一位客户做开发的时候,需要用到WordPress的标签多重过滤功能,还要将动态地址重写为伪静态的地址,下面来看实现方法。

WordPress的多重筛选

WordPress提供原生态的多重筛选功能,实现方法如下面的链接。

使用标签和分类的名称作为筛选条件

http://wordpressleaf.com/?tag=shanghai,xian&category_name=accommodation,china-classic-tours

使用标签和分类的ID作为筛选条件

http://wordpressleaf.com/?tag_id=4,6&cat=8,9

并集结果的筛选形式

以上的链接是进行了OR的操作,如果需要结果同时匹配多个条件进行AND的操作,请看下面的链接。

http://wordpressleaf.com/?tag_id=4+6&cat=8+9

以上是叶子的一点心得,其他的请自行摸索。

重写路径

叶子需要将地址重写,原地址如下:

http://wordpressleaf.com/?tag=shanghai,xian&category_name=accommodation

重写后的地址如下:

http://wordpressleaf.com/destination/shanghai,xian/accommodation

实现代码:

利用add_rewrite_rule函数来添加地址规则,添加完成后,需要刷新规则。

function wpdocs_flush_rules() {
    $rules = get_option( 'rewrite_rules' );

    if ( ! isset( $rules['destination/([0-9a-zA-Z\-_,]+)/([0-9a-zA-Z\-_,]+)?$'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    } 
    

    if ( ! isset( $rules['destination/([0-9a-zA-Z\-_,]+)/([0-9a-zA-Z\-_,]+)/page/?([0-9]{1,})/?$'] ) ) {
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    }
}
add_action( 'wp_loaded','wpdocs_flush_rules' );


function yct_add_rewrite_rules() {
	 add_rewrite_rule('destination/([0-9a-zA-Z\-_,]+)/([0-9a-zA-Z\-_,]+)/page/?([0-9]{1,})/?$',
   'index.php?tag=$matches[1]&category_name=$matches[2]&paged=$matches[3]',
   'top');
   add_rewrite_rule('destination/([0-9a-zA-Z\-_,]+)/([0-9a-zA-Z\-_,]+)?$',
   'index.php?tag=$matches[1]&category_name=$matches[2]',
   'top');

}
add_filter('init', 'yct_add_rewrite_rules');

重写路径后的翻页问题

叶子最开始的时候添加了一条规则,如下:

'destination/([0-9a-zA-Z\-_,]+)/([0-9a-zA-Z\-_,]+)?'

对应地址为:

http://wordpressleaf.com/destination/shanghai,xian/accommodation

然后发现它可以正常访问,分页函数可以正常输出分页,但是分页无法访问,无法获得paged的值,它的值总是为0。后来,通过查看get_option( ‘rewrite_rules’ )的结果,叶子意识到分页也需要添加规则,如下:

'destination/([0-9a-zA-Z\-_,]+)/([0-9a-zA-Z\-_,]+)/page/?([0-9]{1,})/?'

对应地址为:

http://wordpressleaf.com/destination/shanghai,xian/accommodation/page/2/

添加完成后,发现还是无法翻页,问题的表现和没有添加第二条规则的时候一模一样,经过思考,叶子认为两个原因导致了这个问题。

一、规则需要绝对匹配,于是叶子在规则结尾添加了$(美元)字符。

二、叶子认为WordPress匹配规则先后顺序,分页的规则应该在前面。

经过调整,翻页终于正常了,上面的源代码就是正常的代码,大家可以直接使用,无需调整。

结束

你学会了吗?参考文档:https://developer.wordpress.org/reference/classes/wp_rewrite/

发表评论

邮箱地址不会被公开。 必填项已用*标注