Как изменить префикс ЧПУ для типа записи post
Если изменить префикс для деволтного типа записей post в админке, то он будет влиять и на другие структуры ЧПУ.
Пример ниже показыает, как изменить префикс только у типа записи post. А также там показано как изменить rewrite параметры для создаваемых типов записей, когда нет возможности указать параметр rewrite
при регистрации типа записи (например тип записи регается в плагине).
/** * Changes post type permalink. */ final class Kama_Change_Post_Permalink { public const POST_PERMALINK_PREFIX = 'media/news-archive'; public const CPT_REWRITES = [ 'foo' => [ 'slug' => "media/news-archive/%foo%", ], 'reports' => [ 'slug' => "our-reports/%reports%", 'with_front' => false, ], ]; public static function init(): void { self::change_post_permalink(); add_filter( 'register_post_type_args', [ __CLASS__, '_cpt_rewrite_args' ], 10, 2 ); } /** * Change 'post' post type permalink. * Applies for 'post' post type only. * * @return void */ private static function change_post_permalink(): void { add_filter( 'post_rewrite_rules', [ __CLASS__, '_post_rewrite_rules' ] ); add_filter( 'pre_post_link', [ __CLASS__, '_post_type_link' ], 10, 3 ); } public static function _post_type_link( $permalink, $post, $leavename ) { $permalink = '/' . self::POST_PERMALINK_PREFIX . $permalink; return $permalink; } public static function _post_rewrite_rules( $rules ) { $new_rules = []; foreach ( $rules as $regex => $rule ) { $new_rules[ self::POST_PERMALINK_PREFIX . "/$regex" ] = $rule; } return $new_rules; } public static function _cpt_rewrite_args( $args, $post_type ){ foreach ( self::CPT_REWRITES as $ptype => $rewrite ) { if( $post_type === $ptype ){ $args['rewrite'] = $rewrite; } } return $args; } }
Теперь вызываем этот класс:
Kama_Change_Post_Permalink ::init();