WordPress重写规则的工作方式(有几个特殊的例外),不同的内容类型在其URL中有某种独特的元素,使WP能够在数据库中查找并查找之前识别它要查找的内容类型。例如,给定URL:
/topic/one/two/three/
你不能肯定地说
three
如果位置和主题共享相同,则为位置或主题
topic
根
这就是说,复杂的部分是您需要手动解决这种歧义。这有一个缺点——对于可能是主题的每个请求都需要对数据库进行额外的查询,这不是一个主要问题,但需要注意。
在最初的问题中,您表示希望删除自定义帖子类型基。我在这里给出的答案很有用topic
作为基础。移除会引发page
在整个组合中输入。你也许可以用这个解决方案来解决这个问题,但为了向你展示这个问题的最简单形式,我不打算这么做。
步骤1添加新的%parent_location%
重写将作为主题位置占位符的标记。这发生在init
按照规则采取行动:
add_rewrite_tag( \'%parent_location%\', \'(.+)\' );
第二步注册帖子类型。我将省去基本的东西,重点放在实现这一目标的具体部分。这一切都发生在
init
行动也是如此。添加这些规则后,不要忘记刷新重写规则。
对于位置,根段塞为topic
, 并且岗位类型是分级的。
$args = array(
\'rewrite\' => array( \'slug\' => \'topic\' ),
\'hierarchical\' => true,
// ... your other args
);
register_post_type( \'location\', $args );
对于主题,我们将
%parent_location%
重写slug中的标记。我们将使用它替换URL中的位置。这样生成的重写规则实际上永远不会匹配,但它使下一步更容易。
$args = array(
\'rewrite\' => array( \'slug\' => \'topic/%parent_location%\' ),
// ... your other args
);
register_post_type( \'topic\', $args );
步骤3将过滤器添加到
post_type_link
为我们的
%parent_location%
每当请求此主题的永久链接时,标记。看看评论,看看发生了什么。
function wpd_topic_link( $link, $post ) {
// if this is a topic post
if ( $post->post_type === \'topic\' ) {
// if there is location ID meta saved for this post under parent_location key
if( $location_id = get_post_meta( $post->ID, \'parent_location\', true ) ){
// query for that post to make sure it exists
$location_post = get_posts( array( \'post_type\' => \'location\', \'p\' => $location_id ) );
if( !empty( $location_post ) ){
// get the location permalink
// strip out everything except the location parts of the URL
// substitute that value for our %parent_location% placeholder
$location_link = get_permalink( $location_post[0] );
$location_path = untrailingslashit( str_replace( home_url( \'/topic/\' ), \'\', $location_link ) );
$link = str_replace( \'%parent_location%\', $location_path, $link );
}
}
}
return $link;
}
add_filter( \'post_type_link\', \'wpd_topic_link\', 20, 2 );
现在,当您添加一篇主题文章并在文章元中保存一个有效的位置ID时,您将在编辑该主题文章时看到URL中反映的路径。
步骤4过滤器request
查找对实际可能是主题的位置的任何请求。通读评论以了解发生了什么。这里要注意的另一个副作用是,你永远不会有一个位置弹头,这也是一个主题。
function wpd_locations_may_be_topics( $request ){
// if the location query var is set
if( isset( $request[\'location\'] ) ){
// location will be a parent / child hierarchy
// make it an array of URL segments
$parts = explode( \'/\', $request[\'location\'] );
// it might be a topic only if there\'s more than a single segment
if( count( $parts ) > 1 ){
$topic_slug = end( $parts );
$maybe_topic = get_posts( array( \'post_type\' => \'topic\', \'name\' => $topic_slug ) );
// if a topic was returned
if( !empty( $maybe_topic ) ){
// change request from location to topic
unset( $request[\'location\'] );
$request[\'post_type\'] = \'topic\';
$request[\'topic\'] = $topic_slug;
}
}
}
return $request;
}
add_filter( \'request\', \'wpd_locations_may_be_topics\' );