最近有朋友一直在問:我使用固定鏈接結(jié)構(gòu)是 %post_id% (ID),但是 WP User Frontend 這個(gè)前端用戶中心插件要求必須設(shè)置為 %postname% (slug)才能使用,我不想改變以前的文章鏈接地址,該怎么辦?
本文就是解決這個(gè)問題的,讓 WordPress 自動(dòng)使用文章ID作為別名(slug),也就是說,即使你設(shè)置為 %postname% 結(jié)構(gòu),仍舊可以自動(dòng)生成 ID 結(jié)構(gòu)的鏈接。或許你會(huì)說,修改固定鏈接結(jié)構(gòu)后,原來的那些文章的鏈接變化了,怎么辦?不用擔(dān)心,照樣可以解決!進(jìn)入正題!
為了安全起見,請(qǐng)先備份網(wǎng)站的數(shù)據(jù)庫(kù),然后再按照下文操作!
更改固定鏈接結(jié)構(gòu)
假設(shè)你原來的固定鏈接結(jié)構(gòu)設(shè)置為 /%post_id%,現(xiàn)在你可以將它改為 /%postname% ,這時(shí)候你會(huì)發(fā)現(xiàn),新建文章和老文章都使用文章標(biāo)題作為別名
批量修改老文章的別名為ID
將下面的代碼添加到網(wǎng)站根目錄的 wp-config.php 的最底部,保存后訪問一次網(wǎng)站首頁(yè)(你將看到瀏覽器一直都在努力打開網(wǎng)頁(yè),不要急,耐心等待,直到網(wǎng)頁(yè)真正打開,所需時(shí)間看文章數(shù)和網(wǎng)絡(luò)情況而定)。網(wǎng)頁(yè)打開后,刪除剛剛添加到 wp-config.php 的代碼!
/**
* 批量更改舊文章的別名為ID
* 使用方法:將代碼添加到網(wǎng)站根目錄的 wp-config.php 的最底部,訪問一次網(wǎng)站首頁(yè),等頁(yè)面打開后,再刪除這些代碼
* http://www.ydqwiac.cn/wordpress-using-post-id-as-slug.html
*/
// 添加一個(gè)變量來包容文章標(biāo)題數(shù)組,防止重復(fù)操作
$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
" );
}
新文章自動(dòng)使用ID作為別名
將下面的代碼添加到主題的 functions.php ,新建的文章都會(huì)自動(dòng)使用ID作為別名
/**
* 新文章自動(dòng)使用ID作為別名
* 作用:即使你設(shè)置固定連接結(jié)構(gòu)為 %postname% ,仍舊自動(dòng)生成 ID 結(jié)構(gòu)的鏈接
* http://www.ydqwiac.cn/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'){ //只對(duì)文章生效
// 如果是文章的版本,不生效
if (wp_is_post_revision($post_id))
return false;
// 取消掛載該函數(shù),防止無限循環(huán)
remove_action('save_post', 'using_id_as_slug' );
// 使用文章ID作為文章的別名
wp_update_post(array('ID' => $post_id, 'post_name' => $post_id ));
// 重新掛載該函數(shù)
add_action('save_post', 'using_id_as_slug' );
}
}
2013-10-19更新:添加文章類型判斷,只對(duì)文章(post)生效,不會(huì)影響頁(yè)面等其他類型
參考資料:
http://www.ryankessen.com/50/how-to-mass-change-article-slug-urls-in-wordpress/
http://wordpress.stackexchange.com/questions/51363/





你好,我看了這篇文章,很不錯(cuò)。如果是自定義文章類型呢?我實(shí)驗(yàn)了下把那段函數(shù)if($post_type==’post’)換成
if($post_type==’mytype’),發(fā)現(xiàn)無法添加新文章在自定義類型中。請(qǐng)教哪里還需要改動(dòng)一下嗎?
不好意思,沒時(shí)間測(cè)試了
可以把標(biāo)簽別名改為ID么 這樣就不用翻譯了 拼音了
如何更改最后一段代碼,在發(fā)表文章時(shí)用所有已發(fā)布的文章數(shù)量加1做別名,這樣就可以連續(xù)了,還有最后一段代碼在編輯文章后別名會(huì)變成當(dāng)前id
謝謝
我原本是使用默認(rèn)的連接“http://localhost/wordpress/?p=123”,如果改為 /%postname% 的話,就出現(xiàn)連接錯(cuò)誤,服務(wù)器找不到的問題,請(qǐng)問怎么解決
應(yīng)該是你的主機(jī)不支持偽靜態(tài),自己看下 http://www.ydqwiac.cn/wordpress-rewriterule.html
如果不能解決,請(qǐng)聯(lián)系你的主機(jī)商求幫助
?? ?? ??
如果大家有使用 Advanced Custom Fields (超級(jí)字段)插件的話
將if($post_type==’post’){
修改為
if(is_admin()&$post_type==’page’||is_admin()&$post_type==’acf’){}else{
不然是無法保存字段的,我今天修改字段名時(shí),保存后,我驚恐的發(fā)現(xiàn),之前設(shè)置字段數(shù)據(jù)全部清空了。
好險(xiǎn)阿里云有備份。
我的使用的 Advanced Custom Fields 4.3.8 版本, wordpress是3.9.2
理解了半天沒有看到。如果我現(xiàn)在1545.html結(jié)尾的,是先修成為wp._hayyp.html,再改回ID?神啊。我要崩潰了。
按照你說的這個(gè)都做了,后臺(tái)是postname,現(xiàn)在在后臺(tái)發(fā)文章都是postid,但是用了你現(xiàn)在的這個(gè)后臺(tái)插件,在前臺(tái)發(fā)布文章就只能顯示postname,感覺怪怪的。。
通過WPUF插件前臺(tái)發(fā)布的文章默認(rèn)就是必須使用 postname,上面的代碼只是應(yīng)用于后臺(tái)而已。如果你是管理員,在后臺(tái)發(fā)布文章吧。如果是稿件,你總得審核一下,編輯一下在發(fā)布吧。
那如果填寫了Slug,那么又怎么辦?能不能自動(dòng)檢測(cè),有就用Slug,沒就用ID?
if ( !empty($post_name) || wp_is_post_revision($post_id) )
如何網(wǎng)站升級(jí),需不需要重新操作一次?
不需要
哈~這篇文章很用心呢~