00JQ @0JQ P0JQ `0JQ p0JQ 0JQ 0JQ IQ 0JQ 0JQ 0JQ 0JQ 0JQ 1JQ 1JQ 1JQ 01JQ @1JQ P1JQ `1JQ p1JQ 1JQ 1JQ 1JQ 1JQ 1JQ 1JQ 1JQ 1JQ 2JQ 2JQ 2JQ 02JQ @2JQ P2JQ `2JQ p2JQ 2JQ 2JQ 2JQ 2JQ 2JQ 2JQ 2JQ JQ 3JQ 3JQ 3JQ 03JQ @3JQ P3JQ `3JQ p3JQ 3JQ 3JQ 3JQ 3JQ 3JQ 3JQ 3JQ 3JQ 4JQ 4JQ 4JQ 04JQ @4JQ P4JQ `4JQ p4JQ 4JQ 4JQ JQ 4JQ 4JQ 4JQ 4JQ 4JQ 5JQ 5JQ 5JQ 05JQ @5JQ P5JQ `5JQ p5JQ 5JQ 5JQ 5JQ ` JQ 5JQ 5JQ 5JQ JQ 6JQ 6JQ 6JQ 06JQ @6JQ P6JQ `6JQ p6JQ 6JQ 6JQ 6JQ 6JQ 6JQ 6JQ 6JQ 6JQ 7JQ 7JQ 7JQ 07JQ JQ P7JQ `7JQ p7JQ 7JQ 7JQ 7JQ 7JQ 7JQ 7JQ 7JQ 7JQ 8JQ 8JQ 8JQ 08JQ @8JQ P8JQ [JQ p8JQ 8JQ 8JQ 8JQ 8JQ 8JQ 8JQ 8JQ 8JQ 9JQ 9JQ 9JQ 09JQ @9JQ P9JQ JQ p9JQ 9JQ 9JQ 9JQ 9JQ 9JQ 9JQ 9JQ 9JQ :JQ :JQ :JQ 0:JQ @:JQ P:JQ `:JQ pJQ :JQ JQ :JQ @ JQ :JQ :JQ :JQ :JQ ;JQ ;JQ ;JQ 0;JQ @;JQ P;JQ `;JQ p;JQ ;JQ ;JQ ;JQ ;JQ ;JQ ;JQ ;JQ IQ <JQ <JQ <JQ JQ @<JQ P<JQ `<JQ p<JQ <JQ <JQ <JQ <JQ <JQ <JQ <JQ <JQ =JQ =JQ =JQ 0=JQ @=JQ P=JQ `=JQ p=JQ =JQ =JQ =JQ =JQ =JQ =JQ =JQ =JQ >JQ >JQ >JQ 0>JQ @>JQ P>JQ JQ p>JQ >JQ >JQ >JQ >JQ >JQ >JQ >JQ >JQ ?JQ ?JQ ?JQ 0?JQ @?JQ P?JQ `?JQ p?JQ ?JQ pQJQ JQ ?JQ ?JQ ?JQ ?JQ ?JQ @JQ @JQ @JQ 0@JQ @@JQ P@JQ `@JQ p@JQ @JQ @JQ @JQ @JQ @JQ @JQ @JQ @JQ AJQ JQ AJQ 0AJQ @AJQ PAJQ `AJQ pAJQ AJQ AJQ AJQ AJQ AJQ AJQ AJQ AJQ BJQ BJQ BJQ 0BJQ @BJQ PBJQ `BJQ pBJQ BJQ BJQ BJQ BJQ JQ BJQ JQ BJQ CJQ CJQ CJQ 0CJQ @CJQ PCJQ ` JQ pCJQ CJQ CJQ CJQ CJQ CJQ CJQ CJQ CJQ DJQ DJQ DJQ 0DJQ @DJQ PDJQ `DJQ pDJQ DJQ DJQ DJQ DJQ DJQ DJQ DJQ DJQ JQ EJQ EJQ 0EJQ @EJQ PEJQ JQ pEJQ EJQ EJQ EJQ EJQ EJQ EJQ EJQ EJQ FJQ FJQ FJQ 0FJQ @FJQ PFJQ `FJQ pFJQ FJQ FJQ FJQ FJQ FJQ FJQ FJQ FJQ GJQ GJQ GJQ 0GJQ IQ PGJQ `GJQ pGJQ GJQ GJQ GJQ GJQ GJQ GJQ GJQ GJQ HJQ HJQ HJQ 0HJQ @HJQ PHJQ `HJQ pHJQ HJQ HJQ HJQ HJQ HJQ HJQ HJQ HJQ IJQ IJQ IJQ 0IJQ @IJQ PIJQ `IJQ pIJQ IJQ IJQ IJQ IJQ IJQ IJQ IJQ IJQ JJQ JJQ JJQ 0JJQ @JJQ PJJQ `JJQ pJJQ JJQ JJQ JJQ JJQ JJQ JJQ JJQ JJQ KJQ KJQ KJQ 0KJQ @KJQ PKJQ `KJQ pKJQ KJQ KJQ KJQ KJQ KJQ KJQ KJQ KJQ LJQ JQ LJQ 0LJQ @LJQ PLJQ `LJQ pLJQ LJQ LJQ LJQ LJQ LJQ LJQ LJQ LJQ MJQ MJQ MJQ 0MJQ @MJQ PMJQ `MJQ pMJQ MJQ MJQ MJQ MJQ MJQ MJQ MJQ MJQ NJQ NJQ JQ 0NJQ @NJQ PNJQ `NJQ pNJQ NJQ NJQ NJQ NJQ NJQ NJQ NJQ NJQ OJQ JQ OJQ 0OJQ @OJQ POJQ `OJQ pOJQ OJQ OJQ OJQ OJQ OJQ OJQ OJQ OJQ PJQ PJQ PJQ ! \is_string( $url ) || $url === '' ) { return $url; } if ( $this->is_relative( $url ) === true ) { return $this->build_absolute_url( $url ); } return $url; } /** * Parse the home URL setting to find the base URL for relative URLs. * * @param string|null $path Optional path string. * * @return string */ public function build_absolute_url( $path = null ) { $path = \wp_parse_url( $path, \PHP_URL_PATH ); $url_parts = \wp_parse_url( \home_url() ); $base_url = \trailingslashit( $url_parts['scheme'] . '://' . $url_parts['host'] ); if ( ! \is_null( $path ) ) { $base_url .= \ltrim( $path, '/' ); } return $base_url; } /** * Returns the link type. * * @param array $url The URL, as parsed by wp_parse_url. * @param array|null $home_url Optional. The home URL, as parsed by wp_parse_url. Used to avoid reparsing the home_url. * @param bool $is_image Whether or not the link is an image. * * @return string The link type. */ public function get_link_type( $url, $home_url = null, $is_image = false ) { // If there is no scheme and no host the link is always internal. // Beware, checking just the scheme isn't enough as a link can be //yoast.com for instance. if ( empty( $url['scheme'] ) && empty( $url['host'] ) ) { return ( $is_image ) ? SEO_Links::TYPE_INTERNAL_IMAGE : SEO_Links::TYPE_INTERNAL; } // If there is a scheme but it's not http(s) then the link is always external. if ( \array_key_exists( 'scheme', $url ) && ! \in_array( $url['scheme'], [ 'http', 'https' ], true ) ) { return ( $is_image ) ? SEO_Links::TYPE_EXTERNAL_IMAGE : SEO_Links::TYPE_EXTERNAL; } if ( \is_null( $home_url ) ) { $home_url = \wp_parse_url( \home_url() ); } // When the base host is equal to the host. if ( isset( $url['host'] ) && $url['host'] !== $home_url['host'] ) { return ( $is_image ) ? SEO_Links::TYPE_EXTERNAL_IMAGE : SEO_Links::TYPE_EXTERNAL; } // There is no base path and thus all URLs of the same domain are internal. if ( empty( $home_url['path'] ) ) { return ( $is_image ) ? SEO_Links::TYPE_INTERNAL_IMAGE : SEO_Links::TYPE_INTERNAL; } // When there is a path and it matches the start of the url. if ( isset( $url['path'] ) && \strpos( $url['path'], $home_url['path'] ) === 0 ) { return ( $is_image ) ? SEO_Links::TYPE_INTERNAL_IMAGE : SEO_Links::TYPE_INTERNAL; } return ( $is_image ) ? SEO_Links::TYPE_EXTERNAL_IMAGE : SEO_Links::TYPE_EXTERNAL; } /** * Recreate current URL. * * @param bool $with_request_uri Whether we want the REQUEST_URI appended. * * @return string */ public function recreate_current_url( $with_request_uri = true ) { $current_url = 'http'; if ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] === 'on' ) { $current_url .= 's'; } $current_url .= '://'; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- We know this is scary. $suffix = ( $with_request_uri && isset( $_SERVER['REQUEST_URI'] ) ) ? $_SERVER['REQUEST_URI'] : ''; if ( isset( $_SERVER['SERVER_NAME'] ) && ! empty( $_SERVER['SERVER_NAME'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- We know this is scary. $server_name = $_SERVER['SERVER_NAME']; } else { // Early return with just the path. return $suffix; } $server_port = ''; if ( isset( $_SERVER['SERVER_PORT'] ) && $_SERVER['SERVER_PORT'] !== '80' && $_SERVER['SERVER_PORT'] !== '443' ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- We know this is scary. $server_port = $_SERVER['SERVER_PORT']; } if ( ! empty( $server_port ) ) { $current_url .= $server_name . ':' . $server_port . $suffix; } else { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput -- We know this is scary. $current_url .= $server_name . $suffix; } return $current_url; } /** * Parses a URL and returns its components, this wrapper function was created to support unit tests. * * @param string $parsed_url The URL to parse. * @return array The parsed components of the URL. */ public function parse_str_params( $parsed_url ) { $array = []; // @todo parse_str changes spaces in param names into `_`, we should find a better way to support them. \wp_parse_str( $parsed_url, $array ); return $array; } }