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

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