更改分页的自定义帖子的URL结构

时间:2010-11-15 作者:matt

我有一个自定义的幻灯片帖子类型,可以创建分页帖子,每个幻灯片都是一个单独的页面。每张幻灯片的数据保存在自定义字段中,每张幻灯片都有一个标题集,标题集保存在带有键的自定义字段中slide{$i}-title ($i 例如,作为幻灯片编号slide1-title).

当前,每个后续页面的url是附加到post permalink的数字(这是分页页面url的标准格式),如下所示:http://example.com/post-title/2/ 第页/幻灯片2和http://example.com/post-title/3/ 第页/幻灯片3。

How can I change this so that each page\'s url is appended with the slide title instead of the incremental number?

例如:http://example.com/post-title/slide-2-title/ 第页/幻灯片2和http://example.com/post-title/slide-3-title/ 第页/幻灯片3。

1 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

修改URL结构通常由两部分组成:一部分修改用代码生成的URL,另一部分处理新结构的传入URL。我将重点讨论第二部分,可能是最不了解的部分。

传入的URL与不同的重写规则相匹配,这些规则是可以匹配URL的正则表达式。这些表达式可以具有捕获组,这些捕获组捕获URL的一部分以将其发送到不同的查询变量,这些查询变量(例如)用于构造数据库查询。如果创建自定义帖子类型slideshow, 其中一条重写规则如下所示:

slideshow/([^/]+)(/[0-9]+)?/?$
 => index.php?slideshow=$matches[1]&page=$matches[2]
这意味着我们匹配一个以slideshow/, 那么任何事情都不是/, 和(可选)的?) A./ 和任意位数。第一个匹配将发送到slideshow 查询变量,与page 变量例如slideshow/nature/2 会凝固slideshownaturepage2. 我写道a plugin that might be helpful in understanding and debugging your current rules.

您希望匹配以下结构slideshow/nature/slide-2-canyon/. 此的正则表达式如下所示:

slideshow/                                        // Start with \'slideshow/\'
          ([^/]+)                                 // Then anything that is not \'/\'
                 (/slide-                         // Then \'slide-\'
                         ([0-9]+)                 // A page number
                                 (-([^/]+))?      // Slide title: \'-\' and anything that is not \'/\'. Optional so you don\'t have to add it
                                            )?/?$ // Which could be followed by a \'/\'
我们要捕获幻灯片名称和页码。计算开头的“(”以获得匹配索引,因此我们的完整重写规则如下所示:

slideshow/([^/]+)(/slide-([0-9]+)(-([^/]+))?)?/?$
 => index.php?slideshow=$matches[1]&page=$matches[3]
现在,我们只需要将其添加到重写规则中。请确保将其放在顶部,因为类似的规则用于匹配帖子的附件,如果自定义规则位于列表底部,则永远不会命中。

add_rewrite_rule(
    \'slideshow/([^/]+)(/slide-([0-9]+)(-([^/]+))?)?/?$\',
    \'index.php?slideshow=$matches[1]&page=$matches[3]\',
    \'top\'
);
只要打一次电话就够了,然后flush_rewrite_rules(). 或者,如果您不想弄乱插件激活挂钩,请调用add_rewrite_rule() 在每个init, 然后加载“Permalink”设置页面以刷新规则。只要不刷新每个页面加载上的规则,因为这是一个昂贵的计算。

只剩下生成新格式的页面链接了。wp_link_pages() 似乎没有提供任何过滤器来修改它的输出,所以我会研究它是如何工作的,并用你的页面格式复制它(这并不难,如果你只选择一种输出格式,你只需要一半的函数)。

结束

相关推荐