本文目錄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/