post_password; } /** * Die oeffentliche Adresse, nur wenn sie https ist. * * Aivor lehnt jede andere Adresse mit 400 auf den ganzen Callback ab * (technisches Konzept K8). * * @param \WP_Post $post Beitrag. * @return string Leer, wenn es keine https-Adresse gibt. */ public static function https_url( \WP_Post $post ): string { $url = (string) get_permalink( $post ); return 'https' === wp_parse_url( $url, PHP_URL_SCHEME ) ? $url : ''; } /** * Ob die Website selbst ueber https laeuft. * * @return bool */ public static function site_is_https(): bool { return 'https' === wp_parse_url( home_url(), PHP_URL_SCHEME ); } /** * Findet den Beitrag zu einer Adresse — nur mit Gegenprobe. * * Die Core-Funktion url_to_postid() liefert eine Behauptung, keinen Beweis. * Erweitert wird nur, wenn der Permalink des gefundenen Beitrags dieselbe * Adresse ergibt (technisches Konzept 8). Bei Plain Permalinks und * Post-Types ohne Rewrite-Regeln liefert url_to_postid() 0 — dann kommt die * Fassung als eigener Entwurf. * * @param string $url Gelieferte Adresse. * @return \WP_Post|null */ public static function find_by_url( string $url ): ?\WP_Post { // phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.url_to_postid_url_to_postid -- Kein VIP-Code; die Gegenprobe folgt. $post_id = url_to_postid( $url ); if ( $post_id <= 0 ) { return null; } $post = get_post( $post_id ); if ( ! $post instanceof \WP_Post ) { return null; } return self::normalize_url( (string) get_permalink( $post ) ) === self::normalize_url( $url ) ? $post : null; } /** * Normalisiert eine Adresse fuer den Vergleich. * * Ignoriert werden Schema, fuehrendes www., Gross-/Kleinschreibung des * Hosts, abschliessender Schraegstrich, Query und Fragment. * * @param string $url Adresse. * @return string */ public static function normalize_url( string $url ): string { $parts = wp_parse_url( $url ); if ( ! is_array( $parts ) || empty( $parts['host'] ) ) { return ''; } $host = strtolower( (string) $parts['host'] ); if ( str_starts_with( $host, 'www.' ) ) { $host = substr( $host, 4 ); } $path = isset( $parts['path'] ) ? rtrim( rawurldecode( (string) $parts['path'] ), '/' ) : ''; return $host . $path; } /** * Ob zwei Hosts zur selben Website gehoeren (www. und Gross-/Kleinschreibung egal). * * Aivor vergleicht auf Ebene der registrierbaren Domain (Public Suffix * List). Hier genuegt eine Naeherung, der Vergleich steuert nur einen * Warnhinweis: die letzten zwei Labels, bei zweistufigen Endungen unter * einer Laenderdomain (co.uk, com.au, or.at …) die letzten drei. * * @param string $first Erste Adresse. * @param string $second Zweite Adresse. * @return bool */ public static function same_site( string $first, string $second ): bool { $hosts = array(); foreach ( array( $first, $second ) as $url ) { $host = strtolower( (string) wp_parse_url( $url, PHP_URL_HOST ) ); if ( '' === $host ) { return true; } $labels = explode( '.', $host ); $keep = self::has_second_level_suffix( $labels ) ? 3 : 2; $hosts[] = implode( '.', array_slice( $labels, -$keep ) ); } return $hosts[0] === $hosts[1]; } /** * Ob der Host unter einer zweistufigen Endung wie co.uk oder com.au liegt. * * @param string[] $labels Labels des Hosts. * @return bool */ private static function has_second_level_suffix( array $labels ): bool { $count = count( $labels ); if ( $count < 3 || 2 !== strlen( $labels[ $count - 1 ] ) ) { return false; } return in_array( $labels[ $count - 2 ], array( 'co', 'com', 'net', 'org', 'gov', 'edu', 'ac', 'or', 'ne', 'go', 'gv', 'ltd', 'plc', 'sch', 'nic', 'mil' ), true ); } }