固定链接中的撇号导致找不到页面

时间:2014-05-16 作者:TomHarrigan

我正在从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页面的现有链接。为什么链接包含撇号时不起作用?

1 个回复
最合适的回答,由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应该可以工作。

结束

相关推荐

Custom permalinks structure

我希望有这样的结构:www.mysite.com/2013 (必须显示2013年的所有职位)www.mysite.com/my-category/2013 (必须显示2013年和“我的类别”类别的所有帖子)www.mysite.com/my-category/my-tag/ (必须显示所有类别为“我的类别”和标记为“我的标记”的帖子)www.mysite.com/my-category/ (必须显示“我的类别”类别的所有帖子)www.mysite.com/my-