WordPress自定义帖子类型永久链接作为帖子ID(多个CPT)

时间:2018-03-17 06:09:07

标签: wordpress url-rewriting custom-post-type

我在一个网站上为一个有多个年龄段的运动队工作。我创建了两种自定义帖子类型(团队和玩家),并希望通过post_id链接到每种类型的CPT,而不是通过永久链接发布的帖子名称。

我在网上发现了一些代码以使永久链接适应post_id,但是尽管将post_type传递给了函数,我认为它只能调整cpt,它会调整每个 cpt - 因此,尽管选择仅更改团队固定链接,但它会将团队和玩家固定链接更改为团队/ 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外,这打破了所有永久链接。

1 个答案:

答案 0 :(得分:0)

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