首页 » 电脑技术知识 » WordPress解决修改固定链接后301重定向到新链接

WordPress解决修改固定链接后301重定向到新链接

 

答曰网之前使用的WordPress固定链接样式是:/%category%/%postname%.html,用久之后发现每次都要给文章起个别名(slug),比较麻烦。所以最近就想把固定链接样式改成/%category%/%post_id%.html。这样的话就不用为起别名而烦恼了。

但是这问题也来了,固定链接改成/%category%/%post_id%.html后原先已经被搜索引擎收录的链接名全部变成了404页面,这样之前的收录全报废了,而且网站也会产生大量的死链,用户体验很不好。

解决的方法当然就是使用301重定向了,在网上搜了搜,很多都是介绍wp-permalinks-migration.1.0这个插件的,这个插件是由WordPress大学从Dean's Permalinks Migration修改过来的,但是很遗憾的是wp-permalinks-migration.1.0在本网站无法实现301重定向,设置后全站都出现了404页面,后来又查了查,说了这个插件很久不更新了,可能已经失效了。

无奈在网上找了很久也没有找到相关插件,那既然找不到就自己写一个呗!其实我的思路也很简单,大概分为以下几个步骤:

1、获取原链接/%category%/%postname%.html中的postname(也就是文章的别名slug)

2、根据文章别名slug,查询数据库从而获得所对应的文章;

3、获取文章当前的链接;

4、将原链接301重定向到当前链接;

大概就是这么几步,主要的代码如下:

add_action( 'template_redirect', 'postname_redirect' );
function postname_redirect() {

	// 如果不是404页面就什么都不做
	if ( ! is_404() ) {
		return FALSE;
	}
	global $wp_rewrite;
	if ( $wp_rewrite->permalink_structure === '/%category%/%postname%.html' ) {
		return FALSE;
	}

	global $wp;
	$request_slug = sanitize_text_field( $wp->request );
	$request_slug = strrchr($request_slug, '/');
	$request_slug = substr($request_slug,1,-5);
    $amp_enabled = FALSE;
	if ( strpos( $request_slug, '/amp' ) !== FALSE ) {
		$request_slug = str_replace( '/amp', '', $request_slug );
		$amp_enabled  = TRUE;
	}

	if ( strpos( $request_slug, '/' ) !== FALSE ) {
		return FALSE;
	}

	// 通过slug找到对应文章
	$posts = get_posts( array( 'name' => $request_slug, 'post_type' => 'post', 'post_status' => 'publish' ) );

	if ( ! empty( $posts[0] ) ) {

		if ( function_exists( 'icl_object_id' ) ) {
			$permalink = get_permalink( icl_object_id( $posts[0]->ID ) );
		} else {
			$permalink = get_permalink( $posts[0]->ID );
		}

		// 重定向到当前链接
		if ( ! empty( $permalink ) ) {
			if ( $amp_enabled ) {
				$permalink .= '/amp';
			}
			wp_redirect( $permalink, 301 );
			exit; // We're done here.
		}
	}

}

将以上代码复制粘贴到functions.php文件中就可以了,注意上面的代码只适用于原固定链接样式为/%category%/%postname%.html的链接,如果原来不是这样的,那就需要修改其中的字符串截取语句。

大概解释下上面代码的意思:
$request_slug = sanitize_text_field( $wp->request );//获取输入的链接url,以本站为例应该得到的是/category/postname.html

$request_slug = strrchr($request_slug, '/');//截取最后一个"/"以及后面的字符串,得的的是/postname.html

$request_slug = substr($request_slug,1,-5);//截取除第1个和倒数5个的字符串,得到的是postname

接下来就是通过这个postname(slug)来获得对应文章信息。

原文链接:WordPress解决修改固定链接后301重定向到新链接,转载请注明来源!

5