ID поста вместо имени (ярлыка) в ЧПУ для типа записи — «тип_записи/ID»

Допустим, при регистрации типа записи orders с помощью register_post_type() параметр rewrite = false - правила перезаписи не создаются и их нужно создать вручную.

URL должен выглядеть как example.com/orders/123, где 123 - ID записи.

add_action( 'init', function(){

	// создам правила ЧПУ
	add_rewrite_tag( '%order_id%', '([0-9]+)', "post_type=orders&p=" );

	// или можно так
	// создам правила ЧПУ - тут 'order/([0-9]+)/?$' полностью совпадает с тем что
	// создало бы add_permastruct() и поэтому заменяет...
	//add_filter( 'orders'.'_rewrite_rules', function( $rules ){
	//  return array( 'order/([0-9]+)/?$' => 'index.php?post_type=orders&p=$matches[2]' );
	//} );

	// регистрируем структуру для типа записи
	add_permastruct( 'orders', 'order/%order_id%', array(
		'with_front'  => false,
		'paged'       => false,
		'feed'        => false,
		'forcomments' => false,
		'walk_dirs'   => false,
		'endpoints'   => false,
	));

	// заменим тег в URL на 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 );
	}

} );

Эта заметка встроена в: WP_Rewrite{}