Wordpress Url 使用多个参数和模板重写 - 动态 Path/Parameter 放置

Wordpress Url Rewrite with Multiple Parameters and Templates - Dynamic Path/Parameter Placement

当我们有由参数分隔的标记时,我们在计算 WP URL 重写规则时遇到了一些麻烦。简而言之,我们希望用户页面和视频库采用以下通用格式:

/users/steve/videos/2

...其中“用户”是 PHP 显示用户详细信息的页面模板。所以如果我们去:

/users/steve/

...我们看到史蒂夫的主页。如果我们去:

/users/steve/videos/

...我们点击了视频库的页面模板,我们看到了史蒂夫的视频列表。如果我们去:

/users/steve/videos/2

...我们点击了第三个页面模板,即视频播放器页面,我们在其中看到显示了视频 ID 2。

所以我们有三个独立的页面模板,我们希望它们之间的子/父关系是用户页面 -> 视频库页面 -> 视频播放器页面,用于我们的面包屑显示。

我们想不通的是“steve”和“2”实际上是插入url的参数,打断了parent/child的标记关系。其次,对于视频播放器,实际上根本没有映射到视频播放器页面模板的标记。只是“视频”标记的存在加上告诉我们这映射到视频播放器页面模板的附加数字参数。

作为替代方案,我们已经找到了让 /users/videos/steve/2 正常工作的方法。我们已将此重写规则添加到子主题的 functions.php 文件中:

add_rewrite_rule(
    '^users/videos/([^/]*)/([^/]*)/?',
    'index.php?pagename=users/videos&users_filter_name=$matches[1]&user_video_id=$matches[2]',
    'top');

(我们还定义了变量“users_filter_name”和“user_video_id”,我们在模板中成功解析了它们)

但是因为我们真正想要的是 /users/steve/videos/2 我们尝试将规则更新为:

add_rewrite_rule(
    '^users/([^/]*)/videos/([^/]*)/?',
    'index.php?pagename=users/videos&users_filter_name=$matches[1]&user_video_id=$matches[2]',
    'top');

这似乎没有用(它只是加载了“/users/”页面)所以我们显然做错了。通过这种结构可以实现我们想要的吗?

谢谢!

/users/steve/videos/2/格式的link结构对于Wordpress来说不是问题,其实你写的代码都是对的,只是某处有个小错误。

很可能您在向 query_vars 添加新变量的代码部分遇到了问题。 也许您在为时已晚的操作中添加了第二个变量。 当 Wordpress 看到一个晦涩的变量时,它的行为通常与您描述的一样。

尝试删除所有代码并将其复制到 functions.php 顶部

add_rewrite_rule(
'^users/([^/]*)/videos/([^/]*)/?',
'index.php?pagename=users/videos&users_filter_name=$matches[1]&user_video_id=$matches[2]',
'top');

add_filter( 'query_vars', function( $vars ){
    $vars[] = 'users_filter_name';
    $vars[] = 'user_video_id';
    return $vars;
} );

如果还是不行,试试把代码改成这样

add_rewrite_rule(
'^users/([^/]*)/videos/([^/]*)/?',
'index.php?page_id=54&users_filter_name=$matches[1]&user_video_id=$matches[2]',
'top');

add_filter( 'query_vars', function( $vars ){
    $vars[] = 'users_filter_name';
    $vars[] = 'user_video_id';
    return $vars;
} );

其中 54 = 您的页面 ID

每次更改后,您必须转到设置并转动 off/on permalinks 以重置缓存

我在我的演示中测试了这段代码,它 100% 有效。