我正在为一支具有多个年龄段的运动队开发一个网站。我创建了两种自定义帖子类型(团队和玩家),并希望通过 post_id 链接到每种类型的 CPT,而不是通知永久链接的帖子名称。
我在网上找到了一些代码来使永久链接适应 post_id,但是尽管将 post_type 传递给函数(我认为这只会适应该 cpt),但它正在适应 every cpt - 所以尽管选择只更改团队永久链接,但它是将团队和玩家永久链接更改为“team/post_id”。
// Rewrite permalink structure
function teams_rewrite() {
global $wp_rewrite;
$queryarg = 'post_type=teams&p=';
$wp_rewrite->add_rewrite_tag( '%cpt_id%', '([^/]+)', $queryarg );
$wp_rewrite->add_permastruct( 'teams', '/teams/%cpt_id%/', false );
}
add_action( 'init', 'teams_rewrite' );
function teams_permalink( $post_link, $id = 0, $leavename ) {
global $wp_rewrite;
$post = &get_post( $id );
if ( is_wp_error( $post ) )
return $post;
$newlink = $wp_rewrite->get_extra_permastruct( 'teams' );
$newlink = str_replace( '%cpt_id%', $post->ID, $newlink );
$newlink = home_url( user_trailingslashit( $newlink ) );
return $newlink;
}
add_filter('post_type_link', 'teams_permalink', 1, 3);
两个 CPT 在其设置中都有自己的 $arg:
'rewrite'=> array( 'with_front' => false, 'slug' => 'players' )
'rewrite'=> array( 'with_front' => false, 'slug' => 'teams' )
更新 此外,我刚刚发现这会破坏除列出的团队 CPT 之外的所有永久链接。
function teams_permalink( $post_link, $id = 0, $leavename ) {
global $wp_rewrite;
$post = &get_post( $id );
if ( is_wp_error( $post ) || get_post_type($post) != 'teams')
return $post_link;
$newlink = $wp_rewrite->get_extra_permastruct( 'teams' );
$newlink = str_replace( '%cpt_id%', $post->ID, $newlink );
$newlink = home_url( user_trailingslashit( $newlink ) );
return $newlink;
}
add_filter('post_type_link', 'teams_permalink', 1, 3);
你能试试这个吗?所以在这里我添加了一个额外的检查,以确保新链接仅针对
teams
post_type 进行更新。
此外,您返回
$post
可能会导致一些问题,因为使用此过滤器的函数将需要一个字符串,因此我们现在返回 $post_link