强制使用多个自定义帖子类型的规范URL

时间:2012-11-26 作者:Chris Carson

我正在从事一个有几种自定义帖子类型的项目,其中一种帖子类型自然(但实际上不是WordPress意义上的)是其他帖子类型的“父”。例如,假设我有一个名为“book”的自定义帖子类型和另一个名为“character”的自定义帖子类型,并假设我希望有以下自定义URL结构:

books/[book-name]/characters/[character-name]
因此,关于《帽子里的猫》一书中人物的帖子的规范URL应该是:

 books/cat-in-the-hat/characters/thing-one
字符与具有post meta行的书籍相关联。

我创建了自定义重写以使其正常工作。。。

add_rewrite_rule (
    \'^books/([^\\/]+)/characters/([^\\/]+)/?$\',
    \'index.php?book=$matches[1]&character=$matches[2]&post_type=character\'
);
。。。但我还需要确保URL中的“角色帖子”属于“书”。。。

books/cat-in-the-hat/characters/thing-one     //good
books/anna-karenina/characters/count-vronsky  //good
books/anna-karenina/characters/thing-one      //bad
这不会自动发生:我必须挂接一个过滤器或一个操作来检查字符是否与书匹配,如果不匹配,则重定向到正确的规范URL或强制使用404。

完成这项检查的最佳地点是哪里?到目前为止,我的选择是:

request 过滤器——即在实例化主查询之前进行检查我意识到这是一个相当开放的问题,可能是一个品味的问题,但如果能深入了解最有效的代码和数据库处理方式,我将不胜感激。谢谢

1 个回复
SO网友:codearachnid

我解决了subordinate post types 具有类似的风格,但在规范url方面没有那么严格;然而,我在deeplinking custom中遇到了类似的情况WooCommerce product type 链接。

我利用了template_redirect 如果404与路线和post_type_link 确保规范链接和所有the_permalink()get_permalink() 引用与预期链接匹配。

我建议您如何处理这一问题:

add_action( \'template_redirect\', \'wp20140320_template_redirect\' );
public function wp20140320_template_redirect(){
    global $wp_query, $post;

    // the character post type has the book id set as meta?
    // or could set as post_parent if you don\'t have characters heirarchical
    $book_id = get_post_meta( $post->ID, \'_book_id\', true );

    // compare_parent_slug_to_id to check required $book_id against set parent book slug
    if( $post->post_type == \'character\' && ! compare_parent_slug_to_id( $book_id ) ){

        // set is_404 since post type is character and parent slug does not match set
        $wp_query->is_404 = true;
        status_header(404);
        include get_404_template();
        exit; // maybe a better way to gracefully exit?

    }
}
修改自source

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post