WordPress как на ладони

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