我正在从Drupal迁移到WP多站点网络,我有一个帖子元字段,其中包含我用于permalink结构的旧帖子的URL(主要用于维护社交统计等)。我这样做的原因如下:
add_filter(\'post_link\', \'migration_permalinks\', 10, 3 );
function migration_permalinks( $permalink, $post, $leavename ) {
if( ($post->post_type == \'post\' ) && ( $the_link = get_post_meta( $post->ID, \'_the_old_site_permalink\', true) ) ) {
$url = parse_url( $the_link );
$permalink = site_url() . $url[\'path\'];
}
return $permalink;
}
我遇到的问题是,如果帖子标题包含撇号,
’
(不是直接的单引号
\'
), 帖子URL无效。编码,转换为
%E2%80%99
. 在浏览器地址栏中,如果我将撇号更改为直接的单引号,则URL将正常工作,并显示帖子。现有的Drupal站点包含撇号(
%E2%80%99
) 没有问题。
按原样维护URL是非常重要的,因为我不希望在迁移发生时有任何指向404页面的现有链接。为什么链接包含撇号时不起作用?
最合适的回答,由SO网友:gmazzap 整理而成
我想你的问题是,当在url中使用撇号时,WordPress重写规则会识别包含撇号的帖子名称。
您可以使用print_r( $wp_query->query );
.
如果我的猜测正确,“name”查询参数包含%E2%80%99
, 因此,WP将在db中查找其slug包含编码撇号的post,但(默认情况下)保存前的post slug将使用sanitize_title
所以%E2%80%99
已剥离,但找不到帖子。
您可以强制WP保存%E2%80%99
在鼻涕虫中,但我担心它会先在你脸上爆炸,因为WordPress总是希望鼻涕虫经过消毒。
如果维护url很重要,可以在上使用筛选器\'parse_query\'
到sanitize_title
“name”查询变量:
add_action( \'parse_query\', function( WP_Query $query ) {
if ( ( $name = $query->get(\'name\') ) ) {
$query->set( \'name\', sanitize_title($name) );
}
} );
然后,带撇号的url应该可以工作。