Как изменить префикс ЧПУ для типа записи 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();

