Files
WP-Content-Sync/src/Url/UrlMapping.php
T
2026-04-26 14:34:44 -05:00

85 lines
2.0 KiB
PHP

<?php
namespace WPContentSync\Url;
final class UrlMapping {
private string $source_url;
private string $destination_url;
public function __construct( string $source_url, string $destination_url ) {
$source_url = $this->normalizeUrl( $source_url );
$destination_url = $this->normalizeUrl( $destination_url );
if ( '' === $source_url || '' === $destination_url ) {
throw new \InvalidArgumentException( 'Source and destination URLs are required.' );
}
if ( ! $this->isAbsoluteUrl( $source_url ) || ! $this->isAbsoluteUrl( $destination_url ) ) {
throw new \InvalidArgumentException( 'Source and destination URLs must include a scheme and host.' );
}
$this->source_url = $source_url;
$this->destination_url = $destination_url;
}
public function sourceUrl(): string {
return $this->source_url;
}
public function destinationUrl(): string {
return $this->destination_url;
}
private function normalizeUrl( string $url ): string {
$url = trim( $url );
$parts = wp_parse_url( $url );
if ( ! is_array( $parts ) || ! isset( $parts['path'] ) || '/' !== $parts['path'] ) {
return $url;
}
unset( $parts['path'] );
return $this->buildUrl( $parts );
}
private function isAbsoluteUrl( string $url ): bool {
$parts = wp_parse_url( $url );
return is_array( $parts ) && ! empty( $parts['scheme'] ) && ! empty( $parts['host'] );
}
/**
* @param array<string, mixed> $parts URL parts.
*/
private function buildUrl( array $parts ): string {
$url = (string) $parts['scheme'] . '://';
if ( isset( $parts['user'] ) ) {
$url .= (string) $parts['user'];
if ( isset( $parts['pass'] ) ) {
$url .= ':' . (string) $parts['pass'];
}
$url .= '@';
}
$url .= (string) $parts['host'];
if ( isset( $parts['port'] ) ) {
$url .= ':' . (string) $parts['port'];
}
if ( isset( $parts['query'] ) ) {
$url .= '?' . (string) $parts['query'];
}
if ( isset( $parts['fragment'] ) ) {
$url .= '#' . (string) $parts['fragment'];
}
return $url;
}
}