自定义发布类型URL重写%s

时间:2013-10-22 作者:Philip Benton

我将尝试并总结我正在努力实现的目标。。。

基本上,我有一个名为“marketing\\u list”的自定义帖子类型,它将有一个自定义字段,用于保存与可供购买的营销列表相关的信息。

每个营销列表将属于一个类别(自定义分类法)。

因此,当前我的URL如下所示:

  • /marketing-lists -> 存档页面/marketing-lists/post-slug -> 单一营销列表条目/marketing-lists/category/category-slug -> 自定义分类法我想要实现的是:

    • /marketing-lists -> 存档页面,但在管理员中可编辑,以防客户端想要更新文本,如页面
    • /marketing-lists/category-slug -> 自定义分类法/marketing-lists/category-slug/post-slug -> 单条目
    除此之外,我还想创建一些以/marketing-lists i、 e类

    • /marketing-lists/consumer-marketing-lists -> 单页/marketing-lists/business-marketing-lists -> 单页
    这有可能吗?也许他们是实现这一目标的更好方式?

2 个回复
SO网友:Matthew Boynes

你的大部分问题相当简单,以前在这里已经讨论过很多次了。我还在波特兰WordCamp做了一个关于这个主题的演讲,你可以watch, download slides, code, etc. here.

你问题的最后一部分,

在此基础上,我想创建一些额外的页面,这些页面有一个/营销列表的基础,即

/营销列表/消费者营销列表->单页/营销列表/企业营销列表->单页

。。。有点棘手。If there will only be a few and they won\'t often change, 我可以看到您有两个选择:

将特定的重写规则添加到堆栈顶部以解决这些问题,使其成为分类术语(您从不将其用作分类术语),并利用template hierarchy 随你的便

function wpse_119673_rewrite_rules() {
    add_rewrite_rule( \'marketing-lists/(consumer-marketing-lists|business-marketing-lists)/?\', \'index.php?pagename=$matches[1]\', \'top\' );
}
add_action( \'init\', \'wpse_119673_rewrite_rules\' );
请参见add_rewrite_rule 供参考。

另一方面,如果,you\'ll have many of these pages and you need to create them on a whim, 这变得更加困难。从本质上讲,您将有一个重要的重写冲突,您需要在每个匹配查询中对此进行说明。Here\'s another question 这与您的非常不同,但我在回答中解释了重写冲突(搜索“check\\u rewrite\\u conflicts”)。在这个答案中,对于每个存在“state”的查询,我都会检查它是否应该是一个页面。这是一个额外的数据库查询,我建议不要这样做。

SO网友:gmazzap

您所要求的permalink结构中有问题的部分是permalinks,如

/marketing-lists/{$something}/
有时候$something 应该是一个类别,有时是一个页面标记。

因此,要使其正常工作,您应该运行数据库查询以了解$something 是,这会降低性能

之后,如果urlexample.com/marketing-lists/viral-marketing 你有一页写着slugviral-marketing 和一个带有slug的类别viral-marketing WordPress应该显示什么,页面还是类别存档?

即使运行db查询,您也会找到一个页面和一个包含该段代码的类别,那么谁会赢呢?

此外,使用标准的WordPress重写规则,您的工作将非常困难。。。因为会发生很多冲突。

我开发了一个插件,Clever Rules 可以为您的任务提供很大帮助,但是,同样,没有db查询是不可能的/marketing-lists/ 是一个页面slug或一个类别。。。

使用该插件,该代码应该可以工作,但它需要db查询,如果发生冲突,page slug将获胜:

/*
 * Plugin Name: My Custom Rules
 */

add_action(\'plugins_loaded\', \'register_my_rules\');
add_filter(\'skip_clever_rule\', \'rule_pages_for_pages\', 20, 3);

function register_my_rules() {

    if ( ! function_exists(\'register_clever_rule\') ) return;

    $args = array( \'id\' => \'rule_pages\',\'route\' => \'/marketing-lists/%s\');
    register_clever_rule( $args )->query(\'pagename=[0]\')->priority(1);

    $args = array( \'id\' => \'rule_cats\',\'route\' => \'/marketing-lists/%s\');
    register_clever_rule( $args )->query(\'category_name=[0]\')->priority(2);

    $args = array( \'id\' => \'rule_singles\',\'route\' => \'/marketing-lists/%s/%s/\');
    register_clever_rule( $args )->query(\'name=[1]\');

}

function rule_pages_for_pages( $skip, $rule, $pieces ) {
  if ( $rule[\'args\'][\'id\'] === \'rule_pages\' ) {
    global $wpdb;
    $pages = $wpdb->get_col("SELECT post_name FROM $wpdb->posts WHERE post_type = \'page\' AND post_status = \'publish\'");
    if ( ! in_array( $pieces[1], $pages ) ) $skip = true;
  }
  return $skip;
}
请注意,该代码位于plugin 而且不能在主题中工作。

结束

相关推荐

Illegal characters in URLs

我有一些旧的永久链接(帖子、页面、标签),其中现在包含非法字符,这些已经不起作用了。在之前的WP版本中,允许使用非拉丁字符,但在新版本中有所改变。有没有办法从这些永久链接中清除数据库(将它们转换为允许的格式)?