post_status || 'attachment' === $post->post_type ) { return null; } $type = get_post_type_object( (string) $post->post_type ); if ( null === $type || empty( $type->public ) ) { return null; } $permalink = get_permalink( $post ); if ( ! is_string( $permalink ) || '' === $permalink ) { return null; } return $this->relativePath( (string) ( wp_parse_url( $permalink, PHP_URL_PATH ) ?? '/' ) ); } /** * Адрес экрана редактора для записи. * * @param \WP_Post|int $post Запись или её id. * @param string|null $locale Язык перевода; по умолчанию — первый дополнительный. * @return string|null null, если запись открыть нельзя. */ public function urlForPost( $post, ?string $locale = null ): ?string { $path = $this->pathForPost( $post ); if ( null === $path || ( null === $locale && array() === $this->settings->secondary() ) ) { return null; } return $this->urlForPath( $path, $locale ); } /** * Адрес экрана редактора для пути. * * @param string $path Путь без языкового префикса. * @param string|null $locale Язык перевода; по умолчанию — первый дополнительный. */ public function urlForPath( string $path, ?string $locale = null ): string { if ( null === $locale ) { $locale = (string) array_key_first( $this->settings->secondary() ); } return add_query_arg( array( 'page' => EditorPage::MENU_SLUG, 'lingocanvas_locale' => $locale, 'lingocanvas_path' => $path, ), admin_url( 'admin.php' ) ); } /** * Путь адреса (без строки запроса) в виде, который принимает редактор: * без базового пути установки и без языкового префикса. * * @param string $urlPath Путь из адреса сайта. */ public function relativePath( string $urlPath ): string { return $this->urls->stripPrefix( LanguageResolver::relativePath( $urlPath, LanguageResolver::basePath() ) ); } /** * Нормализует ввод пользователя: полный адрес или путь. Чистое правило * `EditorPage::pathFromUrl()` для адресов; путь без хоста считается * относящимся к самой установке. * * @param string $input Адрес (`https://…`) или путь (`/about/`). */ public function normalizeInput( string $input ): string { if ( 1 === preg_match( '#^https?://#i', $input ) ) { return EditorPage::pathFromUrl( $input, LanguageResolver::basePath(), $this->urls->knownSlugs(), UrlConverter::homeHost() ); } $path = (string) ( wp_parse_url( $input, PHP_URL_PATH ) ?? '/' ); // Сначала базовый путь установки (по границе сегмента: `/blog-post/` не трогаем), потом языковой префикс. $relative = LanguageResolver::relativePath( '/' . ltrim( $path, '/' ), LanguageResolver::basePath() ); return '/' . ltrim( $this->urls->stripPrefix( $relative ), '/' ); } }