Post ID instead of the slug in the Friendly URL for the post type – “post_type_/ID”
Suppose, when registering the post type orders using register_post_type() parameter rewrite = false - the rewrite rules are not created and must be generated manually.
The URL should look like example.com/orders/123, where 123 is the post ID.
add_action( 'init', function(){
// Create friendly URL rules
add_rewrite_tag( '%order_id%', '([0-9]+)', "post_type=orders&p=" );
// or you can do it this way
// create CNC rules - here 'order/([0-9]+)/?$' is exactly
// the same as what add_permastruct() would create and so it replaces...
//add_filter( 'orders'.'_rewrite_rules', function( $rules ){
// return array( 'order/([0-9]+)/?$' => 'index.php?post_type=orders&p=$matches[2]' );
//} );
// register the structure for the post type
add_permastruct( 'orders', 'order/%order_id%', array(
'with_front' => false,
'paged' => false,
'feed' => false,
'forcomments' => false,
'walk_dirs' => false,
'endpoints' => false,
) );
// Replace the slug in the URL with an ID
add_filter( 'post_type_link', 'orders_permalink', 1, 2 );
function orders_permalink( $permalink, $post ){
if( false === strpos( $permalink, '%order_id%' ) ){
return $permalink;
}
return str_replace( '%order_id%', $post->ID, $permalink );
}
} );—
Note embeded into: WP_Rewrite{}