我想你的问题是esc_url() 函数,用于清理wp核心中使用的大量URL。
如果查看中的函数定义formatting.php 您将看到第2627行中的正则表达式正在过滤掉[
和]
.
但幸运的是,您还可以看到,在第2656行中提供了一个过滤器,允许您覆盖此行为。因此,您可以通过将自定义函数附加到clean_url
滤器
**
EDIT2 **
重定向URL似乎在另一个函数中被清除。幸运的是,这是一个pluggable function, 所以我们可以覆盖它。我编辑了代码以考虑到这一点。您可以通过创建mu-plugins
文件夹中的文件夹wp-content
文件夹并放置一个PHP文件(我将其命名为我的fix_ipv6_siteurl.php
) 在该文件夹中。
<?php
add_filter(\'clean_url\', \'wpse_120978_custom_esc_url\', 10, 3);
function wpse_120978_custom_esc_url( $url, $original_url, $_context ) {
if( !strpos($original_url, \'[\') ) {
return $url;
}
$url = $original_url;
if ( \'\' == $url )
return $url;
$url = preg_replace(\'|[^a-z0-9-[]~+_.?#=!&;,/:%@$\\|*\\\'()\\\\x80-\\\\xff]|i\', \'\', $url);
$strip = array(\'%0d\', \'%0a\', \'%0D\', \'%0A\');
$url = _deep_replace($strip, $url);
$url = str_replace(\';//\', \'://\', $url);
/* If the URL doesn\'t appear to contain a scheme, we
* presume it needs http:// appended (unless a relative
* link starting with / or a php file).
*/
if ( strpos($url, \':\') === false &&
substr( $url, 0, 1 ) != \'/\' && substr( $url, 0, 1 ) != \'#\' && !preg_match(\'/^[a-z0-9-]+?\\.php/i\', $url) )
$url = \'http://\' . $url;
// Replace ampersands and single quotes only when displaying.
if ( \'display\' == $_context ) {
$url = wp_kses_normalize_entities( $url );
$url = str_replace( \'&\', \'&\', $url );
$url = str_replace( "\'", \''\', $url );
}
if ( !is_array($protocols) )
$protocols = array (\'http\', \'https\', \'ftp\', \'ftps\', \'mailto\', \'news\', \'irc\', \'gopher\', \'nntp\', \'feed\', \'telnet\', \'mms\', \'rtsp\', \'svn\');
if ( wp_kses_bad_protocol( $url, $protocols ) != $url )
return \'\';
return $url;
}
if ( !function_exists(\'wp_sanitize_redirect\') ) :
/**
* Sanitizes a URL for use in a redirect.
*
* @since 2.3
*
* @return string redirect-sanitized URL
**/
function wp_sanitize_redirect($location) {
$location = preg_replace(\'|[^a-z0-9-[]~+_.?#=&;,/:%!]|i\', \'\', $location);
$location = wp_kses_no_null($location);
// remove %0d and %0a from location
$strip = array(\'%0d\', \'%0a\', \'%0D\', \'%0A\');
$location = _deep_replace($strip, $location);
return $location;
}
endif;
(可以删除functions.php中以前的代码。)