WPSEO_Utils::sanitize_url()public staticYoast 1.8.0

Sanitize a url for saving to the database. Not to be confused with the old native WP function.

Метод класса: WPSEO_Utils{}

Хуков нет.

Возвращает

Строку.

Использование

$result = WPSEO_Utils::sanitize_url( $value, $allowed_protocols, fooo ] );
$value(строка) (обязательный)
String URL value to sanitize.
$allowed_protocols(массив)
Optional set of allowed protocols.
По умолчанию: [ foo
fooo ] (обязательный)
-

Список изменений

С версии 1.8.0 Введена.

Код WPSEO_Utils::sanitize_url() Yoast 22.4

public static function sanitize_url( $value, $allowed_protocols = [ 'http', 'https' ] ) {

	$url   = '';
	$parts = wp_parse_url( $value );

	if ( isset( $parts['scheme'], $parts['host'] ) ) {
		$url = $parts['scheme'] . '://';

		if ( isset( $parts['user'] ) ) {
			$url .= rawurlencode( $parts['user'] );
			$url .= isset( $parts['pass'] ) ? ':' . rawurlencode( $parts['pass'] ) : '';
			$url .= '@';
		}

		$parts['host'] = preg_replace(
			'`[^a-z0-9-.:\[\]\\x80-\\xff]`',
			'',
			strtolower( $parts['host'] )
		);

		$url .= $parts['host'] . ( isset( $parts['port'] ) ? ':' . intval( $parts['port'] ) : '' );
	}

	if ( isset( $parts['path'] ) && strpos( $parts['path'], '/' ) === 0 ) {
		$path = explode( '/', wp_strip_all_tags( $parts['path'] ) );
		$path = self::sanitize_encoded_text_field( $path );
		$url .= str_replace( '%40', '@', implode( '/', $path ) );
	}

	if ( ! $url ) {
		return '';
	}

	if ( isset( $parts['query'] ) ) {
		wp_parse_str( $parts['query'], $parsed_query );

		$parsed_query = array_combine(
			self::sanitize_encoded_text_field( array_keys( $parsed_query ) ),
			self::sanitize_encoded_text_field( array_values( $parsed_query ) )
		);

		$url = add_query_arg( $parsed_query, $url );
	}

	if ( isset( $parts['fragment'] ) ) {
		$url .= '#' . self::sanitize_encoded_text_field( $parts['fragment'] );
	}

	if ( strpos( $url, '%' ) !== false ) {
		$url = preg_replace_callback(
			'`%[a-fA-F0-9]{2}`',
			static function ( $octects ) {
				return strtolower( $octects[0] );
			},
			$url
		);
	}

	return esc_url_raw( $url, $allowed_protocols );
}