性价比最高的香港ASP、PHP主机提供商
做网站,就上凡科建站

WordPress 自动使用文章ID作为别名(slug)

Loading
1
Comodo SLL证书促销 - 免费ssl证书申请_ssl证书购买_ev ssl证书_https证书购买 - GDCA_数安时代

最近有朋友一直在问:我使用固定链接结构是 %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作为别名

将下面的代码添加到主题的 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' );
	}}

2013-10-19更新:添加文章类型判断,只对文章(post)生效,不会影响页面等其他类型

参考资料:

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

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

支付宝扫码打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者

关于 倡萌

一个疯狂的 WordPress 爱好者,喜欢折腾 WordPress 主题,分享 WordPress 资源。如果你也喜欢 WordPress,欢迎和我一起交流!

精彩推荐

WordPress为存档、文章等自定义侧边栏 Custom sidebars

WordPress为存档、文章等自定义侧边栏 Custom sidebars

WordPress 侧边栏广告小工具插件 Meks Easy Ads Widget

WordPress 侧边栏广告小工具插件 Meks Easy Ads Widget

15 条评论

  1. 你好,我看了这篇文章,很不错。如果是自定义文章类型呢?我实验了下把那段函数if($post_type==’post’)换成
    if($post_type==’mytype’),发现无法添加新文章在自定义类型中。请教哪里还需要改动一下吗?

  2. 可以把标签别名改为ID么 这样就不用翻译了 拼音了

  3. 如何更改最后一段代码,在发表文章时用所有已发布的文章数量加1做别名,这样就可以连续了,还有最后一段代码在编辑文章后别名会变成当前id
    谢谢

  4. 我原本是使用默认的连接“http://localhost/wordpress/?p=123”,如果改为 /%postname% 的话,就出现连接错误,服务器找不到的问题,请问怎么解决

  5. :wink: :wink: :wink:

    如果大家有使用 Advanced Custom Fields (超级字段)插件的话

    将if($post_type==’post’){

    修改为
    if(is_admin()&$post_type==’page’||is_admin()&$post_type==’acf’){}else{

    不然是无法保存字段的,我今天修改字段名时,保存后,我惊恐的发现,之前设置字段数据全部清空了。

    好险阿里云有备份。

    我的使用的 Advanced Custom Fields 4.3.8 版本, wordpress是3.9.2

  6. 理解了半天没有看到。如果我现在1545.html结尾的,是先修成为wp._hayyp.html,再改回ID?神啊。我要崩溃了。

  7. 按照你说的这个都做了,后台是postname,现在在后台发文章都是postid,但是用了你现在的这个后台插件,在前台发布文章就只能显示postname,感觉怪怪的。。

    • 通过WPUF插件前台发布的文章默认就是必须使用 postname,上面的代码只是应用于后台而已。如果你是管理员,在后台发布文章吧。如果是稿件,你总得审核一下,编辑一下在发布吧。

  8. 那如果填写了Slug,那么又怎么办?能不能自动检测,有就用Slug,没就用ID?

  9. 如何网站升级,需不需要重新操作一次?

发表评论