WordPress plugin 加強網址 SEO

由於網站 SEO 在大家心中都是非常重要,現在製作網站也都考慮了很多 SEO 的問題,其中一個功能就是可不可以自訂網址,Wordpress 很早之前就支援了此功能,站長我呢,在創站的時候使用 blog.wu-boy.com/2011/02/17/2542,為了使搜尋引擎更可以快速找到本站,所以打算將網址改成 blog.wu-boy.com/2011/02/php-codeigniter-google-url-shortener-api-library/,在後台 Permalink Settings 可以自訂部落格網址,將網址格式改成 /%year%/%monthnum%/%postname%/,可是改了之後,之前搜尋引擎及別人引用的網址就會變成 404 NOT Found,為瞭解決此問題,必須寫一支 Mapping Url 程式,讓之前的舊網址轉到新網址,剛好在 Roga Blog 找到一篇 加強部落格的 SEO,提供了轉換的 plugin,底下是該程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
/*
Plugin Name: roga's url hotfix
Plugin URI: http://blog.roga.tw/2011/02/%E5%8A%A0%E5%BC%B7%E9%83%A8%E8%90%BD%E6%A0%BC%E7%9A%84-seo/
Description: redirect http requests.
Version: 0.1
Author: roga
Author URI: http://blog.roga.tw
License: GPL v2
*/

function roga_wrap()
{
	GLOBAL $wpdb;
	$request_uri = getenv('REQUEST_URI');

	$array = explode('/', $request_uri);

	$status = TRUE;

	foreach($array as $row)
	{
		if( ! is_numeric($row) && ! empty($row)) $status = FALSE;
	}

	if(count($array) != 5 || $status != TRUE)
		return NULL;

	$post_id = (int) $array[4]; // http://blog.roga.tw/2011/02/16/2484

	$wp_result = $wpdb->get_row("SELECT `post_type`, `post_name`, `post_date` FROM `$wpdb->posts` WHERE `ID` = $post_id ");

	if( ! isset($wp_result))
		return NULL;

	$post_type = $wp_result->post_type;
	$post_name = $wp_result->post_name;
	$post_date = $wp_result->post_date;

	if($post_type == 'revision')
		return NULL;

	$time = strtotime($post_date);
	$year = date('Y', $time);
	$month = date('m', $time);
	//  old:   /%year%/%monthnum%/%day%/%post_id%
	//  new:   /%year%/%monthnum%/%postname%/
	$new_request_uri = "/$year/$month/$post_name";
	$http_host = getenv('HTTP_HOST');

	$logfile = WP_CONTENT_DIR . "/cache/wp-roga-redirect.log";
	if(file_exists($logfile))
		file_put_contents($logfile, sprintf("[%s] %s -> %s / %s " . PHP_EOL, date_i18n("Y-m-d H:i:s"), $request_uri, urldecode($new_request_uri), getenv('HTTP_USER_AGENT')), FILE_APPEND);

	header("Status: 301 Moved Permanently");
	header("Location: http:/$http_host$new_request_uri");
	exit();
}

add_action('init', 'roga_wrap');

Roga 的作法相當容易,先去 parse 原先的 url,比如說本來是 blog.wu-boy.com/2011/02/17/2542,程式先把 2011/02/17/2542 取出,在利用 array 取得 2542 這個唯一 POST ID,接下來去資料庫找尋該筆資料,把 postname 取出在轉換 Url 即可用 301 Moved Permanently 告訴搜尋引擎改網址。 在程式最前面發現一個小 bug,今天我們 parse blog.wu-boy.com/2011/02/17/2542 沒問題,假如是此網址呢 blog.wu-boy.com/2011/02/17/2542/ 你會發現 WordPress 馬上吐出 404 Not Found 錯誤訊息,原因就是出在 array 的取法,所以我修改了程式,patch 檔如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
--- url2.php	2011-02-21 11:19:56.000000000 +0800
+++ url.php	2011-02-21 11:20:35.000000000 +0800
@@ -12,8 +12,7 @@
 function roga_wrap()
 {
 	GLOBAL $wpdb;
-	$request_uri = getenv('REQUEST_URI');
-
+	$request_uri = trim(getenv('REQUEST_URI'), '/');
 	$array = explode('/', $request_uri);
 
 	$status = TRUE;
@@ -23,10 +22,9 @@
 		if( ! is_numeric($row) && ! empty($row)) $status = FALSE;
 	}
 
-	if(count($array) != 5 || $status != TRUE)
+	if(count($array) != 4 || $status != TRUE)
 		return NULL;
-
-	$post_id = (int) $array[4]; // http://blog.roga.tw/2011/02/16/2484
+	$post_id = (int) $array[3]; // http://blog.roga.tw/2011/02/16/2484
 
 	$wp_result = $wpdb->get_row("SELECT `post_type`, `post_name`, `post_date` FROM `$wpdb->posts` WHERE `ID` = $post_id ");
 
@@ -51,11 +49,10 @@
 	$logfile = WP_CONTENT_DIR . "/cache/wp-roga-redirect.log";
 	if(file_exists($logfile))
 		file_put_contents($logfile, sprintf("[%s] %s -> %s / %s " . PHP_EOL, date_i18n("Y-m-d H:i:s"), $request_uri, urldecode($new_request_uri), getenv('HTTP_USER_AGENT')), FILE_APPEND);
-
+		
 	header("Status: 301 Moved Permanently");
-	header("Location: http:/$http_host$new_request_uri");
+	header("Location: http://$http_host$new_request_uri");
 	exit();
 }

See also