You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
3.9 KiB
PHTML
185 lines
3.9 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* The URL helpers.
|
||
|
*
|
||
|
* @since 1.0.0
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMath\Helpers
|
||
|
* @author RankMath <support@rankmath.com>
|
||
|
*/
|
||
|
|
||
|
namespace RankMath\Helpers;
|
||
|
|
||
|
use RankMath\Helpers\Str;
|
||
|
use RankMath\Helpers\Param;
|
||
|
|
||
|
/**
|
||
|
* Url class.
|
||
|
*/
|
||
|
class Url {
|
||
|
|
||
|
/**
|
||
|
* Simple check for validating a URL, it must start with http:// or https://.
|
||
|
* and pass FILTER_VALIDATE_URL validation.
|
||
|
*
|
||
|
* @param string $url to check.
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public static function is_url( $url ) {
|
||
|
if ( ! is_string( $url ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// Must start with http:// or https://.
|
||
|
if ( 0 !== strpos( $url, 'http://' ) && 0 !== strpos( $url, 'https://' ) && 0 !== strpos( $url, '//' ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// Check for scheme first, if it's missing then add it.
|
||
|
if ( 0 === strpos( $url, '//' ) ) {
|
||
|
$url = 'http:' . $url;
|
||
|
}
|
||
|
|
||
|
// Must pass validation.
|
||
|
return false !== filter_var( trailingslashit( $url ), FILTER_VALIDATE_URL ) ? true : false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check whether a url is relative.
|
||
|
*
|
||
|
* @param string $url URL string to check.
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public static function is_relative( $url ) {
|
||
|
return ( 0 !== strpos( $url, 'http' ) && 0 !== strpos( $url, '//' ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks whether a url is external.
|
||
|
*
|
||
|
* @param string $url URL string to check. This should be a absolute URL.
|
||
|
* @param string $domain If wants to use some other domain not home_url().
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public static function is_external( $url, $domain = false ) {
|
||
|
if ( empty( $url ) || '#' === $url[0] ) { // Link to current page.
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( self::is_affiliate( $url ) ) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
if ( '/' === $url[0] ) { // Link to current page or relative link.
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$domain = self::get_domain( $domain ? $domain : home_url() );
|
||
|
if ( Str::contains( $domain, $url ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks whether a link is an affiliate link.
|
||
|
*
|
||
|
* @param string $url URL string to check. This should be a absolute URL.
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public static function is_affiliate( $url ) {
|
||
|
if ( empty( $url ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filter: 'wp_helpers_is_affiliate_link' - Allows developer to consider a link as affiliate.
|
||
|
*
|
||
|
* @param bool $value Default false.
|
||
|
* @param string $url URL.
|
||
|
*/
|
||
|
return apply_filters( 'wp_helpers_is_affiliate_link', false, $url );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get current url.
|
||
|
*
|
||
|
* @codeCoverageIgnore
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public static function get_current_url() {
|
||
|
return self::get_scheme() . '://' . self::get_host() . self::get_port() . Param::server( 'REQUEST_URI' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get url scheme.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public static function get_scheme() {
|
||
|
return is_ssl() ? 'https' : 'http';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Some setups like HTTP_HOST, some like SERVER_NAME, it's complicated.
|
||
|
*
|
||
|
* @link http://stackoverflow.com/questions/2297403/http-host-vs-server-name
|
||
|
*
|
||
|
* @codeCoverageIgnore
|
||
|
*
|
||
|
* @return string the HTTP_HOST or SERVER_NAME
|
||
|
*/
|
||
|
public static function get_host() {
|
||
|
$host = Param::server( 'HTTP_HOST' );
|
||
|
if ( false !== $host ) {
|
||
|
return $host;
|
||
|
}
|
||
|
|
||
|
$name = Param::server( 'SERVER_NAME' );
|
||
|
if ( false !== $name ) {
|
||
|
return $name;
|
||
|
}
|
||
|
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get current request port.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public static function get_port() {
|
||
|
$port = Param::server( 'SERVER_PORT' );
|
||
|
$has_port = $port && ! in_array( $port, [ '80', '443' ], true );
|
||
|
return $has_port ? ':' . $port : '';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get parent domain
|
||
|
*
|
||
|
* @param string $url Url to parse.
|
||
|
*
|
||
|
* @return string
|
||
|
*/
|
||
|
public static function get_domain( $url ) {
|
||
|
$pieces = wp_parse_url( $url );
|
||
|
$domain = isset( $pieces['host'] ) ? $pieces['host'] : '';
|
||
|
|
||
|
if ( Str::contains( 'localhost', $domain ) ) {
|
||
|
return 'localhost';
|
||
|
}
|
||
|
|
||
|
if ( preg_match( '/(?P<domain>[a-zÀ-ž0-9][a-zÀ-ž0-9\-]{1,63}\.[a-zÀ-ž\.]{2,15})$/ui', $domain, $regs ) ) {
|
||
|
return $regs['domain'];
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
}
|