我正在从事一个有几种自定义帖子类型的项目,其中一种帖子类型自然(但实际上不是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
过滤器——即在实例化主查询之前进行检查各种WP\\u查询过滤器——即通过添加post-meta约束使WP\\u查询为我进行检查我意识到这是一个相当开放的问题,可能是一个品味的问题,但如果能深入了解最有效的代码和数据库处理方式,我将不胜感激。谢谢
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