+ * Removes arguments from a query string if they are not present in a URL
+ * DO NOT use this in plugin code.
+ *
+ * @since 3.4.0
+ * @access private
+ *
+ * @param string $query_string
+ * @param array $args_to_check
+ * @param string $url
+ * @return string The altered query string
+ */
+function _remove_qs_args_if_not_in_url( $query_string, Array $args_to_check, $url ) {
+ $parsed_url = @parse_url( $url );
+ if ( ! empty( $parsed_url['query'] ) ) {
+ parse_str( $parsed_url['query'], $parsed_query );
+ foreach ( $args_to_check as $qv ) {
+ if ( !isset( $parsed_query[$qv] ) )
+ $query_string = remove_query_arg( $qv, $query_string );
+ }
+ } else {
+ $query_string = remove_query_arg( $args_to_check, $query_string );
+ }
+ return $query_string;
+}
+
+/**
+ * Strips the #fragment from a URL, if one is present.
+ *
+ * @since 4.4.0
+ *
+ * @param string $url The URL to strip.
+ * @return string The altered URL.
+ */
+function strip_fragment_from_url( $url ) {
+ $parsed_url = @parse_url( $url );
+ if ( ! empty( $parsed_url['host'] ) ) {
+ // This mirrors code in redirect_canonical(). It does not handle every case.
+ $url = $parsed_url['scheme'] . '://' . $parsed_url['host'];
+ if ( ! empty( $parsed_url['port'] ) ) {
+ $url .= ':' . $parsed_url['port'];
+ }
+ $url .= $parsed_url['path'];
+ if ( ! empty( $parsed_url['query'] ) ) {
+ $url .= '?' . $parsed_url['query'];
+ }
+ }
+
+ return $url;
+}
+
+/**
+ * Attempts to guess the correct URL based on query vars