WordPress 自動使用文章ID作為別名(slug)

本文目錄1更改固定鏈接結構2批量修改老文章的別名為ID3新文章自動使用ID作為別名

最近有朋友一直在問:我使用固定鏈接結構是 %post_id% (ID),但是 WP User Frontend 這個前端用戶中心外掛要求必須設置為 %postname% (slug)才能使用,我不想改變以前的文章鏈接地址,該怎麼辦?

本文就是解決這個問題的,讓 WordPress 自動使用文章ID作為別名(slug),也就是說,即使你設置為 %postname% 結構,仍舊可以自動生成 ID 結構的鏈接。或許你會說,修改固定鏈接結構後,原來的那些文章的鏈接變化瞭,怎麼辦?不用擔心,照樣可以解決!進入正題!

為瞭安全起見,請先備份網站的數據庫,然後再按照下文操作!

更改固定鏈接結構

假設你原來的固定鏈接結構設置為 /%post_id%,現在你可以將它改為 /%postname% ,這時候你會發現,新建文章和老文章都使用文章標題作為別名

批量修改老文章的別名為ID

將下面的代碼添加到網站根目錄的 wp-config.php 的最底部,保存後訪問一次網站首頁(你將看到瀏覽器一直都在努力打開網頁,不要急,耐心等待,直到網頁真正打開,所需時間看文章數和網絡情況而定)。網頁打開後,刪除剛剛添加到 wp-config.php 的代碼!

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
/**
 * 批量更改舊文章的別名為ID
 * 使用方法:將代碼添加到網站根目錄的 wp-config.php 的最底部,訪問一次網站首頁,等頁面打開後,再刪除這些代碼
 * https://www.wpdaxue.com/wordpress-using-post-id-as-slug.html
 */
// 添加一個變量來包容文章標題數組,防止重復操作
$slug_done = array();
// 查詢所有文章
$posts = $wpdb->get_results( "
	SELECT
	`ID`,
	`post_title`
	FROM
	`" . $wpdb->posts . "`
	WHERE
	`post_type` = 'post'
	" );
// 輸出文章
foreach( $posts AS $single ) {
	$this_slug = $single->ID;
	$slug_done[] = $this_slug;
    //  使用文章ID替換文章原來的別名
	$wpdb->query( "
		UPDATE
		`" . $wpdb->posts . "`
		SET
		`post_name` = '" . $this_slug . "'
		WHERE
		`ID` = '" . $single->ID . "'
		LIMIT 1
		" );
}

/**
* 批量更改舊文章的別名為ID
* 使用方法:將代碼添加到網站根目錄的 wp-config.php 的最底部,訪問一次網站首頁,等頁面打開後,再刪除這些代碼
* https://www.wpdaxue.com/wordpress-using-post-id-as-slug.html
*/
// 添加一個變量來包容文章標題數組,防止重復操作
$slug_done = array();
// 查詢所有文章
$posts = $wpdb->get_results( "
SELECT
`ID`,
`post_title`
FROM
`" . $wpdb->posts . "`
WHERE
`post_type` = ‘post’
" );
// 輸出文章
foreach( $posts AS $single ) {
$this_slug = $single->ID;
$slug_done[] = $this_slug;
// 使用文章ID替換文章原來的別名
$wpdb->query( "
UPDATE
`" . $wpdb->posts . "`
SET
`post_name` = ‘" . $this_slug . "’
WHERE
`ID` = ‘" . $single->ID . "’
LIMIT 1
" );
}

新文章自動使用ID作為別名

將下面的代碼添加到主題的 functions.php ,新建的文章都會自動使用ID作為別名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * 新文章自動使用ID作為別名
 * 作用:即使你設置固定連接結構為 %postname% ,仍舊自動生成 ID 結構的鏈接
 * https://www.wpdaxue.com/wordpress-using-post-id-as-slug.html
 */
add_action( 'save_post', 'using_id_as_slug', 10, 2 );
function using_id_as_slug($post_id, $post){
	global $post_type;	if($post_type=='post'){ //隻對文章生效		// 如果是文章的版本,不生效
		if (wp_is_post_revision($post_id))
			return false;
		// 取消掛載該函數,防止無限循環
		remove_action('save_post', 'using_id_as_slug' );
		// 使用文章ID作為文章的別名
		wp_update_post(array('ID' => $post_id, 'post_name' => $post_id ));
		// 重新掛載該函數
		add_action('save_post', 'using_id_as_slug' );
	}}

/**
* 新文章自動使用ID作為別名
* 作用:即使你設置固定連接結構為 %postname% ,仍舊自動生成 ID 結構的鏈接
* https://www.wpdaxue.com/wordpress-using-post-id-as-slug.html
*/
add_action( ‘save_post’, ‘using_id_as_slug’, 10, 2 );
function using_id_as_slug($post_id, $post){
global $post_type;
if($post_type==’post’){ //隻對文章生效
// 如果是文章的版本,不生效
if (wp_is_post_revision($post_id))
return false;
// 取消掛載該函數,防止無限循環
remove_action(‘save_post’, ‘using_id_as_slug’ );
// 使用文章ID作為文章的別名
wp_update_post(array(‘ID’ => $post_id, ‘post_name’ => $post_id ));
// 重新掛載該函數
add_action(‘save_post’, ‘using_id_as_slug’ );
}
}

2013-10-19更新:添加文章類型判斷,隻對文章(post)生效,不會影響頁面等其他類型

參考資料:

http://www.ryankessen.com/50/how-to-mass-change-article-slug-urls-in-wordpress/

http://wordpress.stackexchange.com/questions/51363/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *