При создании нового типа постов функцией register_post_type()
за формирование url в основном отвечает аргумент rewrite
. Например, при регистрации типа записи project, по умолчанию в этом параметре отображается название типа записи:
http://site.loc/project/project-example/
В параметре rewrite
можно указывать плейсхолдеры типа %category%. Но их нужно создать с помощью add_rewrite_tag()
и научить WP их понимать.
Чтобы вместо project-example, в url отображался текущий id записи, добавим:
'rewrite' => array( 'slug' => 'projects' )
И допишем необходимые правила реврайтов в functions.php
// Rewrite permalink structure
function projects_rewrite() {
global $wp_rewrite;
$queryarg = 'post_type=project&p=';
$wp_rewrite->add_rewrite_tag( '%cpt_id%', '([^/]+)', $queryarg );
$wp_rewrite->add_permastruct( 'projects', '/projects/%cpt_id%/', false );
}
add_action( 'init', 'projects_rewrite' );
function projects_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( 'projects' );
$newlink = str_replace( '%cpt_id%', $post->ID, $newlink );
$newlink = home_url( user_trailingslashit( $newlink ) );
return $newlink;
}
add_filter('post_type_link', 'projects_permalink', 1, 3);
Не забудьте пересохранить пермалинки в разделе Настройки -> Постоянные ссылки.
Теперь ссылка на проект будет выглядеть так:
http://site.loc/project/10/
За решение спасибо: stackoverflow.com/questions/25199501/wordpress-custom-type-append-post-id-at-the-end