当前位置:首页>WordPress建站>基础教程>WordPress 自动使用文章ID作为别名(slug)

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

WordPress 主题 CoreNext

最近有朋友一直在问:我使用固定链接结构是 %post_id% (ID),但是 WP User Frontend 这个前端用户中心插件要求必须设置为 %postname% (slug)才能使用,我不想改变以前的文章链接地址,该怎么办?

本文就是解决这个问题的,让 WordPress 自动使用文章ID作为别名(slug),也就是说,即使你设置为 %postname% 结构,仍旧可以自动生成 ID 结构的链接。或许你会说,修改固定链接结构后,原来的那些文章的链接变化了,怎么办?不用担心,照样可以解决!进入正题!

为了安全起见,请先备份网站的数据库,然后再按照下文操作!

更改固定链接结构

假设你原来的固定链接结构设置为 /%post_id%,现在你可以将它改为 /%postname% ,这时候你会发现,新建文章和老文章都使用文章标题作为别名

批量修改老文章的别名为ID

将下面的代码添加到网站根目录的 wp-config.php 的最底部,保存后访问一次网站首页(你将看到浏览器一直都在努力打开网页,不要急,耐心等待,直到网页真正打开,所需时间看文章数和网络情况而定)。网页打开后,删除刚刚添加到 wp-config.php 的代码!

/**
 * 批量更改旧文章的别名为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作为别名

/**
 * 新文章自动使用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/

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
欢迎关注WordPress大学公众号 WPDAXUE
基础教程

让 WordPress 只搜索文章的标题

2013-9-18 9:42:18

基础教程

WordPress 添加自定义文章类型的存档页面到菜单

2013-9-26 7:52:00

15 条回复 A文章作者 M管理员
  1. leon

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

    • 倡萌

      不好意思,没时间测试了

  2. 哈喽沃德

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

  3. z4127

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

  4. jewel

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

  5. 骆小驼

    😉 😉 😉

    如果大家有使用 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. xiaxiansheng

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

    • 倡萌

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

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

    • if ( !empty($post_name) || wp_is_post_revision($post_id) )

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

    • 不需要

  10. 哈~这篇文章很用心呢~

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索