Как изменить префикс ЧПУ для типа записи post и других типов записей
Если изменить префикс для дефолтного типа записей post
в админке, то он будет влиять и на другие структуры ЧПУ.
Пример ниже показывает, как изменить/добавить префикс в УРЛ только у типа записи post.
А также показано, как изменить rewrite параметры для создаваемых типов записей, когда нет возможности указать параметр rewrite
при регистрации типа записи (например, если тип записи регается в плагине).
/** * Changes post type permalink. */ final class Kama_Change_Post_Permalink { /** * `post` post type permalink prefix (without slashes at the edges). */ 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 ): string { return '/' . self::POST_PERMALINK_PREFIX . $permalink; } public static function _post_rewrite_rules( $rules ): array { $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 ): array { foreach ( self::CPT_REWRITES as $ptype => $rewrite ) { if( $post_type === $ptype ){ $args['rewrite'] = $rewrite; } } return $args; } }
Теперь вызываем этот класс:
Kama_Change_Post_Permalink::init();